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;