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>. */