You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by la...@apache.org on 2021/03/21 17:00:46 UTC

[phoenix] branch 5.1 updated: PHOENIX-6423 Wildcard queries fail with mixed default and explicit column families.

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

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


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

commit 99c0cc49f674d67e11243f80d7d22bed3dc56ab7
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 31af76a..bae0f0c 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);