[
https://issues.apache.org/jira/browse/CALCITE-864?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Maryann Xue updated CALCITE-864:
--------------------------------
Summary: Incorrect rowType of correlate variable when correlated sub-query
has its left relation as a join (was: Incorrect "fieldType" in RexFieldAccess
when correlated sub-query has its left relation as a join)
> Incorrect rowType of correlate variable when correlated sub-query has its
> left relation as a join
> -------------------------------------------------------------------------------------------------
>
> Key: CALCITE-864
> URL: https://issues.apache.org/jira/browse/CALCITE-864
> Project: Calcite
> Issue Type: Bug
> Reporter: Maryann Xue
> Assignee: Julian Hyde
>
> DDL
> {code}
> create table orders (
> order_id varchar(15) not null primary key,
> customer_id\ varchar(10),
> item_id varchar(10),
> price integer,
> quantity integer,
> date timestamp,
> the_year integer);
> create table items (
> item_id varchar(10) not null primary key,
> name varchar,
> price integer,
> discount1 integer,
> discount2 integer,
> supplier_id varchar(10),
> description varchar);
> {code}
> Query:
> {code}
> select order_id
> from orders o join items i on o.item_id = i.item_id
> where quantity = (
> select max(quantity)
> from orders o2 join items i2 on o2.item_id = i2.item_id
> where i.supplier_id = i2.supplier_id
> )
> {code}
> While executing this query with option "forceDecorrelate=false", I got a
> RuntimeException:
> {code}
> java.lang.RuntimeException: java.sql.SQLException: error while executing SQL
> "select "order_id" from "Join"."OrderTable" o JOIN "Join"."ItemTable" i on
> o."item_id" = i."item_id" where quantity = (select max(quantity) from
> "Join"."OrderTable" o2 JOIN "Join"."ItemTable" i2 on o2."item_id" =
> i2."item_id" where i."supplier_id" = i2."supplier_id")":
> org.apache.phoenix.schema.TypeMismatchException: ERROR 203 (22005): Type
> mismatch. TIMESTAMP and VARCHAR for
> org.apache.phoenix.expression.CorrelateVariableFieldAccessExpression@462bd95e
> = supplier_id
> at org.apache.phoenix.calcite.CalciteIT$Sql.resultIs(CalciteIT.java:187)
> at
> org.apache.phoenix.calcite.CalciteIT.testCorrelate(CalciteIT.java:1155)
> Caused by: java.sql.SQLException: error while executing SQL "select
> "order_id" from "Join"."OrderTable" o JOIN "Join"."ItemTable" i on
> o."item_id" = i."item_id" where quantity = (select max(quantity) from
> "Join"."OrderTable" o2 JOIN "Join"."ItemTable" i2 on o2."item_id" =
> i2."item_id" where i."supplier_id" = i2."supplier_id")":
> org.apache.phoenix.schema.TypeMismatchException: ERROR 203 (22005): Type
> mismatch. TIMESTAMP and VARCHAR for
> org.apache.phoenix.expression.CorrelateVariableFieldAccessExpression@462bd95e
> = supplier_id
> at org.apache.calcite.avatica.Helper.createException(Helper.java:41)
> at
> org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:112)
> at
> org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:130)
> at org.apache.phoenix.calcite.CalciteIT$Sql.resultIs(CalciteIT.java:174)
> ... 28 more
> Caused by: java.lang.RuntimeException:
> org.apache.phoenix.schema.TypeMismatchException: ERROR 203 (22005): Type
> mismatch. TIMESTAMP and VARCHAR for
> org.apache.phoenix.expression.CorrelateVariableFieldAccessExpression@462bd95e
> = supplier_id
> at
> org.apache.phoenix.calcite.CalciteUtils$3.newExpression(CalciteUtils.java:145)
> at
> org.apache.phoenix.calcite.CalciteUtils.toExpression(CalciteUtils.java:807)
> at
> org.apache.phoenix.calcite.rel.PhoenixTableScan.implement(PhoenixTableScan.java:187)
> at
> org.apache.phoenix.calcite.rel.PhoenixRelImplementorImpl.visitInput(PhoenixRelImplementorImpl.java:50)
> at
> org.apache.phoenix.calcite.rel.PhoenixToClientConverter.implement(PhoenixToClientConverter.java:42)
> at
> org.apache.phoenix.calcite.rel.PhoenixRelImplementorImpl.visitInput(PhoenixRelImplementorImpl.java:50)
> at
> org.apache.phoenix.calcite.rel.PhoenixAbstractJoin.implementInput(PhoenixAbstractJoin.java:49)
> at
> org.apache.phoenix.calcite.rel.PhoenixServerJoin.implement(PhoenixServerJoin.java:113)
> at
> org.apache.phoenix.calcite.rel.PhoenixRelImplementorImpl.visitInput(PhoenixRelImplementorImpl.java:50)
> at
> org.apache.phoenix.calcite.rel.PhoenixServerAggregate.implement(PhoenixServerAggregate.java:57)
> at
> org.apache.phoenix.calcite.rel.PhoenixRelImplementorImpl.visitInput(PhoenixRelImplementorImpl.java:50)
> at
> org.apache.phoenix.calcite.rel.PhoenixCorrelate.implement(PhoenixCorrelate.java:78)
> at
> org.apache.phoenix.calcite.rel.PhoenixRelImplementorImpl.visitInput(PhoenixRelImplementorImpl.java:50)
> at
> org.apache.phoenix.calcite.rel.PhoenixFilter.implement(PhoenixFilter.java:59)
> at
> org.apache.phoenix.calcite.rel.PhoenixRelImplementorImpl.visitInput(PhoenixRelImplementorImpl.java:50)
> at
> org.apache.phoenix.calcite.rel.PhoenixClientProject.implement(PhoenixClientProject.java:59)
> at
> org.apache.phoenix.calcite.rel.PhoenixRelImplementorImpl.visitInput(PhoenixRelImplementorImpl.java:50)
> at
> org.apache.phoenix.calcite.rel.PhoenixToEnumerableConverter.makePlan(PhoenixToEnumerableConverter.java:88)
> at
> org.apache.phoenix.calcite.rel.PhoenixToEnumerableConverter.implement(PhoenixToEnumerableConverter.java:69)
> at
> org.apache.calcite.adapter.enumerable.EnumerableRelImplementor.implementRoot(EnumerableRelImplementor.java:99)
> at
> org.apache.calcite.adapter.enumerable.EnumerableInterpretable.toBindable(EnumerableInterpretable.java:92)
> at
> org.apache.calcite.prepare.CalcitePrepareImpl$CalcitePreparingStmt.implement(CalcitePrepareImpl.java:1050)
> at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:293)
> at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:188)
> at
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:671)
> at
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:572)
> at
> org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:541)
> at
> org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:173)
> at
> org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:561)
> at
> org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:477)
> at
> org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:109)
> ... 30 more
> Caused by: org.apache.phoenix.schema.TypeMismatchException: ERROR 203
> (22005): Type mismatch. TIMESTAMP and VARCHAR for
> org.apache.phoenix.expression.CorrelateVariableFieldAccessExpression@462bd95e
> = supplier_id
> at
> org.apache.phoenix.schema.TypeMismatchException.newException(TypeMismatchException.java:53)
> at
> org.apache.phoenix.expression.ComparisonExpression.create(ComparisonExpression.java:133)
> at
> org.apache.phoenix.calcite.CalciteUtils$3.newExpression(CalciteUtils.java:143)
> ... 60 more
> {code}
> The plan was:
> {code}
> PhoenixToEnumerableConverter
> PhoenixClientProject(order_id=[$0])
> PhoenixFilter(condition=[=($4, $14)])
> PhoenixCorrelate(correlation=[$cor0], joinType=[LEFT],
> requiredColumns=[{12}])
> PhoenixClientProject(order_id=[$7], CUSTOMER_ID=[$8], ITEM_ID=[$9],
> PRICE=[$10], QUANTITY=[$11], DATE=[$12], THE_YEAR=[$13], ITEM_ID0=[$0],
> NAME=[$1], PRICE0=[$2], DISCOUNT1=[$3], DISCOUNT2=[$4], SUPPLIER_ID=[$5],
> DESCRIPTION=[$6])
> PhoenixToClientConverter
> PhoenixServerJoin(condition=[=($9, $0)], joinType=[inner])
> PhoenixTableScan(table=[[phoenix, Join, ItemTable]])
> PhoenixToClientConverter
> PhoenixTableScan(table=[[phoenix, Join, OrderTable]])
> PhoenixServerAggregate(group=[{}], EXPR$0=[MAX($4)])
> PhoenixServerJoin(condition=[=($2, $7)], joinType=[inner])
> PhoenixTableScan(table=[[phoenix, Join, OrderTable]])
> PhoenixToClientConverter
> PhoenixTableScan(table=[[phoenix, Join, ItemTable]],
> filter=[=($cor0.SUPPLIER_ID, $5)])
> {code}
> Debugging this case, I found that $cor0.SUPPLIER_ID was referencing to the
> 6th (index=5) of the correlating variable. And meanwhile the correlating
> variable has the same RelDataType as table "items" but not the left relation
> ("orders" join "items") of the rel Correlate.
> After switching the join tables of the left relation, the query gave the
> right result. I think the reason was that the leading part (all that matters
> to RexFieldAccess "$cor0.SUPPLIER_ID") was now the same between table "items"
> and the left relation ("items" join "orders") of the rel Correlate.
> {code}
> select order_id
> from items i join orders o on o.item_id = i.item_id
> where quantity = (
> select max(quantity)
> from orders o2 join items i2 on o2.item_id = i2.item_id
> where i.supplier_id = i2.supplier_id
> )
> {code}
> With de-correlation, the first query also failed because the join condition
> was referencing to the wrong position. The second query succeed with
> de-correlation too.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)