Yunhong Zheng created CALCITE-5907: -------------------------------------- Summary: Unexpected boolean expression simplification for And expression Key: CALCITE-5907 URL: https://issues.apache.org/jira/browse/CALCITE-5907 Project: Calcite Issue Type: Bug Components: core Affects Versions: 1.35.0 Reporter: Yunhong Zheng Fix For: 1.36.0
As [FLINK-27402|https://issues.apache.org/jira/browse/FLINK-27402] shown. If we have a table MyTable(a Int, b Boolean, c String). Calcite will not simplify this case ( c is Varchar type while SqlLiteral is boolean): {code:java} SELECT * FROM MyTable WHERE c = true;{code} As the logical plan is : {code:java} LogicalSink(table=[*anonymous_collect$1*], fields=[a, b, c]) +- LogicalProject(inputs=[0..2]) +- LogicalFilter(condition=[=($2, true)]) +- LogicalTableScan(table=[[default_catalog, default_database, MyTable]]){code} However, Calcite will simplify this case while simplifyAnd : {code:java} SELECT * FROM MyTable WHERE b = true and c = true;{code} As the logical plan is shown below: 'b = true' and 'c = true' both were simplified to 'b' and 'c': {code:java} LogicalSink(table=[*anonymous_collect$1*], fields=[a, b, c]) +- LogicalProject(inputs=[0..2]) +- LogicalFilter(condition=[AND($1, $2)]) +- LogicalTableScan(table=[[default_catalog, default_database, MyTable]]){code} This may cause error because of filter condition is a Varchar type literal. After reading Calcite's code, I found that. The logic of RexSimplify.implify() and RexSimplify.implifyAnd() is different, where the logic of RexSimplify.implifyAnd() is problematic: {code:java} // Simplify BOOLEAN expressions if possible while (term.getKind() == SqlKind.EQUALS) { RexCall call = (RexCall) term; if (call.getOperands().get(0).isAlwaysTrue()) { term = call.getOperands().get(1); terms.set(i, term); continue; } else if (call.getOperands().get(1).isAlwaysTrue()) { term = call.getOperands().get(0); terms.set(i, term); continue; } break; } {code} The above code cannot make such a simple judgment, as there may not be an implicit conversion to ensure that the types on both sides of the condition are consistent. -- This message was sent by Atlassian Jira (v8.20.10#820010)