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

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

commit a124dc7bee1195085d333515a2af57cbeb388870
Author: Mihai Budiu <[email protected]>
AuthorDate: Fri Jan 9 15:09:44 2026 -0800

    [CALCITE-7366] RexLiteral.valueMatchesType throws for a MAP type
    
    Signed-off-by: Mihai Budiu <[email protected]>
---
 core/src/main/java/org/apache/calcite/rex/RexLiteral.java     |  1 +
 .../java/org/apache/calcite/sql/type/SqlTypeCoercionRule.java |  6 ++++--
 .../java/org/apache/calcite/test/SqlToRelConverterTest.java   |  7 +++++++
 .../org/apache/calcite/test/SqlToRelConverterTest.xml         | 11 +++++++++++
 4 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/rex/RexLiteral.java 
b/core/src/main/java/org/apache/calcite/rex/RexLiteral.java
index 2dc8249208..a1e42c50a6 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexLiteral.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexLiteral.java
@@ -397,6 +397,7 @@ public static boolean valueMatchesType(
       return value instanceof List;
     case GEOMETRY:
       return value instanceof Geometry;
+    case MAP:
     case ANY:
       // Literal of type ANY is not legal. "CAST(2 AS ANY)" remains
       // an integer literal surrounded by a cast function.
diff --git 
a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeCoercionRule.java 
b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeCoercionRule.java
index 59fb82fd19..91eea17b4d 100644
--- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeCoercionRule.java
+++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeCoercionRule.java
@@ -167,22 +167,24 @@ private SqlTypeCoercionRule(Map<SqlTypeName, 
ImmutableSet<SqlTypeName>> map) {
               .build());
     }
 
-    // BINARY is castable from VARBINARY, CHARACTERS.
+    // BINARY is castable from VARBINARY, CHARACTERS, INTEGERS
     coerceRules.add(SqlTypeName.BINARY,
         coerceRules.copyValues(SqlTypeName.BINARY)
             .add(SqlTypeName.VARBINARY)
             .addAll(SqlTypeName.CHAR_TYPES)
             .add(SqlTypeName.UUID)
             .addAll(SqlTypeName.INT_TYPES)
+            .addAll(SqlTypeName.UNSIGNED_TYPES)
             .build());
 
-    // VARBINARY is castable from BINARY, CHARACTERS.
+    // VARBINARY is castable from BINARY, CHARACTERS, INTEGERS
     coerceRules.add(SqlTypeName.VARBINARY,
         coerceRules.copyValues(SqlTypeName.VARBINARY)
             .add(SqlTypeName.BINARY)
             .addAll(SqlTypeName.CHAR_TYPES)
             .add(SqlTypeName.UUID)
             .addAll(SqlTypeName.INT_TYPES)
+            .addAll(SqlTypeName.UNSIGNED_TYPES)
             .build());
 
     // VARCHAR is castable from BOOLEAN, DATE, TIME, TIMESTAMP, numeric types, 
binary, uuid, and
diff --git 
a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java 
b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
index 3e7d178ee6..8a485421cf 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -882,6 +882,13 @@ public static void checkActualAndReferenceFiles() {
     sql(sql).ok();
   }
 
+  /** Test case for <a 
href="https://issues.apache.org/jira/browse/CALCITE-7366";>[CALCITE-7366]
+   * RexLiteral.valueMatchesType throws for a MAP type</a>. */
+  @Test void testStringToMapCast() {
+    final String sql = "SELECT CAST('a' AS MAP<INT, INT>)";
+    sql(sql).ok();
+  }
+
   @Test void testGroupBug281b() {
     // Try to confuse it with spurious columns.
     final String sql = "select name, foo from (\n"
diff --git 
a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml 
b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
index 23be5c89da..57dc035f9c 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -8138,6 +8138,17 @@ from orders]]>
 LogicalDelta
   LogicalProject(ROWTIME=[$0], PRODUCTID=[$1], ORDERID=[$2], C=[COUNT() OVER 
(PARTITION BY $1 ORDER BY $0 RANGE 1000:INTERVAL SECOND PRECEDING)])
     LogicalTableScan(table=[[CATALOG, SALES, ORDERS]])
+]]>
+    </Resource>
+  </TestCase>
+  <TestCase name="testStringToMapCast">
+    <Resource name="sql">
+      <![CDATA[SELECT CAST('a' AS MAP<INT, INT>)]]>
+    </Resource>
+    <Resource name="plan">
+      <![CDATA[
+LogicalProject(EXPR$0=[CAST('a'):(INTEGER NOT NULL, INTEGER) MAP NOT NULL])
+  LogicalValues(tuples=[[{ 0 }]])
 ]]>
     </Resource>
   </TestCase>

Reply via email to