You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2016/02/17 14:47:52 UTC
ignite git commit: IGNITE-2641: Now "SELECT [alias].*" is possible.
This closes #486.
Repository: ignite
Updated Branches:
refs/heads/master 9cb175fb6 -> a2f66b986
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/master
Commit: a2f66b986fdb1876c1aa0ece51d1d44b3934d262
Parents: 9cb175f
Author: dkarachentsev <dk...@gridgain.com>
Authored: Wed Feb 17 16:47:44 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
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());