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

zabetak 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 c5502965d9 [CALCITE-6879] Support APPROX_DISTINCT_COUNT for more 
dialects
c5502965d9 is described below

commit c5502965d9eee9544afd862f2292d4d423bbc98b
Author: xuzifu666 <[email protected]>
AuthorDate: Sun Mar 9 21:44:37 2025 +0800

    [CALCITE-6879] Support APPROX_DISTINCT_COUNT for more dialects
    
    Close apache/calcite#4234
---
 .../apache/calcite/sql/dialect/ClickHouseSqlDialect.java | 12 ++++++++++++
 .../org/apache/calcite/sql/dialect/MssqlSqlDialect.java  |  4 ++++
 .../apache/calcite/sql/dialect/PhoenixSqlDialect.java    |  4 ++++
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java       | 16 ++++++++++++++--
 4 files changed, 34 insertions(+), 2 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java
index ee692380f1..4cde76631f 100644
--- 
a/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java
+++ 
b/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java
@@ -30,9 +30,11 @@
 import org.apache.calcite.sql.SqlTimeLiteral;
 import org.apache.calcite.sql.SqlTimestampLiteral;
 import org.apache.calcite.sql.SqlWriter;
+import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.parser.SqlParserPos;
 import org.apache.calcite.sql.type.BasicSqlType;
 import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.calcite.util.RelToSqlConverterUtil;
 
 import org.checkerframework.checker.nullness.qual.Nullable;
 
@@ -56,6 +58,10 @@ public ClickHouseSqlDialect(Context context) {
     super(context);
   }
 
+  @Override public boolean supportsApproxCountDistinct() {
+    return true;
+  }
+
   @Override public boolean supportsCharSet() {
     return false;
   }
@@ -169,6 +175,12 @@ private static SqlDataTypeSpec 
createSqlDataTypeSpecByName(String typeAlias,
 
   @Override public void unparseCall(SqlWriter writer, SqlCall call,
       int leftPrec, int rightPrec) {
+    if (call.getOperator() == SqlStdOperatorTable.APPROX_COUNT_DISTINCT) {
+      RelToSqlConverterUtil.specialOperatorByName("UNIQ")
+          .unparse(writer, call, 0, 0);
+      return;
+    }
+
     switch (call.getKind()) {
     case FLOOR:
       if (call.operandCount() != 2) {
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 712f6d898f..7f9907b081 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
@@ -200,6 +200,10 @@ public MssqlSqlDialect(Context context) {
     unparseBoolLiteralToCondition(writer, value);
   }
 
+  @Override public boolean supportsApproxCountDistinct() {
+    return true;
+  }
+
   @Override public boolean supportsCharSet() {
     return false;
   }
diff --git 
a/core/src/main/java/org/apache/calcite/sql/dialect/PhoenixSqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/dialect/PhoenixSqlDialect.java
index 50e456425a..3d1b7b853a 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/PhoenixSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/PhoenixSqlDialect.java
@@ -33,6 +33,10 @@ public PhoenixSqlDialect(Context context) {
     super(context);
   }
 
+  @Override public boolean supportsApproxCountDistinct() {
+    return true;
+  }
+
   @Override public boolean supportsCharSet() {
     return false;
   }
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 6d59536d23..4f74a8e332 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
@@ -8097,8 +8097,13 @@ private void checkLiteral2(String expression, String 
expected) {
         + "FROM \"foodmart\".\"product\"";
     final String expectedPrestoSql = "SELECT APPROX_DISTINCT(\"product_id\")\n"
         + "FROM \"foodmart\".\"product\"";
-    final String expectedStarRocksSql = "SELECT 
APPROX_COUNT_DISTINCT(`product_id`)\n"
+    final String expectedStarRocksSql = expectedApprox;
+    final String expectedMssql = "SELECT APPROX_COUNT_DISTINCT([product_id])\n"
+        + "FROM [foodmart].[product]";
+    final String expectedPhoenix = expectedApproxQuota;
+    final String expectedClickhouse = "SELECT UNIQ(`product_id`)\n"
         + "FROM `foodmart`.`product`";
+
     sql(query).ok(expectedExact)
         .withHive().ok(expectedApprox)
         .withSpark().ok(expectedApprox)
@@ -8106,7 +8111,10 @@ private void checkLiteral2(String expression, String 
expected) {
         .withOracle().ok(expectedApproxQuota)
         .withSnowflake().ok(expectedApproxQuota)
         .withPresto().ok(expectedPrestoSql)
-        .withStarRocks().ok(expectedStarRocksSql);
+        .withStarRocks().ok(expectedStarRocksSql)
+        .withMssql().ok(expectedMssql)
+        .withPhoenix().ok(expectedPhoenix)
+        .withClickHouse().ok(expectedClickhouse);
   }
 
   @Test void testRowValueExpression() {
@@ -9419,6 +9427,10 @@ Sql withOracle(int majorVersion) {
               .withNullCollation(oracleDialect.getNullCollation())));
     }
 
+    Sql withPhoenix() {
+      return dialect(DatabaseProduct.PHOENIX.getDialect());
+    }
+
     Sql withPostgresql() {
       return dialect(DatabaseProduct.POSTGRESQL.getDialect());
     }

Reply via email to