This is an automated email from the ASF dual-hosted git repository.

larsh pushed a commit to branch 4.x
in repository https://gitbox.apache.org/repos/asf/phoenix.git


The following commit(s) were added to refs/heads/4.x by this push:
     new 9cfb638  PHOENIX-6423 Wildcard queries fail with mixed default and 
explicit column families.
9cfb638 is described below

commit 9cfb63819f85306a406efaea8b326fc080cc5196
Author: Lars <la...@apache.org>
AuthorDate: Sat Mar 20 13:19:14 2021 -0700

    PHOENIX-6423 Wildcard queries fail with mixed default and explicit column 
families.
---
 .../apache/phoenix/end2end/MultiCfQueryExecIT.java | 26 ++++++++++++++++++++++
 .../apache/phoenix/compile/ProjectionCompiler.java |  5 +++++
 2 files changed, 31 insertions(+)

diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/MultiCfQueryExecIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/MultiCfQueryExecIT.java
index 01da2d8..9299f93 100644
--- 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/MultiCfQueryExecIT.java
+++ 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/MultiCfQueryExecIT.java
@@ -342,6 +342,32 @@ public class MultiCfQueryExecIT extends 
ParallelStatsEnabledIT {
     }
 
     @Test
+    public void testMixedDefaultAndExplicitCFs() throws Exception {
+        try (Connection conn = DriverManager.getConnection(getUrl())) {
+            String tableName = generateUniqueName();
+            String ddl =
+                    "CREATE TABLE IF NOT EXISTS " + tableName + " (pk1 INTEGER 
NOT NULL PRIMARY KEY, v1 VARCHAR, y.v1 INTEGER)";
+            conn.createStatement().execute(ddl);
+            conn.createStatement().execute("UPSERT INTO " + tableName + " 
VALUES(1, 'test', 2)");
+            conn.commit();
+            ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM 
"+tableName);
+            assertTrue(rs.next());
+            // Without PHOENIX-6423 this would throw a type mismatch 
exception, because it would confuse the 3rd
+            // column to also be the VARCHAR column.
+            assertEquals(2, rs.getInt(3));
+            rs.close();
+
+            // make sure this works with a local index as well (only the data 
plan needs to be adjusted)
+            conn.createStatement().execute("CREATE LOCAL INDEX " + tableName + 
"_IDX ON " + tableName + "(v1)");
+            conn.commit();
+            rs = conn.createStatement().executeQuery("SELECT * FROM 
"+tableName);
+            assertTrue(rs.next());
+            assertEquals(2, rs.getInt(3));
+            rs.close();
+        }
+    }
+
+    @Test
     public void testBug3890() throws Exception {
         try (Connection conn = DriverManager.getConnection(getUrl())) {
             String tableName = generateUniqueName();
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java 
b/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java
index b833849..799b667 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java
@@ -159,6 +159,11 @@ public class ProjectionCompiler {
                         String schemaName = table.getSchemaName().getString();
                         ref = resolver.resolveColumn(schemaName.length() == 0 
? null : schemaName, table.getTableName().getString(), colName);
                     }
+                    // The freshly revolved column's family better be the same 
as the original one.
+                    // If not, trigger the disambiguation logic. Also see 
PTableImpl.getColumnForColumnName(...)
+                    if (column.getFamilyName() != null && 
!column.getFamilyName().equals(ref.getColumn().getFamilyName())) {
+                        throw new AmbiguousColumnException();
+                    }
                 } catch (AmbiguousColumnException e) {
                     if (column.getFamilyName() != null) {
                         ref = resolver.resolveColumn(tableAlias != null ? 
tableAlias : table.getTableName().getString(), 
column.getFamilyName().getString(), colName);

Reply via email to