This is an automated email from the ASF dual-hosted git repository.
kangkaisen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new c4c37a4 Rewritten subquery in having clause (#3206)
c4c37a4 is described below
commit c4c37a4394368a49704e374c0567a5d96c455205
Author: EmmyMiao87 <[email protected]>
AuthorDate: Thu Mar 26 21:13:57 2020 +0800
Rewritten subquery in having clause (#3206)
The subquery in having clause should be rewritten too.
If not, ExprRewriteRule will not be apply in subquery.
For example:
select k1, sum (k2) from table group by k1 having sum(k2) > (select t1 from
table2 where t2 between 1 and 2);
```t1 between 1 and 2``` should be rewritten to ```t1 >=1 and t1<=2```.
Fixed #3205. TPC-DS 14 will be passed after this commit.
---
fe/src/main/java/org/apache/doris/analysis/SelectStmt.java | 12 +++++++-----
.../java/org/apache/doris/analysis/StmtRewriterTest.java | 12 ++++++++++++
2 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/fe/src/main/java/org/apache/doris/analysis/SelectStmt.java
b/fe/src/main/java/org/apache/doris/analysis/SelectStmt.java
index c86b40d..0675bee 100644
--- a/fe/src/main/java/org/apache/doris/analysis/SelectStmt.java
+++ b/fe/src/main/java/org/apache/doris/analysis/SelectStmt.java
@@ -1228,17 +1228,19 @@ public class SelectStmt extends QueryStmt {
for (TableRef ref : fromClause_) {
ref.rewriteExprs(rewriter, analyzer);
}
+ // Also rewrite exprs in the statements of subqueries.
+ List<Subquery> subqueryExprs = Lists.newArrayList();
if (whereClause != null) {
whereClause = rewriter.rewrite(whereClause, analyzer);
- // Also rewrite exprs in the statements of subqueries.
- List<Subquery> subqueryExprs = Lists.newArrayList();
whereClause.collect(Subquery.class, subqueryExprs);
- for (Subquery s : subqueryExprs) {
- s.getStatement().rewriteExprs(rewriter);
- }
+
}
if (havingClause != null) {
havingClause = rewriter.rewrite(havingClause, analyzer);
+ havingClauseAfterAnaylzed.collect(Subquery.class, subqueryExprs);
+ }
+ for (Subquery subquery : subqueryExprs) {
+ subquery.getStatement().rewriteExprs(rewriter);
}
if (groupByClause != null) {
ArrayList<Expr> groupingExprs = groupByClause.getGroupingExprs();
diff --git a/fe/src/test/java/org/apache/doris/analysis/StmtRewriterTest.java
b/fe/src/test/java/org/apache/doris/analysis/StmtRewriterTest.java
index 7f8aac7..77e1d4b 100644
--- a/fe/src/test/java/org/apache/doris/analysis/StmtRewriterTest.java
+++ b/fe/src/test/java/org/apache/doris/analysis/StmtRewriterTest.java
@@ -596,6 +596,18 @@ public class StmtRewriterTest {
"order by: <slot 10> ASC", "OUTPUT EXPRS:<slot 11> | <slot
10>", "limit: 100");
}
+ /**
+ * ISSUE-3205
+ */
+ @Test
+ public void testRewriteHavingClauseWithBetweenAndInSubquery() throws
Exception {
+ String subquery = "select avg(salary) from " + TABLE_NAME + " where
empid between 1 and 2";
+ String query = "select empid a, sum(salary) b from " + TABLE_NAME + "
group by a having b > (" +
+ subquery + ");";
+ dorisAssert.query(query).explainContains(
+ "CROSS JOIN", "predicates: <slot 3> > <slot 9>", "`empid` >=
1, `empid` <= 2");
+ }
+
@AfterClass
public static void afterClass() throws Exception {
UtFrameUtils.cleanDorisFeDir(baseDir);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]