This is an automated email from the ASF dual-hosted git repository.

xiong pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/main by this push:
     new 88016c0366 [CALCITE-7054] Runtime conversion of DECIMAL MULTISET to 
INT MULTISET or DECIMAL ARRAY to INT MULTISET fails with a ClassCastException
88016c0366 is described below

commit 88016c03663647ded44033466c09c57f4b120608
Author: Yu Xu <[email protected]>
AuthorDate: Wed Jun 11 15:23:08 2025 +0800

    [CALCITE-7054] Runtime conversion of DECIMAL MULTISET to INT MULTISET or 
DECIMAL ARRAY to INT MULTISET fails with a ClassCastException
---
 .../adapter/enumerable/RexToLixTranslator.java     |   1 +
 core/src/test/resources/sql/cast.iq                | 124 +++++++++++++++++++++
 2 files changed, 125 insertions(+)

diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexToLixTranslator.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexToLixTranslator.java
index a73d8c879a..db532428bd 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexToLixTranslator.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexToLixTranslator.java
@@ -363,6 +363,7 @@ private Expression getConvertExpression(
 
     switch (targetType.getSqlTypeName()) {
     case ARRAY:
+    case MULTISET:
       final RelDataType sourceDataType = sourceType.getComponentType();
       final RelDataType targetDataType = targetType.getComponentType();
       assert sourceDataType != null;
diff --git a/core/src/test/resources/sql/cast.iq 
b/core/src/test/resources/sql/cast.iq
index 0bfeb6e35b..72367acfff 100644
--- a/core/src/test/resources/sql/cast.iq
+++ b/core/src/test/resources/sql/cast.iq
@@ -1794,4 +1794,128 @@ EnumerableCalc(expr#0=[{inputs}], 
expr#1=[1.11:DECIMAL(3, 2)], expr#2=[2.22:DECI
   EnumerableValues(tuples=[[{ 0 }]])
 !plan
 
+# [CALCITE-7054] Runtime conversion of DECIMAL MULTISET to INT MULTISET or 
DECIMAL ARRAY to INT MULTISET fails with a ClassCastException
+# Cast DECIMAL MULTISET to INTEGER MULTISET
+SELECT CAST(MULTISET[CAST(1.1111 AS DECIMAL(2, 1)), CAST(3.06754 AS DECIMAL(2, 
1))] AS INTEGER MULTISET);
++--------+
+| EXPR$0 |
++--------+
+| [1, 3] |
++--------+
+(1 row)
+
+!ok
+
+# Cast DECIMAL ARRAY to INTEGER MULTISET
+SELECT CAST(ARRAY[CAST(1.1111 AS DECIMAL(2, 1)), CAST(3.06754 AS DECIMAL(2, 
1))] AS INTEGER MULTISET);
++--------+
+| EXPR$0 |
++--------+
+| [1, 3] |
++--------+
+(1 row)
+
+!ok
+
+# Cast DECIMAL MULTISET to INTEGER ARRAY
+SELECT CAST(MULTISET[CAST(1.1111 AS DECIMAL(2, 1)), CAST(3.06754 AS DECIMAL(2, 
1))] AS INTEGER ARRAY);
++--------+
+| EXPR$0 |
++--------+
+| [1, 3] |
++--------+
+(1 row)
+
+!ok
+
+# Cast DECIMAL ARRAY to SMALLINT MULTISET, and then convert SMALLINT MULTISET 
to INTEGER MULTISET
+SELECT CAST(CAST(ARRAY[CAST(1.1111 AS DECIMAL(2, 1)), CAST(3.06754 AS 
DECIMAL(2, 1))] AS SMALLINT MULTISET) as INTEGER MULTISET);
++--------+
+| EXPR$0 |
++--------+
+| [1, 3] |
++--------+
+(1 row)
+
+!ok
+
+EnumerableCalc(expr#0=[{inputs}], expr#1=[1.1:DECIMAL(2, 1)], 
expr#2=[3.1:DECIMAL(2, 1)], expr#3=[ARRAY($t1, $t2)], 
expr#4=[CAST($t3):SMALLINT NOT NULL MULTISET NOT NULL], 
expr#5=[CAST($t4):INTEGER NOT NULL MULTISET NOT NULL], EXPR$0=[$t5])
+  EnumerableValues(tuples=[[{ 0 }]])
+!plan
+
+# Cast DECIMAL MULTISET to INTEGER MULTISET, and then convert INTEGER MULTISET 
to DOUBLE MULTISET
+SELECT CAST(CAST(MULTISET[CAST(1.1111 AS DECIMAL(2, 1)), CAST(3.06754 AS 
DECIMAL(2, 1))] AS INTEGER MULTISET) as DOUBLE MULTISET);
++------------+
+| EXPR$0     |
++------------+
+| [1.0, 3.0] |
++------------+
+(1 row)
+
+!ok
+
+EnumerableCalc(expr#0=[{inputs}], expr#1=[$SLICE($t0)], 
expr#2=[CAST($t1):INTEGER NOT NULL MULTISET NOT NULL], expr#3=[CAST($t2):DOUBLE 
NOT NULL MULTISET NOT NULL], EXPR$0=[$t3])
+  EnumerableCollect(field=[EXPR$0])
+    EnumerableValues(tuples=[[{ 1.1 }, { 3.1 }]])
+!plan
+
+# Cast DECIMAL ARRAY to INTEGER MULTISET, and then convert INTEGER MULTISET to 
DOUBLE MULTISET
+SELECT CAST(CAST(ARRAY[CAST(1.1111 AS DECIMAL(2, 1)), CAST(3.06754 AS 
DECIMAL(2, 1))] AS INTEGER MULTISET) as DOUBLE MULTISET);
++------------+
+| EXPR$0     |
++------------+
+| [1.0, 3.0] |
++------------+
+(1 row)
+
+!ok
+
+EnumerableCalc(expr#0=[{inputs}], expr#1=[1.1:DECIMAL(2, 1)], 
expr#2=[3.1:DECIMAL(2, 1)], expr#3=[ARRAY($t1, $t2)], expr#4=[CAST($t3):INTEGER 
NOT NULL MULTISET NOT NULL], expr#5=[CAST($t4):DOUBLE NOT NULL MULTISET NOT 
NULL], EXPR$0=[$t5])
+  EnumerableValues(tuples=[[{ 0 }]])
+!plan
+
+# Cast SMALLINT ARRAY ARRAY to INTEGER MULTISET MULTISET
+SELECT CAST(ARRAY[ARRAY[1, 2], ARRAY[3, 4]] AS INTEGER MULTISET MULTISET);
++------------------+
+| EXPR$0           |
++------------------+
+| [[1, 2], [3, 4]] |
++------------------+
+(1 row)
+
+!ok
+
+EnumerableCalc(expr#0=[{inputs}], expr#1=[1], expr#2=[2], expr#3=[ARRAY($t1, 
$t2)], expr#4=[3], expr#5=[4], expr#6=[ARRAY($t4, $t5)], expr#7=[ARRAY($t3, 
$t6)], expr#8=[CAST($t7):INTEGER NOT NULL MULTISET NOT NULL MULTISET NOT NULL], 
EXPR$0=[$t8])
+  EnumerableValues(tuples=[[{ 0 }]])
+!plan
+
+# Cast DECIMAL ARRAY MULTISET to INTEGER ARRAY MULTISET
+SELECT CAST(CAST(ARRAY[ARRAY[1.11, 2.22], ARRAY[3.33, 4.44]] AS DECIMAL ARRAY 
MULTISET) as INTEGER ARRAY MULTISET);
++------------------+
+| EXPR$0           |
++------------------+
+| [[1, 2], [3, 4]] |
++------------------+
+(1 row)
+
+!ok
+EnumerableCalc(expr#0=[{inputs}], expr#1=[1.11:DECIMAL(3, 2)], 
expr#2=[2.22:DECIMAL(3, 2)], expr#3=[ARRAY($t1, $t2)], expr#4=[3.33:DECIMAL(3, 
2)], expr#5=[4.44:DECIMAL(3, 2)], expr#6=[ARRAY($t4, $t5)], expr#7=[ARRAY($t3, 
$t6)], expr#8=[CAST($t7):DECIMAL(19, 0) NOT NULL ARRAY NOT NULL MULTISET NOT 
NULL], expr#9=[CAST($t8):INTEGER NOT NULL ARRAY NOT NULL MULTISET NOT NULL], 
EXPR$0=[$t9])
+  EnumerableValues(tuples=[[{ 0 }]])
+!plan
+
+# Cast DECIMAL ARRAY ARRAY to DECIMAL MULTISET MULTISET, then convert DECIMAL 
MULTISET MULTISET to INTEGER MULTISET MULTISET, at last convert INTEGER 
MULTISET MULTISET to DECIMAL MULTISET MULTISET
+SELECT CAST(CAST(CAST(ARRAY[ARRAY[1.11, 2.22], ARRAY[3.33, 4.44]] AS DECIMAL 
MULTISET MULTISET) as INTEGER MULTISET MULTISET) as DECIMAL(2, 1) MULTISET 
MULTISET);
++--------------------------+
+| EXPR$0                   |
++--------------------------+
+| [[1.0, 2.0], [3.0, 4.0]] |
++--------------------------+
+(1 row)
+
+!ok
+
+EnumerableCalc(expr#0=[{inputs}], expr#1=[1.11:DECIMAL(3, 2)], 
expr#2=[2.22:DECIMAL(3, 2)], expr#3=[ARRAY($t1, $t2)], expr#4=[3.33:DECIMAL(3, 
2)], expr#5=[4.44:DECIMAL(3, 2)], expr#6=[ARRAY($t4, $t5)], expr#7=[ARRAY($t3, 
$t6)], expr#8=[CAST($t7):DECIMAL(19, 0) NOT NULL MULTISET NOT NULL MULTISET NOT 
NULL], expr#9=[CAST($t8):INTEGER NOT NULL MULTISET NOT NULL MULTISET NOT NULL], 
expr#10=[CAST($t9):DECIMAL(2, 1) NOT NULL MULTISET NOT NULL MULTISET NOT NULL], 
EXPR$0=[$t10])
+  EnumerableValues(tuples=[[{ 0 }]])
+!plan
+
 # End cast.iq

Reply via email to