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

jiajunxie 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 5d614ed9c8 Following [CALCITE-5570] Support nested map type for 
SqlDataTypeSpec
5d614ed9c8 is described below

commit 5d614ed9c872df08e165445cd4a3ab1e24836ab8
Author: xiejiajun <jiajunbernou...@foxmail.com>
AuthorDate: Sat Oct 14 16:57:24 2023 +0800

    Following [CALCITE-5570] Support nested map type for SqlDataTypeSpec
---
 .../java/org/apache/calcite/sql/type/SqlTypeUtil.java | 11 ++++++++++-
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java    | 19 +++++++++++++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java 
b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java
index 6a82619dd3..ff1becd2bb 100644
--- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java
+++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java
@@ -30,6 +30,7 @@ import org.apache.calcite.sql.SqlCollation;
 import org.apache.calcite.sql.SqlCollectionTypeNameSpec;
 import org.apache.calcite.sql.SqlDataTypeSpec;
 import org.apache.calcite.sql.SqlIdentifier;
+import org.apache.calcite.sql.SqlMapTypeNameSpec;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.SqlRowTypeNameSpec;
 import org.apache.calcite.sql.SqlTypeNameSpec;
@@ -1146,6 +1147,14 @@ public abstract class SqlTypeUtil {
           .map(f -> convertTypeToSpec(f.getType()))
           .collect(Collectors.toList());
       typeNameSpec = new SqlRowTypeNameSpec(SqlParserPos.ZERO, fieldNames, 
fieldTypes);
+    } else if (isMap(type)) {
+      final RelDataType keyType =
+          requireNonNull(type.getKeyType(), () -> "keyType of " + type);
+      final RelDataType valueType =
+          requireNonNull(type.getValueType(), () -> "valueType of " + type);
+      final SqlDataTypeSpec keyTypeSpec = convertTypeToSpec(keyType);
+      final SqlDataTypeSpec valueTypeSpec = convertTypeToSpec(valueType);
+      typeNameSpec = new SqlMapTypeNameSpec(keyTypeSpec, valueTypeSpec, 
SqlParserPos.ZERO);
     } else {
       throw new UnsupportedOperationException(
           "Unsupported type when convertTypeToSpec: " + typeName);
@@ -1212,7 +1221,7 @@ public abstract class SqlTypeUtil {
   public static RelDataType createRecordTypeFromMap(
       RelDataTypeFactory typeFactory, RelDataType type) {
     RelDataType keyType = requireNonNull(type.getKeyType(), () -> "keyType of 
" + type);
-    RelDataType valueType = requireNonNull(type.getValueType(), () -> "keyType 
of " + type);
+    RelDataType valueType = requireNonNull(type.getValueType(), () -> 
"valueType of " + type);
     return typeFactory.createStructType(
         Arrays.asList(keyType, valueType), Arrays.asList("f0", "f1"));
   }
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 0e97580cb6..de7b08a6ab 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
@@ -4016,6 +4016,25 @@ class RelToSqlConverterTest {
     sql(query).withSpark().ok(expected);
   }
 
+  /**
+   * Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-5570";>[CALCITE-5570]
+   * Support nested map type for SqlDataTypeSpec</a>.
+   */
+  @Test void testCastAsMapType() {
+    sql("SELECT CAST(MAP['A', 1.0] AS MAP<VARCHAR, DOUBLE>)")
+        .ok("SELECT CAST(MAP['A', 1.0] AS MAP< VARCHAR CHARACTER SET 
\"ISO-8859-1\", DOUBLE >)\n"
+            + "FROM (VALUES (0)) AS \"t\" (\"ZERO\")");
+    sql("SELECT CAST(MAP['A', ARRAY[1, 2, 3]] AS MAP<VARCHAR, INT ARRAY>)")
+        .ok("SELECT CAST(MAP['A', ARRAY[1, 2, 3]] AS "
+            + "MAP< VARCHAR CHARACTER SET \"ISO-8859-1\", INTEGER ARRAY >)\n"
+            + "FROM (VALUES (0)) AS \"t\" (\"ZERO\")");
+    sql("SELECT CAST(MAP[ARRAY['A'], MAP[1, 2]] AS MAP<VARCHAR ARRAY, MAP<INT, 
INT>>)")
+        .ok("SELECT CAST(MAP[ARRAY['A'], MAP[1, 2]] AS "
+            + "MAP< VARCHAR CHARACTER SET \"ISO-8859-1\" ARRAY, MAP< INTEGER, 
INTEGER > >)\n"
+            + "FROM (VALUES (0)) AS \"t\" (\"ZERO\")");
+  }
+
   /** Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-4674";>[CALCITE-4674]
    * Excess quotes in generated SQL when STAR is a column alias</a>. */

Reply via email to