phoenix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Thomas D'Silva (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (PHOENIX-3648) Self Join on table with columns of the same name and different column families fails
Date Tue, 07 Feb 2017 02:01:41 GMT

    [ https://issues.apache.org/jira/browse/PHOENIX-3648?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15855147#comment-15855147
] 

Thomas D'Silva commented on PHOENIX-3648:
-----------------------------------------

The test also passes if I make the following change to only use the {code}TupleProjector.VALUE_COLUMN_FAMILY{code}
for pk columns. The explain plans don't change with this change. 

In the encodeColumns branch we validate that for each column family the column qualifiers
are unique, so we need to make the following change.

{code}
-            PColumn column = new ProjectedColumn(PNameFactory.newName(aliasedName), 
-                    retainPKColumns && SchemaUtil.isPKColumn(sourceColumn) ? 
-                            null : PNameFactory.newName(VALUE_COLUMN_FAMILY), 
+            PName familyName =  SchemaUtil.isPKColumn(sourceColumn) ? (retainPKColumns ?
null : PNameFactory.newName(VALUE_COLUMN_FAMILY)) : sourceColumn.getFamilyName();
+            PColumn column = new ProjectedColumn(PNameFactory.newName(aliasedName), familyName,
{code}

> Self Join on table with columns of the same name and different column families fails
> ------------------------------------------------------------------------------------
>
>                 Key: PHOENIX-3648
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-3648
>             Project: Phoenix
>          Issue Type: Bug
>            Reporter: Thomas D'Silva
>            Assignee: Thomas D'Silva
>
> The following test fails when running the second join query. 
> {code}
> @Test
>     public void testSelfJoin() throws Exception {
>         try (Connection conn = DriverManager.getConnection(getUrl())) {
>             conn.createStatement().execute("create table t1 (varchar_pk VARCHAR NOT NULL
primary key, a.varchar_col1 VARCHAR, b.varchar_col2 VARCHAR)");
>             conn.createStatement().execute("create table t2 (varchar_pk VARCHAR NOT NULL
primary key, a.varchar_col1 VARCHAR, b.varchar_col1 VARCHAR)");
>             // verify no rows returned
>             ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM t1 x JOIN
t1 y ON (x.varchar_pk = y.a.varchar_col1)");
>             assertFalse(rs.next());
>             rs = conn.createStatement().executeQuery("SELECT * FROM t2 x JOIN t2 y ON
(x.varchar_pk = y.a.varchar_col1)");
>             assertFalse(rs.next());
>         } 
>     }
> {code}
> {code}
> org.apache.phoenix.schema.ColumnAlreadyExistsException: ERROR 514 (42892): A duplicate
column name was detected in the object definition or ALTER TABLE statement. columnName=..T2.X.VARCHAR_COL1
> 	at org.apache.phoenix.schema.PTableImpl.init(PTableImpl.java:467)
> 	at org.apache.phoenix.schema.PTableImpl.<init>(PTableImpl.java:365)
> 	at org.apache.phoenix.schema.PTableImpl.makePTable(PTableImpl.java:335)
> 	at org.apache.phoenix.compile.TupleProjectionCompiler.createProjectedTable(TupleProjectionCompiler.java:179)
> 	at org.apache.phoenix.compile.JoinCompiler$Table.createProjectedTable(JoinCompiler.java:751)
> 	at org.apache.phoenix.compile.QueryCompiler.compileJoinQuery(QueryCompiler.java:267)
> 	at org.apache.phoenix.compile.QueryCompiler.compileSelect(QueryCompiler.java:200)
> 	at org.apache.phoenix.compile.QueryCompiler.compile(QueryCompiler.java:157)
> 	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:417)
> 	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:391)
> 	at org.apache.phoenix.jdbc.PhoenixStatement$1.call(PhoenixStatement.java:277)
> 	at org.apache.phoenix.jdbc.PhoenixStatement$1.call(PhoenixStatement.java:267)
> 	at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
> 	at org.apache.phoenix.jdbc.PhoenixStatement.executeQuery(PhoenixStatement.java:266)
> 	at org.apache.phoenix.jdbc.PhoenixStatement.executeQuery(PhoenixStatement.java:1427)
> 	at org.apache.phoenix.end2end.index.IndexExpressionIT.testSelfJoin(IndexExpressionIT.java:1554)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.lang.reflect.Method.invoke(Method.java:497)
> 	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
> 	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
> 	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
> 	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
> 	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
> 	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
> 	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
> 	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
> 	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
> 	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
> 	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
> 	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
> 	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
> 	at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
> 	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
> 	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
> 	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
> 	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
> 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
> 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
> 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
> {code}
> It fails because in TupleProjectionCompiler.createProjectedTable when we create the projected
columns we set the column family name to TupleProjector.VALUE_COLUMN_FAMILY
> [~maryannxue], [~jamestaylor] Do you have any suggestions on how to fix this?
> {code}
> for (int i = position; i < sourceColumnRefs.size(); i++) {
>             ColumnRef sourceColumnRef = sourceColumnRefs.get(i);
>             PColumn sourceColumn = sourceColumnRef.getColumn();
>             String colName = sourceColumn.getName().getString();
>             String aliasedName = tableRef.getTableAlias() == null ? 
>                       SchemaUtil.getColumnName(table.getName().getString(), colName)

>                     : SchemaUtil.getColumnName(tableRef.getTableAlias(), colName);
>             PColumn column = new ProjectedColumn(PNameFactory.newName(aliasedName), 
>                     retainPKColumns && SchemaUtil.isPKColumn(sourceColumn) ?

>                             null : PNameFactory.newName(TupleProjector.VALUE_COLUMN_FAMILY),

>                     position++, sourceColumn.isNullable(), sourceColumnRef);
>             projectedColumns.add(column);
>         }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Mime
View raw message