[
https://issues.apache.org/jira/browse/IGNITE-18762?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Maksim Zhuravkov updated IGNITE-18762:
--------------------------------------
Summary: Sql. Incorrect types can be inferred for CASE WHEN .. END
expressions (was: Sql. java.lang.UnsupportedOperationException: class
org.apache.calcite.sql.SqlDynamicParam: ?)
> Sql. Incorrect types can be inferred for CASE WHEN .. END expressions
> ----------------------------------------------------------------------
>
> Key: IGNITE-18762
> URL: https://issues.apache.org/jira/browse/IGNITE-18762
> Project: Ignite
> Issue Type: Improvement
> Components: sql
> Reporter: Maksim Zhuravkov
> Priority: Major
> Labels: calcite2-required, calcite3-required, ignite-3
>
> {code:java}
> @Disabled
> @Test
> public void testCaseWhenExprNonBooleanAtBooleanOnlyPosition() {
> // This query should be rejected since the first parameter is a string
> // but the position it appears to be allows only BOOLEAN arguments.
> sql("SELECT CASE ? WHEN c1 = '1' THEN 0 ELSE 1 END FROM (VALUES ('1'))
> t(c1);", '1');
> // PostgreSQL reject such query with the following error:
> /*
> org.postgresql.util.PSQLException: ERROR: operator does not exist:
> character varying = boolean
> Hint: No operator matches the given name and argument types. You might
> need to add explicit type casts.
> Position: 16
> */
> // Current implementation produces:
> /*
> class org.apache.calcite.sql.SqlBasicCall: CAST(`T`.`C1` AS UNKNOWN)
> java.lang.UnsupportedOperationException: class
> org.apache.calcite.sql.SqlBasicCall: CAST(`T`.`C1` AS UNKNOWN)
> at org.apache.calcite.util.Util.needToImplement(Util.java:1101)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.getValidatedNodeType(SqlValidatorImpl.java:1767)
> at
> org.apache.calcite.sql.SqlBinaryOperator.convertType(SqlBinaryOperator.java:137)
> at
> org.apache.calcite.sql.SqlBinaryOperator.adjustType(SqlBinaryOperator.java:132)
> */
> }
> @Disabled
> // CASE WHEN
> // Invalid Expression type
> @Test
> public void testCaseWhenExpr() {
> // must return 0<text> but returns <0><int>
> assertQuery("SELECT CASE c1 WHEN '2' THEN '1' ELSE '0' END FROM
> (VALUES(1)) t(c1)").returns('0').check();
> assertQuery("SELECT CASE c1 WHEN '2' THEN '1' ELSE '0' END FROM
> (VALUES(2)) t(c1)").returns('1').check();
> // must be rejected
> assertQuery("SELECT CASE c1 WHEN '2' THEN '1' ELSE '0' END FROM
> (VALUES('1')) t(c1)").returns('0').check();
> }
> // Invalid type of CASE expression
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)