IGNITE-2641: Now "SELECT [alias].*" is possible. This closes #486.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/a2f66b98 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/a2f66b98 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/a2f66b98 Branch: refs/heads/ignite-2407 Commit: a2f66b986fdb1876c1aa0ece51d1d44b3934d262 Parents: 9cb175f Author: dkarachentsev <[email protected]> Authored: Wed Feb 17 16:47:44 2016 +0300 Committer: vozerov-gridgain <[email protected]> Committed: Wed Feb 17 16:47:44 2016 +0300 ---------------------------------------------------------------------- .../processors/query/h2/IgniteH2Indexing.java | 95 +++++++++++--------- .../h2/GridIndexingSpiAbstractSelfTest.java | 38 +++++++- 2 files changed, 91 insertions(+), 42 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/a2f66b98/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java index be72888..288c2b3 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java @@ -17,42 +17,6 @@ package org.apache.ignite.internal.processors.query.h2; -import java.io.Externalizable; -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.math.BigDecimal; -import java.sql.Connection; -import java.sql.Date; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.sql.Statement; -import java.sql.Time; -import java.sql.Timestamp; -import java.sql.Types; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import javax.cache.Cache; -import javax.cache.CacheException; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; @@ -151,6 +115,43 @@ import org.h2.value.ValueUuid; import org.jetbrains.annotations.Nullable; import org.jsr166.ConcurrentHashMap8; +import javax.cache.Cache; +import javax.cache.CacheException; +import java.io.Externalizable; +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.Date; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Time; +import java.sql.Timestamp; +import java.sql.Types; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + import static org.apache.ignite.IgniteSystemProperties.IGNITE_H2_DEBUG_CONSOLE; import static org.apache.ignite.IgniteSystemProperties.getString; import static org.apache.ignite.internal.processors.query.GridQueryIndexType.FULLTEXT; @@ -917,7 +918,6 @@ public class IgniteH2Indexing implements GridQueryIndexing { /** * Executes regular query. - * Note that SQL query can not refer to table alias, so use full table name instead. * * @param spaceName Space name. * @param qry Query. @@ -1112,16 +1112,29 @@ public class IgniteH2Indexing implements GridQueryIndexing { String from = " "; qry = qry.trim(); + String upper = qry.toUpperCase(); if (upper.startsWith("SELECT")) { qry = qry.substring(6).trim(); - if (!qry.startsWith("*")) - throw new IgniteCheckedException("Only queries starting with 'SELECT *' are supported or " + - "use SqlFieldsQuery instead: " + qry0); + final int star = qry.indexOf('*'); + + if (star == 0) + qry = qry.substring(1).trim(); + else if (star > 0) { + if (F.eq('.', qry.charAt(star - 1))) { + t = qry.substring(0, star - 1); + + qry = qry.substring(star + 1).trim(); + } + else + throw new IgniteCheckedException("Invalid query (missing alias before asterisk): " + qry0); + } + else + throw new IgniteCheckedException("Only queries starting with 'SELECT *' and 'SELECT alias.*' " + + "are supported (rewrite your query or use SqlFieldsQuery instead): " + qry0); - qry = qry.substring(1).trim(); upper = qry.toUpperCase(); } http://git-wip-us.apache.org/repos/asf/ignite/blob/a2f66b98/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java index dc572e2..0da71c8 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java @@ -25,7 +25,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.concurrent.Callable; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.configuration.CacheConfiguration; @@ -227,6 +226,25 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract assertFalse(spi.query(typeAB.space(), "select * from A.B", Collections.emptySet(), typeAB, null).hasNext()); assertFalse(spi.query(typeBA.space(), "select * from B.A", Collections.emptySet(), typeBA, null).hasNext()); + assertFalse(spi.query(typeBA.space(), "select * from B.A, A.B, A.A", + Collections.emptySet(), typeBA, null).hasNext()); + + try { + spi.query(typeBA.space(), "select aa.*, ab.*, ba.* from A.A aa, A.B ab, B.A ba", + Collections.emptySet(), typeBA, null).hasNext(); + + fail("Enumerations of aliases in select block must be prohibited"); + } + catch (IgniteCheckedException e) { + // all fine + } + + assertFalse(spi.query(typeAB.space(), "select ab.* from A.B ab", + Collections.emptySet(), typeAB, null).hasNext()); + + assertFalse(spi.query(typeBA.space(), "select ba.* from B.A as ba", + Collections.emptySet(), typeBA, null).hasNext()); + // Nothing to remove. spi.remove("A", key(1), aa(1, "", 10)); spi.remove("B", key(1), ba(1, "", 10, true)); @@ -287,6 +305,15 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract assertEquals(aa(2, "Valera", 19).value(null, false), value(res.next())); assertFalse(res.hasNext()); + res = spi.query(typeAA.space(), "select aa.* from a aa order by aa.age", + Collections.emptySet(), typeAA, null); + + assertTrue(res.hasNext()); + assertEquals(aa(3, "Borya", 18).value(null, false), value(res.next())); + assertTrue(res.hasNext()); + assertEquals(aa(2, "Valera", 19).value(null, false), value(res.next())); + assertFalse(res.hasNext()); + res = spi.query(typeAB.space(), "from b order by name", Collections.emptySet(), typeAB, null); assertTrue(res.hasNext()); @@ -295,6 +322,15 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract assertEquals(ab(4, "Vitalya", 20, "Very Good guy").value(null, false), value(res.next())); assertFalse(res.hasNext()); + res = spi.query(typeAB.space(), "select bb.* from b as bb order by bb.name", + Collections.emptySet(), typeAB, null); + + assertTrue(res.hasNext()); + assertEquals(ab(1, "Vasya", 20, "Some text about Vasya goes here.").value(null, false), value(res.next())); + assertTrue(res.hasNext()); + assertEquals(ab(4, "Vitalya", 20, "Very Good guy").value(null, false), value(res.next())); + assertFalse(res.hasNext()); + res = spi.query(typeBA.space(), "from a", Collections.emptySet(), typeBA, null); assertTrue(res.hasNext());
