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]

Reply via email to