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);