This is an automated email from the ASF dual-hosted git repository.
morrysnow 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 1617368ee1 [fix](planner) fix bug of push constant conjuncts through
set operation node (#22695)
1617368ee1 is described below
commit 1617368ee11e2ae27a0c9752888ff472a3763556
Author: starocean999 <[email protected]>
AuthorDate: Tue Aug 8 12:25:42 2023 +0800
[fix](planner) fix bug of push constant conjuncts through set operation
node (#22695)
when pushing down constant conjunct into set operation node, we should
assign the conjunct to agg node if there is one. This is consistant with
pushing constant conjunct into inlineview.
---
.../apache/doris/planner/SingleNodePlanner.java | 13 ++++-
.../data/correctness_p0/test_distinct_agg.out | 4 ++
.../suites/correctness_p0/test_distinct_agg.groovy | 58 ++++++++++++++++++++--
3 files changed, 69 insertions(+), 6 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
index 7cc6ae7cd2..8cf889d995 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
@@ -2374,7 +2374,18 @@ public class SingleNodePlanner {
// Forbid to register Conjuncts with SelectStmt' tuple when
Select is constant
if ((queryStmt instanceof SelectStmt) && selectHasTableRef) {
final SelectStmt select = (SelectStmt) queryStmt;
- op.getAnalyzer().registerConjuncts(opConjuncts,
select.getTableRefIds());
+ // if there is an agg node, we need register the constant
conjuncts on agg node's tuple
+ // this is consistent with migrateConstantConjuncts()
+ if (select.getAggInfo() != null) {
+ Map<Boolean, List<Expr>> splittedConjuncts =
opConjuncts.stream()
+ .collect(Collectors.partitioningBy(expr ->
expr.isConstant()));
+
op.getAnalyzer().registerConjuncts(splittedConjuncts.get(true),
+
select.getAggInfo().getOutputTupleId().asList());
+
op.getAnalyzer().registerConjuncts(splittedConjuncts.get(false),
+ select.getTableRefIds());
+ } else {
+ op.getAnalyzer().registerConjuncts(opConjuncts,
select.getTableRefIds());
+ }
} else if (queryStmt instanceof SetOperationStmt) {
final SetOperationStmt subSetOp = (SetOperationStmt)
queryStmt;
op.getAnalyzer().registerConjuncts(opConjuncts,
subSetOp.getTupleId().asList());
diff --git a/regression-test/data/correctness_p0/test_distinct_agg.out
b/regression-test/data/correctness_p0/test_distinct_agg.out
new file mode 100644
index 0000000000..b70da182ee
--- /dev/null
+++ b/regression-test/data/correctness_p0/test_distinct_agg.out
@@ -0,0 +1,4 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !select1 --
+本日
+
diff --git a/regression-test/suites/correctness_p0/test_distinct_agg.groovy
b/regression-test/suites/correctness_p0/test_distinct_agg.groovy
index ea2cd1f4a4..788f5271a6 100644
--- a/regression-test/suites/correctness_p0/test_distinct_agg.groovy
+++ b/regression-test/suites/correctness_p0/test_distinct_agg.groovy
@@ -16,10 +16,10 @@
// under the License.
suite("test_distinct_agg") {
- sql 'drop table if exists t'
+ sql 'drop table if exists test_distinct_agg_t'
sql '''
- CREATE TABLE `t` (
+ CREATE TABLE `test_distinct_agg_t` (
`k1` bigint(20) NULL,
`k2` varchar(20) NULL,
`k3` varchar(20) NULL,
@@ -35,7 +35,7 @@ suite("test_distinct_agg") {
'''
sql '''
- INSERT INTO `t` (`k1`, `k2`, `k3`, `k4`, `k5`, `k6`) VALUES
+ INSERT INTO `test_distinct_agg_t` (`k1`, `k2`, `k3`, `k4`, `k5`, `k6`)
VALUES
(1, '1234', 'A0', 'C0', '1', '2023-01-10 23:00:00');
'''
@@ -47,7 +47,7 @@ suite("test_distinct_agg") {
k5,
date_format(k6, '%Y-%m-%d') as k6,
count(distinct k3) as k3
- from t
+ from test_distinct_agg_t
where 1=1
group by k5, k6
) AS temp where 1=1
@@ -65,8 +65,56 @@ suite("test_distinct_agg") {
(SELECT `k6` AS `dt`,
`k1` AS `role_id`,
sum(CAST(`k2` AS INT)) AS `cost`
- FROM `t`
+ FROM `test_distinct_agg_t`
GROUP BY `dt`, `role_id`) a
GROUP BY `dt`) b
WHERE `dt` = '2023-06-18';'''
+
+ sql 'drop view if exists dim_v2'
+ sql '''create
+ view `dim_v2` COMMENT 'VIEW' as
+ select
+ curdate() as `calday`,
+ '本日' as `date_tag`
+ from
+ `test_distinct_agg_t`
+ union all
+ select
+ distinct curdate() as `calday`
+ , '本年' as `date_tag`
+ from
+ `test_distinct_agg_t` t1
+ union all
+ select
+ distinct `t1`.`k1` as `calday`
+ , '上年' as `date_tag`
+ from
+ `test_distinct_agg_t` t1;'''
+
+ sql 'drop view if exists dim_v3'
+ sql '''create
+ view `dim_v3` COMMENT 'VIEW' as
+ select
+ case
+ when `t`.`date_tag` = '月_T+1' then '本月'
+ else `t`.`date_tag`
+ end
+ as `date_tag`
+ from
+ `dim_v2` t
+ left outer join (
+ select
+ distinct `date_tag` as `date_tag`
+ from
+ `dim_v2`
+ ) t1 on
+ `t`.`date_tag` = `t1`.`date_tag`
+ group by
+ 1;'''
+
+ qt_select1 '''select distinct date_tag from dim_v3 where date_tag='本日';'''
+
+ sql 'drop view if exists dim_v2'
+ sql 'drop view if exists dim_v3'
+ sql 'drop table if exists test_distinct_agg_t'
}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]