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

xuzifu666 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 c628e6876b [CALCITE-7433] Invalid unparse for cast to map type in Spark
c628e6876b is described below

commit c628e6876bc28f268a69dece649c172869118607
Author: Yu Xu <[email protected]>
AuthorDate: Thu Mar 5 21:13:58 2026 +0800

    [CALCITE-7433] Invalid unparse for cast to map type in Spark
---
 .../calcite/sql/dialect/SparkSqlDialect.java       |  3 ++
 .../apache/calcite/util/RelToSqlConverterUtil.java | 18 ++++++++++
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java | 38 ++++++++++++++++++++++
 3 files changed, 59 insertions(+)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java
index 42cd259e51..6f6e3d3917 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java
@@ -169,6 +169,9 @@ public SparkSqlDialect(SqlDialect.Context context) {
     case ARRAY:
       return RelToSqlConverterUtil.getCastSpecAngleBracketArrayType(this, type,
           SqlParserPos.ZERO);
+    case MAP:
+      return RelToSqlConverterUtil.getCastSpecSparkSqlMapType(this, type,
+          SqlParserPos.ZERO);
     case MULTISET:
       throw new UnsupportedOperationException("Spark dialect does not support 
cast to "
           + type.getSqlTypeName());
diff --git 
a/core/src/main/java/org/apache/calcite/util/RelToSqlConverterUtil.java 
b/core/src/main/java/org/apache/calcite/util/RelToSqlConverterUtil.java
index ddb37e8dac..1f15adc7d6 100644
--- a/core/src/main/java/org/apache/calcite/util/RelToSqlConverterUtil.java
+++ b/core/src/main/java/org/apache/calcite/util/RelToSqlConverterUtil.java
@@ -390,6 +390,24 @@ public static SqlDataTypeSpec 
getCastSpecAngleBracketArrayType(SqlDialect dialec
     return new SqlDataTypeSpec(sqlArrayTypeNameSpec, SqlParserPos.ZERO);
   }
 
+  /**
+   * Transformation Map type from {@code MAP<VARCHAR,INTEGER>} to {@code 
Map<STRING,INTEGER>}.
+   */
+  public static SqlDataTypeSpec getCastSpecSparkSqlMapType(SqlDialect dialect,
+      RelDataType type, SqlParserPos pos) {
+    MapSqlType mapSqlType = (MapSqlType) type;
+    SqlDataTypeSpec keySpec = (SqlDataTypeSpec) 
dialect.getCastSpec(mapSqlType.getKeyType());
+    SqlDataTypeSpec valueSpec =
+        (SqlDataTypeSpec) dialect.getCastSpec(mapSqlType.getValueType());
+    SqlDataTypeSpec nonNullKeySpec =
+        requireNonNull(keySpec, "keySpec").withNullable(false);
+    SqlDataTypeSpec nonNullValueSpec =
+        requireNonNull(valueSpec, "valueSpec").withNullable(false);
+    SqlMapTypeNameSpec sqlMapTypeNameSpec =
+        new SqlMapTypeNameSpec(nonNullKeySpec, nonNullValueSpec, pos);
+    return new SqlDataTypeSpec(sqlMapTypeNameSpec, SqlParserPos.ZERO);
+  }
+
   /**
    * ClickHouseSqlMapTypeNameSpec to parse or unparse SQL MAP type to {@code 
Map(VARCHAR, VARCHAR)}.
    */
diff --git 
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java 
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
index 1b219255b4..4105431220 100644
--- 
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
+++ 
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
@@ -2853,6 +2853,44 @@ private SqlDialect nonOrdinalDialect() {
         .withSpark().ok(expectedSpark1);
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7433";>[CALCITE-7433]
+   * Invalid unparse for cast to map type in Spark</a>.
+   */
+  @Test void testCastMapSpark() {
+    final String query = "select cast(MAP['a',1,'b',2,'c',3]"
+        + " as MAP<varchar,integer>)";
+    final String expectedSpark =
+        "SELECT CAST(MAP ('a', 1, 'b', 2, 'c', 3) AS MAP< STRING, INTEGER >)\n"
+            + "FROM (VALUES (0)) `t` (`ZERO`)";
+    sql(query)
+        .withSpark().ok(expectedSpark);
+
+    final String query1 = "select cast(MAP['a',ARRAY[1,2,3]]"
+        + " as MAP<varchar,integer array>)";
+    final String expectedSpark1 =
+        "SELECT CAST(MAP ('a', ARRAY (1, 2, 3)) AS MAP< STRING, ARRAY< INTEGER 
> >)\n"
+            + "FROM (VALUES (0)) `t` (`ZERO`)";
+    sql(query1)
+        .withSpark().ok(expectedSpark1);
+
+    final String query2 = "select cast(MAP['a',ARRAY[1.0,2.0,3.0]]"
+        + " as MAP<varchar,real array>)";
+    final String expectedSpark2 =
+        "SELECT CAST(MAP ('a', ARRAY (1.0, 2.0, 3.0)) AS MAP< STRING, ARRAY< 
REAL > >)\n"
+            + "FROM (VALUES (0)) `t` (`ZERO`)";
+    sql(query2)
+        .withSpark().ok(expectedSpark2);
+
+    final String query3 = "select cast(MAP['a',MAP['b','c']]"
+        + " as MAP<varchar,MAP<varchar,varchar>>)";
+    final String expectedSpark3 =
+        "SELECT CAST(MAP ('a', MAP ('b', 'c')) AS MAP< STRING, MAP< STRING, 
STRING > >)\n"
+            + "FROM (VALUES (0)) `t` (`ZERO`)";
+    sql(query3)
+        .withSpark().ok(expectedSpark3);
+  }
+
   /** Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7055";>[CALCITE-7055]
    * Invalid unparse for cast to array type in StarRocks</a>.

Reply via email to