This is an automated email from the ASF dual-hosted git repository.

xiedeyantu 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 a7c3457827 [CALCITE-7768] SqlDialect has no way to unparse a UUID 
literal
a7c3457827 is described below

commit a7c34578272f35284229f1481a512482073bd2f9
Author: Jerome Haltom <[email protected]>
AuthorDate: Mon Sep 7 19:26:51 2026 -0500

    [CALCITE-7768] SqlDialect has no way to unparse a UUID literal
---
 core/src/main/java/org/apache/calcite/sql/SqlDialect.java        | 9 +++++++++
 core/src/main/java/org/apache/calcite/sql/SqlUuidLiteral.java    | 2 +-
 .../java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java     | 6 ++++++
 .../org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java    | 9 +++++++++
 4 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/core/src/main/java/org/apache/calcite/sql/SqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
index 82e12c93d2..06fd392a97 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
@@ -579,6 +579,15 @@ public void unparseTableScanHints(SqlWriter writer,
       SqlNodeList hints, int leftPrec, int rightPrec) {
   }
 
+  /** Converts a UUID literal to a SQL string. The default implementation
+   * returns strings such as
+   * <code>UUID '123e4567-e89b-12d3-a456-426655440000'</code>. A dialect whose
+   * product spells it differently should override this method. */
+  public void unparseUuidLiteral(SqlWriter writer,
+      SqlUuidLiteral literal, int leftPrec, int rightPrec) {
+    writer.literal(literal.toString());
+  }
+
   /**
    * Returns whether the string contains any characters outside the
    * comfortable 7-bit ASCII range (32 through 127, plus linefeed (10) and
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlUuidLiteral.java 
b/core/src/main/java/org/apache/calcite/sql/SqlUuidLiteral.java
index 9a1d165a1f..65f089a5d4 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlUuidLiteral.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlUuidLiteral.java
@@ -58,6 +58,6 @@ public String toFormattedString() {
       SqlWriter writer,
       int leftPrec,
       int rightPrec) {
-    writer.literal(this.toString());
+    writer.getDialect().unparseUuidLiteral(writer, this, leftPrec, rightPrec);
   }
 }
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 2cea9608d0..3f663f6fb4 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
@@ -38,6 +38,7 @@
 import org.apache.calcite.sql.SqlOperator;
 import org.apache.calcite.sql.SqlSyntax;
 import org.apache.calcite.sql.SqlUtil;
+import org.apache.calcite.sql.SqlUuidLiteral;
 import org.apache.calcite.sql.SqlWriter;
 import org.apache.calcite.sql.fun.SqlLibraryOperators;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
@@ -200,6 +201,11 @@ private static SqlNode createDatetimeCastSpec(String 
typeAlias, RelDataType type
     writer.literal("'" + literal.toFormattedString() + "'");
   }
 
+  @Override public void unparseUuidLiteral(SqlWriter writer,
+      SqlUuidLiteral literal, int leftPrec, int rightPrec) {
+    writer.literal("'" + literal.toFormattedString() + "'");
+  }
+
   @Override public void unparseCall(SqlWriter writer, SqlCall call,
       int leftPrec, int rightPrec) {
     if (call.getOperator() == SqlStdOperatorTable.SUBSTRING) {
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 e854771afc..7b23fd5d0a 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
@@ -11010,6 +11010,15 @@ private void checkLiteral2(String expression, String 
expected) {
     sql(sql).ok(expected);
   }
 
+  /** Test case for <a 
href="https://issues.apache.org/jira/browse/CALCITE-7768";>[CALCITE-7768]
+   * SqlDialect has no way to unparse a UUID literal</a>. */
+  @Test void testUuidMssql() {
+    final String sql = "SELECT UUID '123e4567-e89b-12d3-a456-426655440000' AS 
x";
+    final String expected = "SELECT *\n"
+        + "FROM (VALUES ('123e4567-e89b-12d3-a456-426655440000')) AS [t] 
([X])";
+    sql(sql).withMssql().ok(expected);
+  }
+
   @Test void testUpdate() {
     final String sql0 = "update \"foodmart\".\"product\"\n"
         + "set \"product_name\" = 'calcite'";

Reply via email to