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>. */