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

commit f56eb5f6460d059ab622d169be60373e599433fd
Author: Mihai Budiu <[email protected]>
AuthorDate: Mon Jun 29 13:56:07 2026 -0700

    [CALCITE-7630] BETWEEN unparses incorrectly when left side contains a 
BETWEEN expression
    
    Signed-off-by: Mihai Budiu <[email protected]>
---
 .../main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java | 4 ++++
 .../java/org/apache/calcite/sql/test/SqlPrettyWriterTest.java    | 9 +++++++++
 .../org/apache/calcite/sql/test/SqlPrettyWriterTest.xml          | 5 +++++
 3 files changed, 18 insertions(+)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java 
b/core/src/main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java
index 2d77fd9df7..7d11e510a2 100644
--- a/core/src/main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java
+++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java
@@ -269,6 +269,10 @@ private static class AndFinder extends 
SqlBasicVisitor<Void> {
       if (operator == SqlStdOperatorTable.AND) {
         throw Util.FoundOne.NULL;
       }
+      // A BETWEEN expression contains an implicit AND keyword
+      if (call.getKind() == SqlKind.BETWEEN) {
+        throw Util.FoundOne.NULL;
+      }
       return super.visit(call);
     }
 
diff --git 
a/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterTest.java 
b/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterTest.java
index 03c65fce99..4bef9b541d 100644
--- a/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterTest.java
@@ -314,6 +314,15 @@ private SqlPrettyWriterFixture tableDotStar() {
     // space
   }
 
+  /** Test case for <a 
href="https://issues.apache.org/jira/browse/CALCITE-7630";>[CALCITE-7630]
+   * BETWEEN unparses incorrectly when left side contains a BETWEEN 
expression</a>. */
+  @Test void testBetweenAnd3() {
+    expr("a not between (b between c and d) and e")
+        .expectingFormatted(
+            "`A` NOT BETWEEN ASYMMETRIC (`B` BETWEEN ASYMMETRIC `C` AND `D`) 
AND `E`")
+        .check();
+  }
+
   @Test void testCast() {
     expr("cast(x + y as decimal(5, 10))")
         .expectingFormatted("CAST(`X` + `Y` AS DECIMAL(5, 10))")
diff --git 
a/core/src/test/resources/org/apache/calcite/sql/test/SqlPrettyWriterTest.xml 
b/core/src/test/resources/org/apache/calcite/sql/test/SqlPrettyWriterTest.xml
index bf4d3a76b8..32f337f0f4 100644
--- 
a/core/src/test/resources/org/apache/calcite/sql/test/SqlPrettyWriterTest.xml
+++ 
b/core/src/test/resources/org/apache/calcite/sql/test/SqlPrettyWriterTest.xml
@@ -21,6 +21,11 @@
       <![CDATA[`X` NOT BETWEEN SYMMETRIC `Y` AND `Z`]]>
     </Resource>
   </TestCase>
+  <TestCase name="testBetweenAnd3">
+    <Resource name="formatted">
+      <![CDATA[`A` NOT BETWEEN ASYMMETRIC (`B` BETWEEN ASYMMETRIC `C` AND `D`) 
AND `E`]]>
+    </Resource>
+  </TestCase>
   <TestCase name="testBlackSubQueryStyle">
     <Resource name="formatted">
       <![CDATA[SELECT `X` AS `A`, `B` AS `B`, `C` AS `C`, `D`, 'mixed-Case 
string', `UNQUOTEDCAMELCASEID`, `quoted id`

Reply via email to