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

zhenchen 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 05399a86be [CALCITE-6829] MSSQL dialect incorrectly translates of 
SELECT TRUE
05399a86be is described below

commit 05399a86be4b53e5bb8c6bf125b6fb1d69e9b1a7
Author: Zhen Chen <[email protected]>
AuthorDate: Fri Jan 9 17:20:25 2026 +0800

    [CALCITE-6829] MSSQL dialect incorrectly translates of SELECT TRUE
---
 .../src/main/java/org/apache/calcite/sql/SqlWriter.java |  9 +++++++++
 .../org/apache/calcite/sql/dialect/MssqlSqlDialect.java | 17 ++++++++++++++++-
 .../org/apache/calcite/sql/pretty/SqlPrettyWriter.java  |  8 ++++++++
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java      | 13 +++++++++++++
 4 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/core/src/main/java/org/apache/calcite/sql/SqlWriter.java 
b/core/src/main/java/org/apache/calcite/sql/SqlWriter.java
index 57982fb2ab..9682f9c99f 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlWriter.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlWriter.java
@@ -548,6 +548,11 @@ SqlWriter list(FrameTypeEnum frameType, SqlBinaryOperator 
sepOp,
    */
   boolean inQuery();
 
+  /** Returns the current frame. */
+  default @Nullable Frame getCurrentFrame() {
+    return null;
+  }
+
   //~ Inner Interfaces -------------------------------------------------------
 
   /**
@@ -568,6 +573,10 @@ SqlWriter list(FrameTypeEnum frameType, SqlBinaryOperator 
sepOp,
    * the sub-frame is put onto a stack.
    */
   interface Frame {
+    /** Returns the type of this frame. */
+    default @Nullable FrameType getFrameType() {
+      return null;
+    }
   }
 
   /** Frame type. */
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 7f9907b081..2387ed54d9 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
@@ -197,7 +197,22 @@ public MssqlSqlDialect(Context context) {
     if (value == null) {
       return;
     }
-    unparseBoolLiteralToCondition(writer, value);
+
+    SqlWriter.Frame frame = writer.getCurrentFrame();
+    boolean expressionAllowed = true;
+    if (frame != null) {
+      SqlWriter.FrameType frameType = frame.getFrameType();
+      if (frameType == SqlWriter.FrameTypeEnum.SELECT_LIST
+          || frameType == SqlWriter.FrameTypeEnum.VALUES) {
+        expressionAllowed = false;
+      }
+    }
+
+    if (expressionAllowed) {
+      unparseBoolLiteralToCondition(writer, value);
+    } else {
+      writer.literal(value ? "1" : "0");
+    }
   }
 
   @Override public boolean supportsApproxCountDistinct() {
diff --git 
a/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java 
b/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java
index 2269ecec49..95fdfd27c2 100644
--- a/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java
+++ b/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java
@@ -930,6 +930,10 @@ public String format(SqlNode node) {
     return dialect;
   }
 
+  @Override public @Nullable Frame getCurrentFrame() {
+    return listStack.peek();
+  }
+
   @Override public void literal(String s) {
     print(s);
     setNeedWhitespace(true);
@@ -1135,6 +1139,10 @@ protected class FrameImpl implements Frame {
     final String open;
     final String close;
 
+    @Override public @Nullable FrameType getFrameType() {
+      return frameType;
+    }
+
     private final int left;
     /**
      * Indent of sub-frame with respect to this one.
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 fb975386c0..5a9b278c35 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
@@ -11098,6 +11098,19 @@ private void checkLiteral2(String expression, String 
expected) {
         .ok(expected);
   }
 
+  /** Test case of
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-6829";>[CALCITE-6829]
+   * MSSQL dialect incorrectly translates of SELECT TRUE</a>. */
+  @Test void testMssqlSelectTrue() {
+    final String query = "SELECT TRUE";
+    final String expected = "SELECT *\nFROM (VALUES (1)) AS [t] ([EXPR$0])";
+    sql(query).withMssql().ok(expected);
+
+    final String query2 = "SELECT * FROM (VALUES (TRUE))";
+    final String expected2 = "SELECT *\nFROM (VALUES (1)) AS [t] ([EXPR$0])";
+    sql(query2).withMssql().ok(expected2);
+  }
+
   /** Test case of
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7319";>[CALCITE-7319]
    * FILTER_INTO_JOIN rule loses correlation variable context in 
HepPlanner</a>. */

Reply via email to