This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 25b427d0c6 [Bugfix](inpredicate) fix in predicate in group by clause
may cause NPE (#11886)
25b427d0c6 is described below
commit 25b427d0c659144f86d1417036393fe6b8887903
Author: Zhengguo Yang <[email protected]>
AuthorDate: Sun Aug 21 10:03:30 2022 +0800
[Bugfix](inpredicate) fix in predicate in group by clause may cause NPE
(#11886)
* [bug](inpredicate) fix in predicate in group by clause may cause NPE
---
.../doris/rewrite/RewriteInPredicateRule.java | 8 +++++--
.../data/query_p0/aggregate/aggregate.out | 13 +++++++++++
.../suites/query_p0/aggregate/aggregate.groovy | 25 ++++++++++++++++++++++
3 files changed, 44 insertions(+), 2 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteInPredicateRule.java
b/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteInPredicateRule.java
index f6f6b9bc3f..6a1a3a059b 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteInPredicateRule.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteInPredicateRule.java
@@ -55,8 +55,12 @@ public class RewriteInPredicateRule implements
ExprRewriteRule {
}
InPredicate inPredicate = (InPredicate) expr;
SlotRef slotRef;
- if (inPredicate.contains(Subquery.class) ||
!inPredicate.isLiteralChildren() || inPredicate.isNotIn()
- || !(inPredicate.getChild(0).unwrapExpr(false) instanceof
SlotRef)
+ // When the select stmt contains group by, we use oriGroupingExprs to
store the original group by statement
+ // and reset it with the rewritten groupingExpr. Therefore,
origroupingexprs cannot be analyzed.
+ // However, in #4197, oriGroupingExprs is rewritten to fix the problem
of constant fold.
+ // The newly added InPredicteRewriteRule requires that expr must be
analyzed before being rewritten
+ if (!inPredicate.isAnalyzed() || inPredicate.contains(Subquery.class)
|| !inPredicate.isLiteralChildren()
+ || inPredicate.isNotIn() ||
!(inPredicate.getChild(0).unwrapExpr(false) instanceof SlotRef)
|| (slotRef = inPredicate.getChild(0).getSrcSlotRef()) == null
|| slotRef.getColumn() == null) {
return expr;
}
diff --git a/regression-test/data/query_p0/aggregate/aggregate.out
b/regression-test/data/query_p0/aggregate/aggregate.out
index 8116f6ae15..c23317e7e9 100644
--- a/regression-test/data/query_p0/aggregate/aggregate.out
+++ b/regression-test/data/query_p0/aggregate/aggregate.out
@@ -110,6 +110,19 @@ TESTING AGAIN
18000
26988
+-- !aggregate --
+\N other 98.52
+12 other 12.25
+25 other 55.52
+100 again 99.8777
+100 other 11.668833333333334
+964 again 0.245
+5000 other 67.87
+5252 sample 12.25
+5748 sample 67.87
+6000 other \N
+8996 other 98.8777
+
-- !aggregate1 --
\N \N
-32767 2147484649
diff --git a/regression-test/suites/query_p0/aggregate/aggregate.groovy
b/regression-test/suites/query_p0/aggregate/aggregate.groovy
index 61bcd3f4bd..8053479c1c 100644
--- a/regression-test/suites/query_p0/aggregate/aggregate.groovy
+++ b/regression-test/suites/query_p0/aggregate/aggregate.groovy
@@ -110,6 +110,31 @@ suite("aggregate") {
qt_aggregate """ select variance(c_bigint), variance(distinct c_double)
from ${tableName} """
qt_aggregate """ select 1 k1, 2 k2, c_bigint k3, sum(c_double) from
${tableName} group by 1, k2, k3 order by k1, k2, k3 """
qt_aggregate """ select (k1 + k2) * k3 k4 from (select 1 k1, 2 k2,
c_bigint k3, sum(c_double) from ${tableName} group by 1, k2, k3) t order by k4
"""
+ qt_aggregate """
+ SELECT c_bigint,
+ CASE
+ WHEN c_string IN ('sample', 'Sample') THEN
+ 'sample'
+ WHEN c_string IN ('Again', 'AGAIN') THEN
+ 'again'
+ ELSE 'other' end, avg(c_double)
+ FROM ${tableName}
+ GROUP BY c_bigint,
+ CASE
+ WHEN c_string IN ('sample', 'Sample') THEN
+ 'sample'
+ WHEN c_string IN ('Again', 'AGAIN') THEN
+ 'again'
+ ELSE 'other'
+ END
+ ORDER BY c_bigint,
+ CASE
+ WHEN c_string IN ('sample', 'Sample') THEN
+ 'sample'
+ WHEN c_string IN ('Again', 'AGAIN') THEN
+ 'again'
+ ELSE 'other' end
+ """
sql "use test_query_db"
List<String> fields = ["k1", "k2", "k3", "k4", "k5", "k6", "k10", "k11",
"k7", "k8", "k9"]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]