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 <[email protected]>
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>. */