[ 
https://issues.apache.org/jira/browse/PHOENIX-3042?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Thomas D'Silva updated PHOENIX-3042:
------------------------------------
    Attachment: PHOENIX-3042-V2.patch

[~jamestaylor]

Thanks for the feedback, I have attached an updated patch. Functional Indexes 
were not working for queries with joins. For joins with aliases, I fixed this 
by using the alias that was supplied in the query when it is attempted to be 
rewritten.
Thanks for the test with two tables with the same column. For this case, the 
function index expression will only have a reference to a single table.

The index wasn't being used because of in JoinCompiler.compile we were adding 
the column refs of pre filters to the select. When the query was being 
optimized the index couldn't be used because the column is not present in the 
index. I don't think we need to add the column refs to the select.

{code}
-        for (ColumnRef ref : prefilterRefVisitor.getColumnRefMap().keySet()) {
-            if (!compiler.columnRefs.containsKey(ref))
-                compiler.columnRefs.put(ref, ColumnRefType.PREFILTER);
-        }
{code}



> Using local index on the expression in where statement for join query fails. 
> -----------------------------------------------------------------------------
>
>                 Key: PHOENIX-3042
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-3042
>             Project: Phoenix
>          Issue Type: Bug
>    Affects Versions: 4.8.0
>            Reporter: Sergey Soldatov
>            Assignee: Thomas D'Silva
>             Fix For: 4.9.0
>
>         Attachments: PHOENIX-3042-V2.patch, PHOENIX-3042.patch
>
>
> A simple scenario:
> {noformat}
> CREATE TABLE customer_phx ( c_customer_sk varchar primary key, c_first_name 
> varchar, c_last_name varchar );
> UPSERT INTO customer_phx values ( '1', 'David', 'Smith');
> CREATE LOCAL INDEX CUSTINDEX ON customer_phx (c_customer_sk || c_first_name 
> asc) include (c_customer_sk);
> select c.c_customer_sk from  customer_phx c left outer join customer_phx c2 
> on c.c_customer_sk = c2.c_customer_sk where c.c_customer_sk || c.c_first_name 
> = '1David';
> {noformat}
> It fails with an Exception :
> {noformat}
> Error: ERROR 504 (42703): Undefined column. columnName=C_FIRST_NAME 
> (state=42703,code=504)
> org.apache.phoenix.schema.ColumnNotFoundException: ERROR 504 (42703): 
> Undefined column. columnName=C_FIRST_NAME
>       at 
> org.apache.phoenix.compile.WhereCompiler$WhereExpressionCompiler.resolveColumn(WhereCompiler.java:190)
>       at 
> org.apache.phoenix.compile.WhereCompiler$WhereExpressionCompiler.visit(WhereCompiler.java:169)
>       at 
> org.apache.phoenix.compile.WhereCompiler$WhereExpressionCompiler.visit(WhereCompiler.java:156)
>       at 
> org.apache.phoenix.parse.ColumnParseNode.accept(ColumnParseNode.java:56)
>       at 
> org.apache.phoenix.parse.CompoundParseNode.acceptChildren(CompoundParseNode.java:64)
>       at 
> org.apache.phoenix.parse.StringConcatParseNode.accept(StringConcatParseNode.java:46)
>       at 
> org.apache.phoenix.parse.CompoundParseNode.acceptChildren(CompoundParseNode.java:64)
>       at 
> org.apache.phoenix.parse.ComparisonParseNode.accept(ComparisonParseNode.java:45)
>       at 
> org.apache.phoenix.compile.WhereCompiler.compile(WhereCompiler.java:130)
>       at 
> org.apache.phoenix.compile.WhereCompiler.compile(WhereCompiler.java:100)
>       at 
> org.apache.phoenix.compile.QueryCompiler.compileSingleFlatQuery(QueryCompiler.java:556)
>       at 
> org.apache.phoenix.compile.QueryCompiler.compileJoinQuery(QueryCompiler.java:324)
>       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:404)
>       at 
> org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:378)
>       at 
> org.apache.phoenix.jdbc.PhoenixStatement$1.call(PhoenixStatement.java:271)
>       at 
> org.apache.phoenix.jdbc.PhoenixStatement$1.call(PhoenixStatement.java:266)
>       at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
>       at 
> org.apache.phoenix.jdbc.PhoenixStatement.executeQuery(PhoenixStatement.java:265)
>       at 
> org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1444)
>       at sqlline.Commands.execute(Commands.java:822)
>       at sqlline.Commands.sql(Commands.java:732)
>       at sqlline.SqlLine.dispatch(SqlLine.java:807)
>       at sqlline.SqlLine.begin(SqlLine.java:681)
>       at sqlline.SqlLine.start(SqlLine.java:398)
>       at sqlline.SqlLine.main(SqlLine.java:292)
> {noformat}
> Meanwhile using the same where statement without join works just fine.
> Any ideas [~jamestaylor], [[email protected]] ?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to