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