You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ma...@apache.org on 2016/09/22 05:02:05 UTC

phoenix git commit: PHOENIX-2930 Cannot resolve columns aliased to its own name

Repository: phoenix
Updated Branches:
  refs/heads/master d4f720185 -> 2aa2d1f5b


PHOENIX-2930 Cannot resolve columns aliased to its own name


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

Branch: refs/heads/master
Commit: 2aa2d1f5b6cc3c2e71e73982bea58380f24d3f87
Parents: d4f7201
Author: maryannxue <ma...@gmail.com>
Authored: Wed Sep 21 17:43:07 2016 -0700
Committer: maryannxue <ma...@gmail.com>
Committed: Wed Sep 21 17:43:07 2016 -0700

----------------------------------------------------------------------
 .../apache/phoenix/end2end/GroupByCaseIT.java   | 36 ++++++++++++++++++++
 .../apache/phoenix/parse/ParseNodeRewriter.java | 16 +++++++--
 2 files changed, 49 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/2aa2d1f5/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java
index 4830a75..0acfe02 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java
@@ -31,6 +31,7 @@ import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Properties;
 
+import org.apache.phoenix.schema.AmbiguousColumnException;
 import org.apache.phoenix.schema.types.PChar;
 import org.apache.phoenix.schema.types.PInteger;
 import org.apache.phoenix.util.ByteUtil;
@@ -445,4 +446,39 @@ public class GroupByCaseIT extends ParallelStatsDisabledIT {
                 "    SERVER FILTER BY FIRST KEY ONLY\n" + 
                 "    SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [K1]", QueryUtil.getExplainPlan(rs));
     }
+    
+    @Test
+    public void testGroupByWithAliasWithSameColumnName() throws SQLException {
+        Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+        Connection conn = DriverManager.getConnection(getUrl(), props);
+        String ddl = "create table test3 (pk integer primary key, col integer)";
+        conn.createStatement().execute(ddl);
+        ddl = "create table test4 (pk integer primary key, col integer)";
+        conn.createStatement().execute(ddl);
+        ddl = "create table test5 (notPk integer primary key, col integer)";
+        conn.createStatement().execute(ddl);
+        conn.createStatement().execute("UPSERT INTO test3 VALUES (1,2)");
+        conn.createStatement().execute("UPSERT INTO test4 VALUES (1,2)");
+        conn.createStatement().execute("UPSERT INTO test5 VALUES (1,2)");
+        conn.createStatement().executeQuery("select test3.pk as pk from test3 group by pk");
+        conn.createStatement().executeQuery("select test3.pk as pk from test3 group by test3.pk");
+        conn.createStatement().executeQuery("select test3.pk as pk from test3 as t group by t.pk");
+        conn.createStatement().executeQuery("select test3.col as pk from test3");
+        conn.createStatement()
+                .executeQuery("select test3.pk as pk from test3 join test5 on (test3.pk=test5.notPk) group by pk");
+        try {
+            conn.createStatement().executeQuery("select test3.col as pk from test3 group by pk");
+            fail();
+        } catch (AmbiguousColumnException e) {}
+        try {
+            conn.createStatement().executeQuery("select col as pk from test3 group by pk");
+            fail();
+        } catch (AmbiguousColumnException e) {}
+        try {
+            conn.createStatement()
+                    .executeQuery("select test3.pk as pk from test3 join test4 on (test3.pk=test4.pk) group by pk");
+            fail();
+        } catch (AmbiguousColumnException e) {}
+        conn.close();
+    }
 }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/2aa2d1f5/phoenix-core/src/main/java/org/apache/phoenix/parse/ParseNodeRewriter.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/parse/ParseNodeRewriter.java b/phoenix-core/src/main/java/org/apache/phoenix/parse/ParseNodeRewriter.java
index 12ef2e1..7a31110 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/parse/ParseNodeRewriter.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/parse/ParseNodeRewriter.java
@@ -25,6 +25,7 @@ import java.util.Map;
 import org.apache.phoenix.compile.ColumnResolver;
 import org.apache.phoenix.schema.AmbiguousColumnException;
 import org.apache.phoenix.schema.ColumnNotFoundException;
+import org.apache.phoenix.schema.ColumnRef;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -400,14 +401,23 @@ public class ParseNodeRewriter extends TraverseAllParseNodeVisitor<ParseNode> {
             ParseNode aliasedNode = aliasMap.get(node.getName());
             // If we found something, then try to resolve it unless the two nodes are the same
             if (aliasedNode != null && !node.equals(aliasedNode)) {
+                ColumnRef ref;
                 try {
-                    // If we're able to resolve it, that means we have a conflict
-                    resolver.resolveColumn(node.getSchemaName(), node.getTableName(), node.getName());
-                    throw new AmbiguousColumnException(node.getName());
+                    ref = resolver.resolveColumn(node.getSchemaName(), node.getTableName(), node.getName());
                 } catch (ColumnNotFoundException e) {
                     // Not able to resolve alias as a column name as well, so we use the alias
                     return aliasedNode;
                 }
+                // We have resolved it to a column, so now check if the aliased node can be resolved as the same column
+                if (aliasedNode instanceof ColumnParseNode) {
+                    ColumnParseNode aliasedColumnNode = (ColumnParseNode) aliasedNode;
+                    ColumnRef aliasedRef = resolver.resolveColumn(aliasedColumnNode.getSchemaName(), aliasedColumnNode.getTableName(), aliasedColumnNode.getName());
+                    if (aliasedRef.equals(ref)) {
+                        return aliasedNode;
+                    }
+                }
+                // Otherwise it means we have a conflict
+                throw new AmbiguousColumnException(node.getName());
             }
         }
         return node;