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

ASF GitHub Bot updated CALCITE-6651:
------------------------------------
    Labels: pull-request-available  (was: )

> Ignore SqlLiteral in implicit Integer type cast
> -----------------------------------------------
>
>                 Key: CALCITE-6651
>                 URL: https://issues.apache.org/jira/browse/CALCITE-6651
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: suibianwanwan
>            Assignee: suibianwanwan
>            Priority: Major
>              Labels: pull-request-available
>
> The integer type implicit cast for IN sub-query is supported in CALCITE-5156.
> But for SqlLiteral in IN, we should not force its type cast. In the following 
> comment, in LogicalValue, we keep the type information in RelNode
> {code:java}
> private RexLiteral convertLiteral(SqlLiteral sqlLiteral,
>     Blackboard bb, RelDataType type) {
>   RexNode literalExpr = exprConverter.convertLiteral(bb, sqlLiteral);
>   if (!(literalExpr instanceof RexLiteral)) {
>     assert literalExpr.isA(SqlKind.CAST);
>     RexNode child = ((RexCall) literalExpr).getOperands().get(0);
>     assert RexLiteral.isNullLiteral(child);
>     // NOTE jvs 22-Nov-2006:  we preserve type info
>     // in LogicalValues digest, so it's OK to lose it here
>     return (RexLiteral) child;
>   }
>   //.....
> }{code}
> Take the following SQL as an example:
> {code:java}
> SELECT empno
> FROM emp AS e
> WHERE cast(e.empno as bigint) in (130, 131, 132, 133, 134) {code}
> {code:java}
> LogicalProject(EMPNO=[$0])
>   LogicalJoin(condition=[=($9, $10)], joinType=[inner])
>     LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], 
> SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], EMPNO0=[CAST($0):BIGINT NOT 
> NULL])
>       LogicalTableScan(table=[[CATALOG, SALES, EMP]])
>     LogicalAggregate(group=[{0}])
>       LogicalValues(tuples=[[{ 130 }, { 131 }, { 132 }, { 133 }, { 134 
> }]]){code}
> The type of the Literal is inferred from the type of the LogicalValues. 
> However, if you cast the SqlLiteral to Integer during the validation process, 
> it will result in the following Bad Plan. In the case of too many Values, 
> optimizations such as RexSimplify, pullUpPredicate will consume a lot of time 
> compared to past plans.
> {code:java}
> LogicalProject(EMPNO=[$0])
>   LogicalJoin(condition=[=($9, $10)], joinType=[inner])
>     LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], 
> SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], EMPNO0=[CAST($0):BIGINT NOT 
> NULL])
>       LogicalTableScan(table=[[CATALOG, SALES, EMP]])
>     LogicalAggregate(group=[{0}])
>       LogicalUnion(all=[true])
>         LogicalValues(tuples=[[{ 130 }]])
>         LogicalValues(tuples=[[{ 131 }]])
>         LogicalValues(tuples=[[{ 132 }]])
>         LogicalValues(tuples=[[{ 133 }]])
>         LogicalValues(tuples=[[{ 134 }]]) {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to