From 47c11a81ee6b2b95385082e9d892ff3cce2df4bb Mon Sep 17 00:00:00 2001 From: starocean999 <12095047@qq.com> Date: Thu, 24 Nov 2022 10:48:16 +0800 Subject: [PATCH 1/2] [fix](agg)having clause should use column name first then alias --- .../main/java/org/apache/doris/analysis/QueryStmt.java | 9 +++------ .../main/java/org/apache/doris/analysis/SelectStmt.java | 9 ++++++++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java index ca79d02e387f0f..d0aa94177d160c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java @@ -419,23 +419,20 @@ protected void substituteOrdinalsAliases(List exprs, String errorPrefix, // alias substitution is not performed in the same way. Expr substituteExpr = trySubstituteOrdinal(expr, errorPrefix, analyzer); if (substituteExpr == null) { - substituteExpr = expr.trySubstitute(aliasSMap, analyzer, false); if (aliasFirst) { substituteExpr = expr.trySubstitute(aliasSMap, analyzer, false); - i.set(substituteExpr); } else { try { // use col name from tableRefs first - expr.analyze(analyzer); + substituteExpr = expr.clone(); + substituteExpr.analyze(analyzer); } catch (AnalysisException ex) { // then consider alias name substituteExpr = expr.trySubstitute(aliasSMap, analyzer, false); - i.set(substituteExpr); } } - } else { - i.set(substituteExpr); } + i.set(substituteExpr); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java index fc4a82839c9939..7c952b5d41aae2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java @@ -969,7 +969,14 @@ private void analyzeAggregation(Analyzer analyzer) throws AnalysisException { * (select min(k1) from table b where a.key=b.k2); * TODO: the a.key should be replaced by a.k1 instead of unknown column 'key' in 'a' */ - havingClauseAfterAnaylzed = havingClause.substitute(aliasSMap, analyzer, false); + try { + // use col name from tableRefs first + havingClauseAfterAnaylzed = havingClause.clone(); + havingClauseAfterAnaylzed.analyze(analyzer); + } catch (AnalysisException ex) { + // then consider alias name + havingClauseAfterAnaylzed = havingClause.substitute(aliasSMap, analyzer, false); + } havingClauseAfterAnaylzed = rewriteQueryExprByMvColumnExpr(havingClauseAfterAnaylzed, analyzer); havingClauseAfterAnaylzed.checkReturnsBool("HAVING clause", true); if (groupingInfo != null) { From ae97bbf50e50f4e80a08a428f238a2516e4a795d Mon Sep 17 00:00:00 2001 From: starocean999 <12095047@qq.com> Date: Fri, 25 Nov 2022 14:51:39 +0800 Subject: [PATCH 2/2] fix fe ut --- .../src/test/java/org/apache/doris/analysis/QueryStmtTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/QueryStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/QueryStmtTest.java index e1dd1fe62f23b4..f7a4a8debce035 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/QueryStmtTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/QueryStmtTest.java @@ -246,7 +246,7 @@ public void testCollectExprs() throws Exception { stmt = (QueryStmt) UtFrameUtils.parseAndAnalyzeStmt(sql, ctx); exprsMap.clear(); stmt.collectExprs(exprsMap); - Assert.assertEquals(15, exprsMap.size()); + Assert.assertEquals(17, exprsMap.size()); constMap.clear(); constMap = getConstantExprMap(exprsMap, analyzer); Assert.assertEquals(4, constMap.size());