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());
}