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