This is an automated email from the ASF dual-hosted git repository.
mihaibudiu 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 ffcae4bf2c [CALCITE-7756] Invalid unparse for VARCHAR without
precision in MssqlSqlDialect
ffcae4bf2c is described below
commit ffcae4bf2c58ccca7df318c652a985ad50ba646d
Author: Guanyu Chen <[email protected]>
AuthorDate: Sun Sep 20 21:14:49 2026 -0700
[CALCITE-7756] Invalid unparse for VARCHAR without precision in
MssqlSqlDialect
---
.../calcite/sql/dialect/MssqlSqlDialect.java | 11 +++++++++
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 26 ++++++++++++++++++++++
2 files changed, 37 insertions(+)
diff --git
a/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java
b/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java
index 3f663f6fb4..e8b680ba87 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java
@@ -109,6 +109,17 @@ public MssqlSqlDialect(Context context) {
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
// SQL Server's timezone-aware date/time type.
return createDatetimeCastSpec("DATETIMEOFFSET", type);
+ case VARCHAR:
+ // SQL Server interprets a bare VARCHAR in a CAST as VARCHAR(30).
+ // Fix the precision to VARCHAR(MAX) if it is unspecified, so that the
+ // CAST does not truncate the value.
+ if (type.getPrecision() == RelDataType.PRECISION_NOT_SPECIFIED) {
+ return new SqlDataTypeSpec(
+ new SqlAlienSystemTypeNameSpec("VARCHAR(MAX)",
+ SqlTypeName.VARCHAR, SqlParserPos.ZERO),
+ SqlParserPos.ZERO);
+ }
+ return super.getCastSpec(type);
default:
return super.getCastSpec(type);
}
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 cf04d3a63a..3ca31df695 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
@@ -1969,6 +1969,32 @@ private static RelNode sqlToRel(String sql, SchemaPlus
defaultSchema,
is("DATETIMEOFFSET(7)"));
}
+ /**
+ * Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-7756">[CALCITE-7756]
+ * Invalid unparse for VARCHAR without precision in MssqlSqlDialect</a>.
+ */
+ @Test void testCastToVarcharNoPrecisionMssql() {
+ final String query = "select cast(\"full_name\" as varchar)\n"
+ + "from \"employee\"";
+ final String expected = "SELECT CAST([full_name] AS VARCHAR(MAX))\n"
+ + "FROM [foodmart].[employee]";
+ sql(query).withMssql().ok(expected);
+ }
+
+ /**
+ * Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-7756">[CALCITE-7756]
+ * Invalid unparse for VARCHAR without precision in MssqlSqlDialect</a>.
+ */
+ @Test void testCastToVarcharWithPrecisionMssql() {
+ final String query = "select cast(\"full_name\" as varchar(100))\n"
+ + "from \"employee\"";
+ final String expected = "SELECT CAST([full_name] AS VARCHAR(100))\n"
+ + "FROM [foodmart].[employee]";
+ sql(query).withMssql().ok(expected);
+ }
+
/**
* Test case for
* <a
href="https://issues.apache.org/jira/browse/CALCITE-4706">[CALCITE-4706]