[ https://issues.apache.org/jira/browse/IGNITE-22762?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Aleksey Plekhanov updated IGNITE-22762: --------------------------------------- Description: Reproducer: {noformat} sql("select coalesce(?, 1)", 0); {noformat} Fails with an exception: {noformat} java.lang.AssertionError: Conversion to relational algebra failed to preserve datatypes: validated type: RecordType(INTEGER NOT NULL EXPR$0) NOT NULL converted type: RecordType(INTEGER EXPR$0) NOT NULL rel: LogicalProject(EXPR$0=[CASE(IS NOT NULL(?0), ?0, 1)]) LogicalValues(tuples=[[{ 0 }]]) at org.apache.calcite.sql2rel.SqlToRelConverter.checkConvertedType(SqlToRelConverter.java:497) ~[calcite-core-1.34.0.jar:1.34.0] at org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:612) ~[calcite-core-1.34.0.jar:1.34.0] at org.apache.ignite.internal.processors.query.calcite.prepare.IgnitePlanner.rel(IgnitePlanner.java:340) ~[classes/:?] at org.apache.ignite.internal.processors.query.calcite.prepare.PlannerHelper.optimize(PlannerHelper.java:76) ~[classes/:?] {noformat} Root cause: COALESCE converted to CASE operator via {{SqlCoalesceFunction#rewriteCall}} method. After convertion each operand is cloned (IF IS NOT NULL (op) THEN op), and type is derived for each clone of operand individually. These types can be different, and CASE operator can't determine that operands are equal, since it has another type (see SqlCaseOperator#inferTypeFromValidator and SqlCaseOperator#inferTypeFromOperands methods) was: Reproducer: {noformat} sql("select coalesce(?, 1)", 0); {noformat} Fails with an exception: {noformat} java.lang.AssertionError: Conversion to relational algebra failed to preserve datatypes: validated type: RecordType(INTEGER NOT NULL EXPR$0) NOT NULL converted type: RecordType(INTEGER EXPR$0) NOT NULL rel: LogicalProject(EXPR$0=[CASE(IS NOT NULL(?0), ?0, 1)]) LogicalValues(tuples=[[{ 0 }]]) at org.apache.calcite.sql2rel.SqlToRelConverter.checkConvertedType(SqlToRelConverter.java:497) ~[calcite-core-1.34.0.jar:1.34.0] at org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:612) ~[calcite-core-1.34.0.jar:1.34.0] at org.apache.ignite.internal.processors.query.calcite.prepare.IgnitePlanner.rel(IgnitePlanner.java:340) ~[classes/:?] at org.apache.ignite.internal.processors.query.calcite.prepare.PlannerHelper.optimize(PlannerHelper.java:76) ~[classes/:?] {noformat} > Calcite engine. Validated COALESCE return type not equals to relational > algebra return type > ------------------------------------------------------------------------------------------- > > Key: IGNITE-22762 > URL: https://issues.apache.org/jira/browse/IGNITE-22762 > Project: Ignite > Issue Type: Bug > Reporter: Aleksey Plekhanov > Priority: Major > Labels: calcite, ise > > Reproducer: > {noformat} > sql("select coalesce(?, 1)", 0); > {noformat} > Fails with an exception: > {noformat} > java.lang.AssertionError: Conversion to relational algebra failed to preserve > datatypes: > validated type: > RecordType(INTEGER NOT NULL EXPR$0) NOT NULL > converted type: > RecordType(INTEGER EXPR$0) NOT NULL > rel: > LogicalProject(EXPR$0=[CASE(IS NOT NULL(?0), ?0, 1)]) > LogicalValues(tuples=[[{ 0 }]]) > at > org.apache.calcite.sql2rel.SqlToRelConverter.checkConvertedType(SqlToRelConverter.java:497) > ~[calcite-core-1.34.0.jar:1.34.0] > at > org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:612) > ~[calcite-core-1.34.0.jar:1.34.0] > at > org.apache.ignite.internal.processors.query.calcite.prepare.IgnitePlanner.rel(IgnitePlanner.java:340) > ~[classes/:?] > at > org.apache.ignite.internal.processors.query.calcite.prepare.PlannerHelper.optimize(PlannerHelper.java:76) > ~[classes/:?] > {noformat} > Root cause: COALESCE converted to CASE operator via > {{SqlCoalesceFunction#rewriteCall}} method. After convertion each operand is > cloned (IF IS NOT NULL (op) THEN op), and type is derived for each clone of > operand individually. These types can be different, and CASE operator can't > determine that operands are equal, since it has another type (see > SqlCaseOperator#inferTypeFromValidator and > SqlCaseOperator#inferTypeFromOperands methods) -- This message was sent by Atlassian Jira (v8.20.10#820010)