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

xiong 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 f0ce9ea898 [CALCITE-6825] Add support for ALL, SOME, ANY in 
RelToSqlConverter
f0ce9ea898 is described below

commit f0ce9ea8987fe7df1a41a5223d6180c6dfeea620
Author: wangdiao <[email protected]>
AuthorDate: Tue Mar 4 16:58:58 2025 +0800

    [CALCITE-6825] Add support for ALL, SOME, ANY in RelToSqlConverter
    
    Explicitly use ALL for the judgment in SqlQuantifyOperator#not
---
 .../apache/calcite/rel/rel2sql/SqlImplementor.java |  2 ++
 .../calcite/sql/fun/SqlQuantifyOperator.java       | 42 ++++++++++++++++++++++
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java | 21 +++++++++++
 3 files changed, 65 insertions(+)

diff --git 
a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java 
b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
index 470c9ada2e..a0733b6924 100644
--- a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
+++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
@@ -776,6 +776,8 @@ public SqlNode toSql(@Nullable RexProgram program, RexNode 
rex) {
         return new SqlDynamicParam(caseParam.getIndex(), POS);
 
       case IN:
+      case SOME:
+      case ALL:
         subQuery = (RexSubQuery) rex;
         sqlSubQuery = implementor().visitRoot(subQuery.rel).asQueryOrValues();
         final List<RexNode> operands = subQuery.operands;
diff --git 
a/core/src/main/java/org/apache/calcite/sql/fun/SqlQuantifyOperator.java 
b/core/src/main/java/org/apache/calcite/sql/fun/SqlQuantifyOperator.java
index c8409377a6..c07d63edba 100644
--- a/core/src/main/java/org/apache/calcite/sql/fun/SqlQuantifyOperator.java
+++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlQuantifyOperator.java
@@ -21,6 +21,7 @@
 import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.SqlNodeList;
+import org.apache.calcite.sql.SqlOperator;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.sql.type.SqlTypeUtil;
 import org.apache.calcite.sql.validate.SqlValidator;
@@ -118,4 +119,45 @@ public class SqlQuantifyOperator extends SqlInOperator {
     }
     return null;
   }
+
+  @Override public SqlOperator not() {
+    switch (kind) {
+    case SOME:
+      switch (comparisonKind) {
+      case EQUALS:
+        return SqlStdOperatorTable.ALL_NE;
+      case NOT_EQUALS:
+        return SqlStdOperatorTable.ALL_EQ;
+      case LESS_THAN_OR_EQUAL:
+        return SqlStdOperatorTable.ALL_GT;
+      case LESS_THAN:
+        return SqlStdOperatorTable.ALL_GE;
+      case GREATER_THAN_OR_EQUAL:
+        return SqlStdOperatorTable.ALL_LT;
+      case GREATER_THAN:
+        return SqlStdOperatorTable.ALL_LE;
+      default:
+        throw new AssertionError("unexpected SOME comparisonKind " + kind);
+      }
+    case ALL:
+      switch (comparisonKind) {
+      case EQUALS:
+        return SqlStdOperatorTable.SOME_NE;
+      case NOT_EQUALS:
+        return SqlStdOperatorTable.SOME_EQ;
+      case LESS_THAN_OR_EQUAL:
+        return SqlStdOperatorTable.SOME_GT;
+      case LESS_THAN:
+        return SqlStdOperatorTable.SOME_GE;
+      case GREATER_THAN_OR_EQUAL:
+        return SqlStdOperatorTable.SOME_LT;
+      case GREATER_THAN:
+        return SqlStdOperatorTable.SOME_LE;
+      default:
+        throw new AssertionError("unexpected ALL comparisonKind " + kind);
+      }
+    default:
+      throw new AssertionError("unexpected " + kind);
+    }
+  }
 }
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 59e1e34114..ff49aac7fc 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
@@ -9458,6 +9458,27 @@ private void checkLiteral2(String expression, String 
expected) {
     assertEquals(project, forceProject);
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-6825";>[CALCITE-6825]
+   * Add support for ALL, SOME, ANY in RelToSqlConverter</a>. */
+  @Test void testSome() {
+    final String sql = "SELECT 1, \"gross_weight\" < SOME(SELECT 
\"gross_weight\" "
+        + "FROM \"foodmart\".\"product\") AS \"t\" "
+        + "FROM \"foodmart\".\"product\"";
+    final String expected = "SELECT 1, \"gross_weight\" < SOME (SELECT 
\"gross_weight\"\n"
+        + "FROM \"foodmart\".\"product\") AS \"t\"\nFROM 
\"foodmart\".\"product\"";
+    sql(sql).ok(expected);
+  }
+
+  @Test void testAll() {
+    final String sql = "SELECT 1, \"gross_weight\" < ALL(SELECT 
\"gross_weight\" "
+        + "FROM \"foodmart\".\"product\") AS \"t\" "
+        + "FROM \"foodmart\".\"product\"";
+    final String expected = "SELECT 1, \"gross_weight\" < ALL (SELECT 
\"gross_weight\"\n"
+        + "FROM \"foodmart\".\"product\") AS \"t\"\nFROM 
\"foodmart\".\"product\"";
+    sql(sql).ok(expected);
+  }
+
   /** Fluid interface to run tests. */
   static class Sql {
     private final CalciteAssert.SchemaSpec schemaSpec;

Reply via email to