[
https://issues.apache.org/jira/browse/IGNITE-18762?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Maksim Zhuravkov updated IGNITE-18762:
--------------------------------------
Description:
{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}
was:
We should consider adding implicit casts to/from UUID/VARCHAR type.
PostgreSQL for example does implicit type conversion from varchar to UUID.
> Sql. java.lang.UnsupportedOperationException: class
> org.apache.calcite.sql.SqlDynamicParam: ?
> ---------------------------------------------------------------------------------------------
>
> 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)