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'";