You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by av...@apache.org on 2017/03/01 14:33:15 UTC

[32/50] [abbrv] ignite git commit: ignite-3860 - parsing fixed

ignite-3860 - parsing fixed


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/efb86680
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/efb86680
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/efb86680

Branch: refs/heads/master
Commit: efb866803e9831c86b1c4b1bab93cf12076c8a73
Parents: bf337bc
Author: Sergi Vladykin <se...@gmail.com>
Authored: Wed Feb 22 02:31:54 2017 +0300
Committer: Sergi Vladykin <se...@gmail.com>
Committed: Wed Feb 22 02:31:54 2017 +0300

----------------------------------------------------------------------
 .../query/h2/sql/GridSqlQueryParser.java        | 20 +++++++++-----
 .../query/h2/sql/GridQueryParsingTest.java      | 28 ++++++++++++++++++++
 2 files changed, 41 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/efb86680/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java
index f5ad397..024529c 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java
@@ -344,7 +344,7 @@ public class GridSqlQueryParser {
     /**
      * @param filter Filter.
      */
-    private GridSqlElement parseTable(TableFilter filter) {
+    private GridSqlElement parseTableFilter(TableFilter filter) {
         GridSqlElement res = (GridSqlElement)h2ObjToGridObj.get(filter);
 
         if (res == null) {
@@ -369,9 +369,15 @@ public class GridSqlQueryParser {
         GridSqlElement res = (GridSqlElement)h2ObjToGridObj.get(tbl);
 
         if (res == null) {
+            // We can't cache simple tables because otherwise it will be the same instance for all
+            // table filters. Thus we will not be able to distinguish one table filter from another.
+            // Table here is semantically equivalent to a table filter.
             if (tbl instanceof TableBase)
-                res = new GridSqlTable(tbl);
-            else if (tbl instanceof TableView) {
+                return new GridSqlTable(tbl);
+
+            // Other stuff can be cached because we will have separate instances in
+            // different table filters anyways. Thus the semantics will be correct.
+            if (tbl instanceof TableView) {
                 Query qry = VIEW_QUERY.get((TableView) tbl);
 
                 res = new GridSqlSubquery(parseQuery(qry));
@@ -438,7 +444,7 @@ public class GridSqlQueryParser {
 
         for (int i = 0; i < tableFilters.size(); i++) {
             TableFilter f = tableFilters.get(i);
-            GridSqlElement gridFilter = parseTable(f);
+            GridSqlElement gridFilter = parseTableFilter(f);
 
             from = from == null ? gridFilter : new GridSqlJoin(from, gridFilter, f.isJoinOuter(),
                 parseExpression(f.getJoinCondition(), false));
@@ -606,7 +612,7 @@ public class GridSqlQueryParser {
         res = new GridSqlDelete();
         h2ObjToGridObj.put(del, res);
 
-        GridSqlElement tbl = parseTable(DELETE_FROM.get(del));
+        GridSqlElement tbl = parseTableFilter(DELETE_FROM.get(del));
         GridSqlElement where = parseExpression(DELETE_WHERE.get(del), true);
         GridSqlElement limit = parseExpression(DELETE_LIMIT.get(del), true);
         res.from(tbl).where(where).limit(limit);
@@ -626,7 +632,7 @@ public class GridSqlQueryParser {
         res = new GridSqlUpdate();
         h2ObjToGridObj.put(update, res);
 
-        GridSqlElement tbl = parseTable(UPDATE_TARGET.get(update));
+        GridSqlElement tbl = parseTableFilter(UPDATE_TARGET.get(update));
 
         List<Column> srcCols = UPDATE_COLUMNS.get(update);
         Map<Column, Expression> srcSet = UPDATE_SET.get(update);
@@ -826,7 +832,7 @@ public class GridSqlQueryParser {
             ExpressionColumn expCol = (ExpressionColumn)expression;
 
             return new GridSqlColumn(expCol.getColumn(),
-                parseTable(expCol.getTableFilter()),
+                parseTableFilter(expCol.getTableFilter()),
                 SCHEMA_NAME.get(expCol),
                 expCol.getOriginalTableAliasName(),
                 expCol.getColumnName());

http://git-wip-us.apache.org/repos/asf/ignite/blob/efb86680/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java
index d3ff902..b869da9 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java
@@ -283,6 +283,34 @@ public class GridQueryParsingTest extends GridCommonAbstractTest {
         checkQuery("select sch.\"#\".* from Person \"#\"");
     }
 
+    /**
+     * Query AST transformation heavily depends on this behavior.
+     *
+     * @throws Exception If failed.
+     */
+    public void testParseTableFilter() throws Exception {
+        Prepared prepared = parse("select Person.old, p1.old from Person, Person p1");
+
+        GridSqlSelect select = (GridSqlSelect)new GridSqlQueryParser(false).parse(prepared);
+
+        GridSqlJoin join = (GridSqlJoin)select.from();
+
+        GridSqlTable tbl1 = (GridSqlTable)join.leftTable();
+        GridSqlAlias tbl2Alias = (GridSqlAlias)join.rightTable();
+        GridSqlTable tbl2 = tbl2Alias.child();
+
+        // Must be distinct objects, even if it is the same table.
+        assertNotSame(tbl1, tbl2);
+
+        GridSqlColumn col1 = (GridSqlColumn)select.column(0);
+        GridSqlColumn col2 = (GridSqlColumn)select.column(1);
+
+        assertSame(tbl1, col1.expressionInFrom());
+
+        // Alias in FROM must be included in column.
+        assertSame(tbl2Alias, col2.expressionInFrom());
+    }
+
     /** */
     public void testParseMerge() throws Exception {
         /* Plain rows w/functions, operators, defaults, and placeholders. */