[ https://issues.apache.org/jira/browse/IGNITE-19503?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Maksim Zhuravkov updated IGNITE-19503: -------------------------------------- Description: Type compatibility checks for UUID in some expression/statement are not performed at validation stage: INTEGER vs UUID: {code:java} @Test public void testInsert() { sql("CREATE TABLE t1 (key INTEGER PRIMARY KEY , int_col INTEGER)"); // / class java.util.UUID cannot be cast to class java.lang.Integer sql("INSERT INTO t1 VALUES(1, '46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID)"); } @Test public void testUpdate() { sql("CREATE TABLE t1 (key INTEGER PRIMARY KEY , int_col INTEGER)"); sql("INSERT INTO t1 VALUES(1, 1)"); // class java.util.UUID cannot be cast to class java.lang.Integer sql("UPDATE t1 SET int_col ='46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID"); } {code} INTEGER vs VARBINARY {code:java} @Test public void testInsert2() { sql("CREATE TABLE t1 (key INTEGER PRIMARY KEY , int_col INTEGER)"); // Column 33: Cannot assign to target field 'INT_COL' of type INTEGER from source field 'EXPR$0' of type BINARY(3) sql("INSERT INTO t1 VALUES(1, x'010203')"); } @Test public void testUpdate2() { sql("CREATE TABLE t1 (key INTEGER PRIMARY KEY , int_col INTEGER)"); // column 33: Cannot assign to target field 'INT_COL' of type INTEGER from source field 'EXPR$0' of type BINARY(3) sql("UPDATE t1 SET int_col = x'010203'"); } {code} Expressions: {code:java} @Test public void testExprs() { //sql("SELECT 1 in ('46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID)"); // Binary comparison operations are rejected by validator: OK // From line 1, column 1 to line 1, column 55: Invalid types for comparison: INTEGER NOT NULL = UUID NOT NULL sql("SELECT 1 = '46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID"); // CASE: OK // Illegal mixing of types in CASE or COALESCE statement sql("SELECT CASE int_col WHEN 1 THEN '46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID ELSE '2' END FROM t1"); // Arithmetic /* java.lang.IllegalArgumentException: Cannot infer return type for +; operand types: [INTEGER, UUID] at org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:541) at org.apache.calcite.sql.SqlOperator.validateOperands(SqlOperator.java:504) at org.apache.calcite.sql.SqlOperator.deriveType(SqlOperator.java:605) at org.apache.calcite.sql.SqlBinaryOperator.deriveType(SqlBinaryOperator.java:178) */ sql("SELECT 1 + '46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID"); // Runtime: Cannot convert 46138242-b771-4d8b-ad26-2b3fcee5f11d to int sql("SELECT 1 IN ('46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID)"); // Line 8, Column 281: Cannot cast "java.util.UUID" to "org.apache.calcite.avatica.util.ByteString" //Caused by: org.codehaus.commons.compiler.CompileException: Line 8, Column 281: Cannot cast "java.util.UUID" to "org.apache.calcite.avatica.util.ByteString" //at org.codehaus.janino.UnitCompiler.compileError(UnitCompiler.java:13014) sql("SELECT x'010203' IN ('46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID)"); // Same goes for SELECT uuid_col IN (1,2,3) // [SEARCH($t0, Sarg[1, 2, 3, 4])] Sarg has INTEGER type. } {code} This happens because ANY type is used as a type family for UUID/custom data types and ANY can be cast to/from all other data types see SqlTypeUtil and other calcite classes. When fixing INSERT statement we should remember that calcite's DEFAULT expression has ANY type as well. was: Type compatibility checks for UUID in some expression/statement are not performed at validation stage: INTEGER vs UUID: {code:java} @Test public void testInsert() { sql("CREATE TABLE t1 (key INTEGER PRIMARY KEY , int_col INTEGER)"); // / class java.util.UUID cannot be cast to class java.lang.Integer sql("INSERT INTO t1 VALUES(1, '46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID)"); } @Test public void testUpdate() { sql("CREATE TABLE t1 (key INTEGER PRIMARY KEY , int_col INTEGER)"); sql("INSERT INTO t1 VALUES(1, 1)"); // class java.util.UUID cannot be cast to class java.lang.Integer sql("UPDATE t1 SET int_col ='46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID"); } {code} INTEGER vs VARBINARY {code:java} @Test public void testInsert2() { sql("CREATE TABLE t1 (key INTEGER PRIMARY KEY , int_col INTEGER)"); // Column 33: Cannot assign to target field 'INT_COL' of type INTEGER from source field 'EXPR$0' of type BINARY(3) sql("INSERT INTO t1 VALUES(1, x'010203')"); } @Test public void testUpdate2() { sql("CREATE TABLE t1 (key INTEGER PRIMARY KEY , int_col INTEGER)"); // column 33: Cannot assign to target field 'INT_COL' of type INTEGER from source field 'EXPR$0' of type BINARY(3) sql("UPDATE t1 SET int_col = x'010203'"); } {code} Expressions: {code:java} @Test public void testExprs() { //sql("SELECT 1 in ('46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID)"); // Binary comparison operations are rejected by validator: OK // From line 1, column 1 to line 1, column 55: Invalid types for comparison: INTEGER NOT NULL = UUID NOT NULL sql("SELECT 1 = '46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID"); // CASE: OK // Illegal mixing of types in CASE or COALESCE statement sql("SELECT CASE int_col WHEN 1 THEN '46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID ELSE '2' END FROM t1"); // Arithmetic /* java.lang.IllegalArgumentException: Cannot infer return type for +; operand types: [INTEGER, UUID] at org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:541) at org.apache.calcite.sql.SqlOperator.validateOperands(SqlOperator.java:504) at org.apache.calcite.sql.SqlOperator.deriveType(SqlOperator.java:605) at org.apache.calcite.sql.SqlBinaryOperator.deriveType(SqlBinaryOperator.java:178) */ sql("SELECT 1 + '46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID"); // Runtime: Cannot convert 46138242-b771-4d8b-ad26-2b3fcee5f11d to int sql("SELECT 1 IN ('46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID)"); // Line 8, Column 281: Cannot cast "java.util.UUID" to "org.apache.calcite.avatica.util.ByteString" //Caused by: org.codehaus.commons.compiler.CompileException: Line 8, Column 281: Cannot cast "java.util.UUID" to "org.apache.calcite.avatica.util.ByteString" //at org.codehaus.janino.UnitCompiler.compileError(UnitCompiler.java:13014) sql("SELECT x'010203' IN ('46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID)"); } {code} This happens because ANY type is used as a type family for UUID/custom data types and ANY can be cast to/from all other data types see SqlTypeUtil and other calcite classes. When fixing INSERT statement we should remember that calcite's DEFAULT expression has ANY type as well. > Sql. UUID. Some expressions and statements with types from incompatible > families are not rejected. > -------------------------------------------------------------------------------------------------- > > Key: IGNITE-19503 > URL: https://issues.apache.org/jira/browse/IGNITE-19503 > Project: Ignite > Issue Type: Bug > Components: sql > Affects Versions: 3.0.0-beta1 > Reporter: Maksim Zhuravkov > Priority: Minor > Labels: ignite-3 > > Type compatibility checks for UUID in some expression/statement are not > performed at validation stage: > INTEGER vs UUID: > {code:java} > @Test > public void testInsert() { > sql("CREATE TABLE t1 (key INTEGER PRIMARY KEY , int_col INTEGER)"); > // / class java.util.UUID cannot be cast to class java.lang.Integer > sql("INSERT INTO t1 VALUES(1, > '46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID)"); > } > @Test > public void testUpdate() { > sql("CREATE TABLE t1 (key INTEGER PRIMARY KEY , int_col INTEGER)"); > sql("INSERT INTO t1 VALUES(1, 1)"); > // class java.util.UUID cannot be cast to class java.lang.Integer > sql("UPDATE t1 SET int_col > ='46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID"); > } > {code} > INTEGER vs VARBINARY > {code:java} > @Test > public void testInsert2() { > sql("CREATE TABLE t1 (key INTEGER PRIMARY KEY , int_col INTEGER)"); > // Column 33: Cannot assign to target field 'INT_COL' of type INTEGER > from source field 'EXPR$0' of type BINARY(3) > sql("INSERT INTO t1 VALUES(1, x'010203')"); > } > @Test > public void testUpdate2() { > sql("CREATE TABLE t1 (key INTEGER PRIMARY KEY , int_col INTEGER)"); > // column 33: Cannot assign to target field 'INT_COL' of type INTEGER > from source field 'EXPR$0' of type BINARY(3) > sql("UPDATE t1 SET int_col = x'010203'"); > } > {code} > Expressions: > {code:java} > @Test > public void testExprs() { > //sql("SELECT 1 in ('46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID)"); > // Binary comparison operations are rejected by validator: OK > // From line 1, column 1 to line 1, column 55: Invalid types for > comparison: INTEGER NOT NULL = UUID NOT NULL > sql("SELECT 1 = '46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID"); > // CASE: OK > // Illegal mixing of types in CASE or COALESCE statement > sql("SELECT CASE int_col WHEN 1 THEN > '46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID ELSE '2' END FROM t1"); > // Arithmetic > /* > java.lang.IllegalArgumentException: Cannot infer return type for +; > operand types: [INTEGER, UUID] > at > org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:541) > at > org.apache.calcite.sql.SqlOperator.validateOperands(SqlOperator.java:504) > at org.apache.calcite.sql.SqlOperator.deriveType(SqlOperator.java:605) > at > org.apache.calcite.sql.SqlBinaryOperator.deriveType(SqlBinaryOperator.java:178) > */ > sql("SELECT 1 + '46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID"); > // Runtime: Cannot convert 46138242-b771-4d8b-ad26-2b3fcee5f11d to int > sql("SELECT 1 IN ('46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID)"); > // Line 8, Column 281: Cannot cast "java.util.UUID" to > "org.apache.calcite.avatica.util.ByteString" > //Caused by: org.codehaus.commons.compiler.CompileException: Line 8, > Column 281: Cannot cast "java.util.UUID" to > "org.apache.calcite.avatica.util.ByteString" > //at > org.codehaus.janino.UnitCompiler.compileError(UnitCompiler.java:13014) > sql("SELECT x'010203' IN > ('46138242-b771-4d8b-ad26-2b3fcee5f11d'::UUID)"); > // Same goes for SELECT uuid_col IN (1,2,3) > // [SEARCH($t0, Sarg[1, 2, 3, 4])] Sarg has INTEGER type. > } > {code} > This happens because ANY type is used as a type family for UUID/custom data > types and ANY can be cast to/from all other data types see SqlTypeUtil and > other calcite classes. > When fixing INSERT statement we should remember that calcite's DEFAULT > expression has ANY type as well. -- This message was sent by Atlassian Jira (v8.20.10#820010)