Skip to content

Commit c628e68

Browse files
committed
[CALCITE-7433] Invalid unparse for cast to map type in Spark
1 parent 09a1499 commit c628e68

3 files changed

Lines changed: 59 additions & 0 deletions

File tree

core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ public SparkSqlDialect(SqlDialect.Context context) {
169169
case ARRAY:
170170
return RelToSqlConverterUtil.getCastSpecAngleBracketArrayType(this, type,
171171
SqlParserPos.ZERO);
172+
case MAP:
173+
return RelToSqlConverterUtil.getCastSpecSparkSqlMapType(this, type,
174+
SqlParserPos.ZERO);
172175
case MULTISET:
173176
throw new UnsupportedOperationException("Spark dialect does not support cast to "
174177
+ type.getSqlTypeName());

core/src/main/java/org/apache/calcite/util/RelToSqlConverterUtil.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,24 @@ public static SqlDataTypeSpec getCastSpecAngleBracketArrayType(SqlDialect dialec
390390
return new SqlDataTypeSpec(sqlArrayTypeNameSpec, SqlParserPos.ZERO);
391391
}
392392

393+
/**
394+
* Transformation Map type from {@code MAP<VARCHAR,INTEGER>} to {@code Map<STRING,INTEGER>}.
395+
*/
396+
public static SqlDataTypeSpec getCastSpecSparkSqlMapType(SqlDialect dialect,
397+
RelDataType type, SqlParserPos pos) {
398+
MapSqlType mapSqlType = (MapSqlType) type;
399+
SqlDataTypeSpec keySpec = (SqlDataTypeSpec) dialect.getCastSpec(mapSqlType.getKeyType());
400+
SqlDataTypeSpec valueSpec =
401+
(SqlDataTypeSpec) dialect.getCastSpec(mapSqlType.getValueType());
402+
SqlDataTypeSpec nonNullKeySpec =
403+
requireNonNull(keySpec, "keySpec").withNullable(false);
404+
SqlDataTypeSpec nonNullValueSpec =
405+
requireNonNull(valueSpec, "valueSpec").withNullable(false);
406+
SqlMapTypeNameSpec sqlMapTypeNameSpec =
407+
new SqlMapTypeNameSpec(nonNullKeySpec, nonNullValueSpec, pos);
408+
return new SqlDataTypeSpec(sqlMapTypeNameSpec, SqlParserPos.ZERO);
409+
}
410+
393411
/**
394412
* ClickHouseSqlMapTypeNameSpec to parse or unparse SQL MAP type to {@code Map(VARCHAR, VARCHAR)}.
395413
*/

core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2853,6 +2853,44 @@ private SqlDialect nonOrdinalDialect() {
28532853
.withSpark().ok(expectedSpark1);
28542854
}
28552855

2856+
/** Test case for
2857+
* <a href="https://issues.apache.org/jira/browse/CALCITE-7433">[CALCITE-7433]
2858+
* Invalid unparse for cast to map type in Spark</a>.
2859+
*/
2860+
@Test void testCastMapSpark() {
2861+
final String query = "select cast(MAP['a',1,'b',2,'c',3]"
2862+
+ " as MAP<varchar,integer>)";
2863+
final String expectedSpark =
2864+
"SELECT CAST(MAP ('a', 1, 'b', 2, 'c', 3) AS MAP< STRING, INTEGER >)\n"
2865+
+ "FROM (VALUES (0)) `t` (`ZERO`)";
2866+
sql(query)
2867+
.withSpark().ok(expectedSpark);
2868+
2869+
final String query1 = "select cast(MAP['a',ARRAY[1,2,3]]"
2870+
+ " as MAP<varchar,integer array>)";
2871+
final String expectedSpark1 =
2872+
"SELECT CAST(MAP ('a', ARRAY (1, 2, 3)) AS MAP< STRING, ARRAY< INTEGER > >)\n"
2873+
+ "FROM (VALUES (0)) `t` (`ZERO`)";
2874+
sql(query1)
2875+
.withSpark().ok(expectedSpark1);
2876+
2877+
final String query2 = "select cast(MAP['a',ARRAY[1.0,2.0,3.0]]"
2878+
+ " as MAP<varchar,real array>)";
2879+
final String expectedSpark2 =
2880+
"SELECT CAST(MAP ('a', ARRAY (1.0, 2.0, 3.0)) AS MAP< STRING, ARRAY< REAL > >)\n"
2881+
+ "FROM (VALUES (0)) `t` (`ZERO`)";
2882+
sql(query2)
2883+
.withSpark().ok(expectedSpark2);
2884+
2885+
final String query3 = "select cast(MAP['a',MAP['b','c']]"
2886+
+ " as MAP<varchar,MAP<varchar,varchar>>)";
2887+
final String expectedSpark3 =
2888+
"SELECT CAST(MAP ('a', MAP ('b', 'c')) AS MAP< STRING, MAP< STRING, STRING > >)\n"
2889+
+ "FROM (VALUES (0)) `t` (`ZERO`)";
2890+
sql(query3)
2891+
.withSpark().ok(expectedSpark3);
2892+
}
2893+
28562894
/** Test case for
28572895
* <a href="https://issues.apache.org/jira/browse/CALCITE-7055">[CALCITE-7055]
28582896
* Invalid unparse for cast to array type in StarRocks</a>.

0 commit comments

Comments
 (0)