You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2021/10/13 19:09:17 UTC
[calcite] 10/11: [CALCITE-4740] JDBC adapter generates incorrect
HAVING clause in BigQuery dialect
This is an automated email from the ASF dual-hosted git repository.
jhyde pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
commit e20f8819e8017e9bde7317a43f2c56cb39bdab8d
Author: hannerwang <ha...@tencent.com>
AuthorDate: Wed Aug 25 16:48:09 2021 +0800
[CALCITE-4740] JDBC adapter generates incorrect HAVING clause in BigQuery dialect
Close apache/calcite#2504
---
.../apache/calcite/rel/rel2sql/SqlImplementor.java | 5 +++--
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 24 ++++++++++++++++++++++
2 files changed, 27 insertions(+), 2 deletions(-)
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 5e35f4f..1773a28 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
@@ -1682,13 +1682,14 @@ public abstract class SqlImplementor {
switch (selectItem.getKind()) {
case AS:
final SqlCall asCall = (SqlCall) selectItem;
- if (aliasRef) {
+ SqlNode alias = asCall.operand(1);
+ if (aliasRef && !SqlUtil.isGeneratedAlias(((SqlIdentifier) alias).getSimple())) {
// For BigQuery, given the query
// SELECT SUM(x) AS x FROM t HAVING(SUM(t.x) > 0)
// we can generate
// SELECT SUM(x) AS x FROM t HAVING(x > 0)
// because 'x' in HAVING resolves to the 'AS x' not 't.x'.
- return asCall.operand(1);
+ return alias;
}
return asCall.operand(0);
default:
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 50f66c6..1b700f3 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
@@ -6167,6 +6167,30 @@ class RelToSqlConverterTest {
.withBigQuery().ok(expected);
}
+ /** Test case for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-4740">[CALCITE-4740]
+ * JDBC adapter generates incorrect HAVING clause in BigQuery dialect</a>. */
+ @Test void testBigQueryHavingWithoutGeneratedAlias() {
+ final String sql = ""
+ + "SELECT \"DEPTNO\", COUNT(DISTINCT \"EMPNO\")\n"
+ + "FROM \"EMP\"\n"
+ + "GROUP BY \"DEPTNO\"\n"
+ + "HAVING COUNT(DISTINCT \"EMPNO\") > 0\n"
+ + "ORDER BY COUNT(DISTINCT \"EMPNO\") DESC";
+ final String expected = ""
+ + "SELECT DEPTNO, COUNT(DISTINCT EMPNO)\n"
+ + "FROM SCOTT.EMP\n"
+ + "GROUP BY DEPTNO\n"
+ + "HAVING COUNT(DISTINCT EMPNO) > 0\n"
+ + "ORDER BY COUNT(DISTINCT EMPNO) IS NULL DESC, COUNT(DISTINCT EMPNO) DESC";
+
+ // Convert rel node to SQL with BigQuery dialect,
+ // in which "isHavingAlias" is true.
+ sql(sql)
+ .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
+ .withBigQuery().ok(expected);
+ }
+
/** Fluid interface to run tests. */
static class Sql {
private final CalciteAssert.SchemaSpec schemaSpec;