[
https://issues.apache.org/jira/browse/CALCITE-6946?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17943308#comment-17943308
]
Julian Hyde commented on CALCITE-6946:
--------------------------------------
I agree that these transformations should not be done unconditionally. CNF, DNF
and all canonical forms have their problems (and particular expressions where
they exhibit exponential growth).
So, putting these transformations into a rel-rule that can be selectively
enabled makes sense. (Even better, the transformed expression would be
discarded if the rule fails to achieve its goal.)
But my main point is that {{RexUtil}} has functions {{{}toCnf{}}}, {{toDnf}}
and {{pullFactors}} that transform {{RexNode}} to {{{}RexNode{}}}. This task
must use those functions if possible, add to their tests, or if absolutely
necessary, introduce new functions that work in a similar way and are
rigorously documented and tested.
> Expand predicates from disjunction for inputs of Join
> -----------------------------------------------------
>
> Key: CALCITE-6946
> URL: https://issues.apache.org/jira/browse/CALCITE-6946
> Project: Calcite
> Issue Type: New Feature
> Components: core
> Affects Versions: 1.39.0
> Reporter: Silun Dong
> Assignee: Silun Dong
> Priority: Major
>
> Similar to Calcite-6914, we can expand redundant predicates from the
> disjunction and push them down. However, the predicates expanded by
> Calcite-6914 must belong to a single table, that is, if join_type does not
> restrict pushdown, the redundant predicates can be pushed directly on
> TableScan.
> However, pushing predicates down to the inputs of Join is also very useful
> ([link|https://github.com/apache/calcite/pull/4267#discussion_r2021576009]),
> for example:
> {code:java}
> select t1.id from t1, t2, t3
> where t1.id = t2.id
> and t1.id = t3.id
> and (
> (t1.age < 50 and t3.age > 20)
> or
> (t2.weight > 70 and t3.height < 180)
> ) {code}
> Because {{(t1.age < 50 and t3.age > 20) or (t2.weight > 70 and t3.height <
> 180)}} a is a disjunction and involves multiple tables, it cannot be pushed
> down.
> However, we can expand it to {{(t1.age < 50 or t2.weight > 70)}} ,
> {{{}(t3.age > 20 or t3.height < 180){}}}, and push them down to both sides of
> Join.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)