From 599ba4529c78be4e5afb143120745cbe8408b17c Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Tue, 4 Jul 2023 10:52:36 +0800 Subject: [PATCH] [fix](nereids) need run ConvertInnerOrCrossJoin rule again after EliminateNotNull (#21346) after running EliminateNotNull rule, the join conjuncts may be removed from inner join node. So need run ConvertInnerOrCrossJoin rule to convert inner join with no join conjuncts to cross join node. --- .../doris/nereids/jobs/executor/Rewriter.java | 3 ++- .../java/org/apache/doris/nereids/memo/Group.java | 13 ++++++------- .../correctness_p0/test_case_when_decimal.out | 3 +++ .../correctness_p0/test_case_when_decimal.groovy | 15 +++++++++++++++ 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java index 970c5009f9..a97fc4a2d4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java @@ -207,7 +207,8 @@ public class Rewriter extends AbstractBatchJobExecutor { ), // eliminate useless not null or inferred not null // TODO: wait InferPredicates to infer more not null. - bottomUp(new EliminateNotNull()) + bottomUp(new EliminateNotNull()), + topDown(new ConvertInnerOrCrossJoin()) ), topic("Column pruning and infer predicate", custom(RuleType.COLUMN_PRUNING, ColumnPruning::new), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java index 3987047371..cfaeae6009 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java @@ -21,7 +21,6 @@ import org.apache.doris.common.Pair; import org.apache.doris.nereids.cost.Cost; import org.apache.doris.nereids.properties.LogicalProperties; import org.apache.doris.nereids.properties.PhysicalProperties; -import org.apache.doris.nereids.trees.expressions.literal.Literal; import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; @@ -377,12 +376,12 @@ public class Group { */ public boolean isInnerJoinGroup() { Plan plan = getLogicalExpression().getPlan(); - if (plan instanceof LogicalJoin) { - // Right now, we only support inner join with some join conditions - return ((LogicalJoin) plan).getJoinType() == JoinType.INNER_JOIN - && (((LogicalJoin) plan).getOtherJoinConjuncts().isEmpty() - || !(((LogicalJoin) plan).getOtherJoinConjuncts() - .get(0) instanceof Literal)); + if (plan instanceof LogicalJoin + && ((LogicalJoin) plan).getJoinType() == JoinType.INNER_JOIN) { + // Right now, we only support inner join + Preconditions.checkArgument(!((LogicalJoin) plan).getExpressions().isEmpty(), + "inner join must have join conjuncts"); + return true; } return false; } diff --git a/regression-test/data/correctness_p0/test_case_when_decimal.out b/regression-test/data/correctness_p0/test_case_when_decimal.out index 76a2895bab..1a888306ed 100644 --- a/regression-test/data/correctness_p0/test_case_when_decimal.out +++ b/regression-test/data/correctness_p0/test_case_when_decimal.out @@ -5,3 +5,6 @@ -- !sql2 -- 4.41 +-- !sql3 -- +4.41 + diff --git a/regression-test/suites/correctness_p0/test_case_when_decimal.groovy b/regression-test/suites/correctness_p0/test_case_when_decimal.groovy index 88fde3a194..baf7f52690 100644 --- a/regression-test/suites/correctness_p0/test_case_when_decimal.groovy +++ b/regression-test/suites/correctness_p0/test_case_when_decimal.groovy @@ -80,6 +80,21 @@ suite("test_case_when_decimal") { FROM decimal_to_double_table2 T001, decimal_to_double_table1 T101 ) t; """ + sql "set enable_dphyp_optimizer=true;" + qt_sql3 """ + SELECT sum(v24) + FROM ( select + CASE + WHEN 1=0 THEN + 0.00 + ELSE round((CASE + WHEN T001.cust_no = '86193' THEN + 0 + ELSE COALESCE(T101.bar_averageday_asset,0.0) END) * T101.bar_averageday_asset,2) + END v24 + FROM decimal_to_double_table2 T001, decimal_to_double_table1 T101 ) t; + """ + sql """ DROP TABLE IF EXISTS `decimal_to_double_table1`; """ sql """ DROP TABLE IF EXISTS `decimal_to_double_table2`; """ }