This is an automated email from the ASF dual-hosted git repository. mbudiu pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/calcite.git
commit a124dc7bee1195085d333515a2af57cbeb388870 Author: Mihai Budiu <[email protected]> AuthorDate: Fri Jan 9 15:09:44 2026 -0800 [CALCITE-7366] RexLiteral.valueMatchesType throws for a MAP type Signed-off-by: Mihai Budiu <[email protected]> --- core/src/main/java/org/apache/calcite/rex/RexLiteral.java | 1 + .../java/org/apache/calcite/sql/type/SqlTypeCoercionRule.java | 6 ++++-- .../java/org/apache/calcite/test/SqlToRelConverterTest.java | 7 +++++++ .../org/apache/calcite/test/SqlToRelConverterTest.xml | 11 +++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/apache/calcite/rex/RexLiteral.java b/core/src/main/java/org/apache/calcite/rex/RexLiteral.java index 2dc8249208..a1e42c50a6 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLiteral.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLiteral.java @@ -397,6 +397,7 @@ public static boolean valueMatchesType( return value instanceof List; case GEOMETRY: return value instanceof Geometry; + case MAP: case ANY: // Literal of type ANY is not legal. "CAST(2 AS ANY)" remains // an integer literal surrounded by a cast function. diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeCoercionRule.java b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeCoercionRule.java index 59fb82fd19..91eea17b4d 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeCoercionRule.java +++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeCoercionRule.java @@ -167,22 +167,24 @@ private SqlTypeCoercionRule(Map<SqlTypeName, ImmutableSet<SqlTypeName>> map) { .build()); } - // BINARY is castable from VARBINARY, CHARACTERS. + // BINARY is castable from VARBINARY, CHARACTERS, INTEGERS coerceRules.add(SqlTypeName.BINARY, coerceRules.copyValues(SqlTypeName.BINARY) .add(SqlTypeName.VARBINARY) .addAll(SqlTypeName.CHAR_TYPES) .add(SqlTypeName.UUID) .addAll(SqlTypeName.INT_TYPES) + .addAll(SqlTypeName.UNSIGNED_TYPES) .build()); - // VARBINARY is castable from BINARY, CHARACTERS. + // VARBINARY is castable from BINARY, CHARACTERS, INTEGERS coerceRules.add(SqlTypeName.VARBINARY, coerceRules.copyValues(SqlTypeName.VARBINARY) .add(SqlTypeName.BINARY) .addAll(SqlTypeName.CHAR_TYPES) .add(SqlTypeName.UUID) .addAll(SqlTypeName.INT_TYPES) + .addAll(SqlTypeName.UNSIGNED_TYPES) .build()); // VARCHAR is castable from BOOLEAN, DATE, TIME, TIMESTAMP, numeric types, binary, uuid, and diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java index 3e7d178ee6..8a485421cf 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java @@ -882,6 +882,13 @@ public static void checkActualAndReferenceFiles() { sql(sql).ok(); } + /** Test case for <a href="https://issues.apache.org/jira/browse/CALCITE-7366">[CALCITE-7366] + * RexLiteral.valueMatchesType throws for a MAP type</a>. */ + @Test void testStringToMapCast() { + final String sql = "SELECT CAST('a' AS MAP<INT, INT>)"; + sql(sql).ok(); + } + @Test void testGroupBug281b() { // Try to confuse it with spurious columns. final String sql = "select name, foo from (\n" diff --git a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml index 23be5c89da..57dc035f9c 100644 --- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml @@ -8138,6 +8138,17 @@ from orders]]> LogicalDelta LogicalProject(ROWTIME=[$0], PRODUCTID=[$1], ORDERID=[$2], C=[COUNT() OVER (PARTITION BY $1 ORDER BY $0 RANGE 1000:INTERVAL SECOND PRECEDING)]) LogicalTableScan(table=[[CATALOG, SALES, ORDERS]]) +]]> + </Resource> + </TestCase> + <TestCase name="testStringToMapCast"> + <Resource name="sql"> + <![CDATA[SELECT CAST('a' AS MAP<INT, INT>)]]> + </Resource> + <Resource name="plan"> + <![CDATA[ +LogicalProject(EXPR$0=[CAST('a'):(INTEGER NOT NULL, INTEGER) MAP NOT NULL]) + LogicalValues(tuples=[[{ 0 }]]) ]]> </Resource> </TestCase>
