-
Notifications
You must be signed in to change notification settings - Fork 3.7k
[feature](nereids) extend infer predicates #41731
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[feature](nereids) extend infer predicates #41731
Conversation
|
Thank you for your contribution to Apache Doris. Since 2024-03-18, the Document has been moved to doris-website. |
|
run buildall |
TPC-H: Total hot run time: 40780 ms |
TPC-DS: Total hot run time: 191738 ms |
ClickBench: Total hot run time: 32.84 s |
|
run p0 |
|
run cloud_p0 |
18a0ac7 to
2cce1c5
Compare
|
run buildall |
TPC-H: Total hot run time: 40535 ms |
|
run p0 |
TPC-DS: Total hot run time: 191755 ms |
ClickBench: Total hot run time: 33.09 s |
|
|
||
| @Override | ||
| public ImmutableSet<Expression> visit(Plan plan, Void context) { | ||
| if (plan.arity() == 1) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why not remain this and avoid override too many plan visitor whose pullup is disabled?
64c558c to
9588dc0
Compare
|
run buildall |
TPC-H: Total hot run time: 40725 ms |
TPC-DS: Total hot run time: 191611 ms |
ClickBench: Total hot run time: 32.98 s |
| } | ||
| case LEFT_OUTER_JOIN: | ||
| case LEFT_SEMI_JOIN: | ||
| case LEFT_ANTI_JOIN: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why anti join's predicate can be pulled up?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
e.g. select t1.a from test_like1 t1 left anti join test_like2 t2 on t1.a=t2.a where t1.a<10 , t1.a<10 can be pulled up, because all rows that left anti join outputs, t1.a<10 is satisfied.
9588dc0 to
35ee0fd
Compare
|
run buildall |
|
PR approved by anyone and no changes requested. |
TPC-H: Total hot run time: 40693 ms |
TPC-DS: Total hot run time: 191922 ms |
ClickBench: Total hot run time: 32.11 s |
[feature](nereids) add unequal predicates infer [feature](nereids) add unequal predicates infer [feature](nereids) add unequal predicates infer normalize unequal infer predicate 5>a to a<5 add regression res [feature](nereids) add unequal predicates infer [Feature](nereids) extend derivation of equivalence predicate [Feature](nereids) extend derivation of equivalence predicate [Feature](nereids) extend derivation of equivalence predicate literal should not be targetExpr and produce new predicate delete useless code delete useless code [Feature](nereids) extend derivation of equivalence predicate fix a=1 b=1 a=2 deduce to a=b [Feature](nereids) extend derivation of equivalence predicate [Feature](nereids) extend derivation of equivalence predicate [Feature](nereids) extend derivation of equivalence predicate [Feature](nereids) extend derivation of equivalence predicate add feut only support slot equalTo infer, remove the expr equalTo infer support fix feut change the logic of pull up predicate from join, and support a=1 b=1 infer a=b not infer same table predicates revert 'change the logic of pull up predicate from join, and support a=1 b=1 infer a=b' sort the equal set, and infer a=b a=c to b=c in order merge equal and unequal predicate infer fix feut prepare stmt not infer predicates support cast to unequal predicates fix regression fix regression do some print in regression use this function mv_rewrite_success_without_check_chosen in regression fix regression change hashset to linkedhashset in predicate infer to make predicate order stable sort input exprs by tosql in unequal infer to fix result, generate equalTo in unequal infer and change pull up join predicates when throw error in replace predicate, skip it and add cast check for decimalv3, and add feut for unequal predicate infer infer all different table equal(t1.a=t2.a) infer all different table equal(t1.a=t2.b=t3.c), but not infer when equal with literal(t1.a=t2.b=t3.c=1) delete deduceTransitiveEquality in ReplacePredicates support literal slot equal pair in ReplacePredicate fix checkstyle add comment add regression add boolean getAllPredicates in PullUpPredicates, to avoid redundant predicates. keep the order of predicates fix regression revert merge filter change(will affect preparestmt), and forbid null literal in infer, add try catch in generate fitlers not take null literal when build equal set not generate all literal predicates simplify PredicateInferUtils.inferPredicate adjust feut fix feut remove useless code, add comment fix name expand_graph
…l operator pull up predicates, other is forbidden
35ee0fd to
f19dfb2
Compare
|
run buildall |
TPC-H: Total hot run time: 40618 ms |
TPC-DS: Total hot run time: 192102 ms |
ClickBench: Total hot run time: 32.38 s |
|
run p0 |
|
PR approved by at least one committer and no changes requested. |
This pr refactors the PredicatePropagation module and adds support for predicate deduction, including: Support for predicate deduction of like, not in, !=; Support for predicate deduction of abs(b)=1 for a=b and abs(a)=1; Support for transitive deduction of non-equivalent relations, for example, a>b b>1 leads to a>1. Deleted useless predicates. But still has something to do in predicate inference: support expr in infer predicate, e.g. abs(t1.c1)>abs(t2.c2) and abs(t1.c1)<1 need to add expr qualifier info, to determine whether abs(t1.c1) and abs(t2.c2) is from same table.
This pr refactors the PredicatePropagation module and adds support for predicate deduction, including: Support for predicate deduction of like, not in, !=; Support for predicate deduction of abs(b)=1 for a=b and abs(a)=1; Support for transitive deduction of non-equivalent relations, for example, a>b b>1 leads to a>1. Deleted useless predicates. But still has something to do in predicate inference: support expr in infer predicate, e.g. abs(t1.c1)>abs(t2.c2) and abs(t1.c1)<1 need to add expr qualifier info, to determine whether abs(t1.c1) and abs(t2.c2) is from same table.
This pr refactors the PredicatePropagation module and adds support for predicate deduction, including: Support for predicate deduction of like, not in, !=; Support for predicate deduction of abs(b)=1 for a=b and abs(a)=1; Support for transitive deduction of non-equivalent relations, for example, a>b b>1 leads to a>1. Deleted useless predicates. But still has something to do in predicate inference: support expr in infer predicate, e.g. abs(t1.c1)>abs(t2.c2) and abs(t1.c1)<1 need to add expr qualifier info, to determine whether abs(t1.c1) and abs(t2.c2) is from same table.
This pr refactors the PredicatePropagation module and adds support for predicate deduction, including: Support for predicate deduction of like, not in, !=; Support for predicate deduction of abs(b)=1 for a=b and abs(a)=1; Support for transitive deduction of non-equivalent relations, for example, a>b b>1 leads to a>1. Deleted useless predicates. But still has something to do in predicate inference: support expr in infer predicate, e.g. abs(t1.c1)>abs(t2.c2) and abs(t1.c1)<1 need to add expr qualifier info, to determine whether abs(t1.c1) and abs(t2.c2) is from same table.
This pr refactors the PredicatePropagation module and adds support for predicate deduction, including: Support for predicate deduction of like, not in, !=; Support for predicate deduction of abs(b)=1 for a=b and abs(a)=1; Support for transitive deduction of non-equivalent relations, for example, a>b b>1 leads to a>1. Deleted useless predicates. But still has something to do in predicate inference: support expr in infer predicate, e.g. abs(t1.c1)>abs(t2.c2) and abs(t1.c1)<1 need to add expr qualifier info, to determine whether abs(t1.c1) and abs(t2.c2) is from same table.
) ### What problem does this PR solve? Related PR: #41731 Problem Summary: The optimizer cannot derive predicates across multiple LEFT JOINs. For example, given a filter on the leftmost table in a chain of LEFT JOINs, the optimizer should be able to derive predicates on the rightmost table, but it currently fails to do so. create table t1(a int, b int); create table t2(a int, b int); create table t3(a int, b int); insert into t1 values(1,2); insert into t2 values(1,2); insert into t3 values(1,2); insert into t3 values(null,2); explain logical plan select * from t1 left join t2 on t1.a=t2.a left join t3 on t2.a=t3.a where t1.a=1; LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] ) |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] ) | +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] ) | |--LogicalFilter[101] ( predicates=(a#0 = 1) ) | | +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] ) | +--LogicalFilter[103] ( predicates=(a#2 = 1) ) | +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] ) +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] ) The optimizer should derive t3.a=1 from t1.a=1 and the join conditions, but it currently doesn't. The root cause is that the PullUpPredicates rule doesn't properly handle predicate pull-up from the right side of LEFT JOINs. This PR fixes this by generating null-tolerant predicates when pulling up from RIGHT JOIN's right table and strengthening them when possible based on upper-level join conditions. after this pr: LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] ) |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] ) | +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] ) | |--LogicalFilter[101] ( predicates=(a#0 = 1) ) | | +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] ) | +--LogicalFilter[103] ( predicates=(a#2 = 1) ) | +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] ) +--LogicalFilter[107] ( predicates=(a#4 = 1) ) +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] )
…che#58372) Related PR: apache#41731 Problem Summary: The optimizer cannot derive predicates across multiple LEFT JOINs. For example, given a filter on the leftmost table in a chain of LEFT JOINs, the optimizer should be able to derive predicates on the rightmost table, but it currently fails to do so. create table t1(a int, b int); create table t2(a int, b int); create table t3(a int, b int); insert into t1 values(1,2); insert into t2 values(1,2); insert into t3 values(1,2); insert into t3 values(null,2); explain logical plan select * from t1 left join t2 on t1.a=t2.a left join t3 on t2.a=t3.a where t1.a=1; LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] ) |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] ) | +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] ) | |--LogicalFilter[101] ( predicates=(a#0 = 1) ) | | +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] ) | +--LogicalFilter[103] ( predicates=(a#2 = 1) ) | +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] ) +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] ) The optimizer should derive t3.a=1 from t1.a=1 and the join conditions, but it currently doesn't. The root cause is that the PullUpPredicates rule doesn't properly handle predicate pull-up from the right side of LEFT JOINs. This PR fixes this by generating null-tolerant predicates when pulling up from RIGHT JOIN's right table and strengthening them when possible based on upper-level join conditions. after this pr: LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] ) |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] ) | +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] ) | |--LogicalFilter[101] ( predicates=(a#0 = 1) ) | | +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] ) | +--LogicalFilter[103] ( predicates=(a#2 = 1) ) | +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] ) +--LogicalFilter[107] ( predicates=(a#4 = 1) ) +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] )
…che#58372) Related PR: apache#41731 Problem Summary: The optimizer cannot derive predicates across multiple LEFT JOINs. For example, given a filter on the leftmost table in a chain of LEFT JOINs, the optimizer should be able to derive predicates on the rightmost table, but it currently fails to do so. create table t1(a int, b int); create table t2(a int, b int); create table t3(a int, b int); insert into t1 values(1,2); insert into t2 values(1,2); insert into t3 values(1,2); insert into t3 values(null,2); explain logical plan select * from t1 left join t2 on t1.a=t2.a left join t3 on t2.a=t3.a where t1.a=1; LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] ) |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] ) | +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] ) | |--LogicalFilter[101] ( predicates=(a#0 = 1) ) | | +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] ) | +--LogicalFilter[103] ( predicates=(a#2 = 1) ) | +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] ) +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] ) The optimizer should derive t3.a=1 from t1.a=1 and the join conditions, but it currently doesn't. The root cause is that the PullUpPredicates rule doesn't properly handle predicate pull-up from the right side of LEFT JOINs. This PR fixes this by generating null-tolerant predicates when pulling up from RIGHT JOIN's right table and strengthening them when possible based on upper-level join conditions. after this pr: LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] ) |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] ) | +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] ) | |--LogicalFilter[101] ( predicates=(a#0 = 1) ) | | +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] ) | +--LogicalFilter[103] ( predicates=(a#2 = 1) ) | +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] ) +--LogicalFilter[107] ( predicates=(a#4 = 1) ) +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] )
…che#58372) ### What problem does this PR solve? Related PR: apache#41731 Problem Summary: The optimizer cannot derive predicates across multiple LEFT JOINs. For example, given a filter on the leftmost table in a chain of LEFT JOINs, the optimizer should be able to derive predicates on the rightmost table, but it currently fails to do so. create table t1(a int, b int); create table t2(a int, b int); create table t3(a int, b int); insert into t1 values(1,2); insert into t2 values(1,2); insert into t3 values(1,2); insert into t3 values(null,2); explain logical plan select * from t1 left join t2 on t1.a=t2.a left join t3 on t2.a=t3.a where t1.a=1; LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] ) |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] ) | +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] ) | |--LogicalFilter[101] ( predicates=(a#0 = 1) ) | | +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] ) | +--LogicalFilter[103] ( predicates=(a#2 = 1) ) | +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] ) +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] ) The optimizer should derive t3.a=1 from t1.a=1 and the join conditions, but it currently doesn't. The root cause is that the PullUpPredicates rule doesn't properly handle predicate pull-up from the right side of LEFT JOINs. This PR fixes this by generating null-tolerant predicates when pulling up from RIGHT JOIN's right table and strengthening them when possible based on upper-level join conditions. after this pr: LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] ) +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] ) |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] ) | +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] ) | |--LogicalFilter[101] ( predicates=(a#0 = 1) ) | | +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] ) | +--LogicalFilter[103] ( predicates=(a#2 = 1) ) | +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] ) +--LogicalFilter[107] ( predicates=(a#4 = 1) ) +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] )
This pr refactors the PredicatePropagation module and adds support for predicate deduction, including:
Support for predicate deduction of like, not in, !=;
Support for predicate deduction of abs(b)=1 for a=b and abs(a)=1;
Support for transitive deduction of non-equivalent relations, for example, a>b b>1 leads to a>1.
Deleted useless predicates.
But still has something to do in predicate inference:
support expr in infer predicate, e.g. abs(t1.c1)>abs(t2.c2) and abs(t1.c1)<1
need to add expr qualifier info, to determine whether abs(t1.c1) and abs(t2.c2) is from same table.
tpcds 1000 total time
before pr:
689804 | 554230 | 550065 | 546197
after pr:
670477 | 551991 | 544594 | 542985
No performance degradation was observed