GitHub user zuyu opened a pull request:

    https://github.com/apache/incubator-quickstep/pull/268

    Skip predicate pushdown if the node's input is a base relation.

    Assigned to @jianqiao.
    
    This small PR fixed the bug in PR #174 that we may have two identical 
`Selection`s due to the predicate pushdown. The fix avoids such case by 
skipping the pushdown if and only if a node's input is a base table.
    
    For the following test query in `Partition.test`:
    
    ```
    SELECT fact.id, test.char_col
    FROM test JOIN fact ON test.int_col = fact.id
    WHERE test.int_col > 0 OR test.int_col < 0;
    ```
    
    Previously to this PR, we would generate a bad plan with two same 
`Selection`s.
    ```
    9: I0708 15:31:29.931959 3661849536 PhysicalGenerator.cpp:192] After 
applying rule PruneColumns:
    9: TopLevelPlan
    9: +-plan=HashJoin
    9: | +-left=Selection
    9: | | +-input=TableReference[relation=Test,alias=test]
    9: | | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
    9: | | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
    9: | | | +-AttributeReference[id=2,name=float_col,relation=test,type=Float]
    9: | | | 
+-AttributeReference[id=3,name=double_col,relation=test,type=Double NULL]
    9: | | | 
+-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
    9: | | +-filter_predicate=Or
    9: | | | +-Greater
    9: | | | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int 
NULL]
    9: | | | | +-Literal[value=0,type=Int]
    9: | | | +-Less
    9: | | |   +-AttributeReference[id=0,name=int_col,relation=test,type=Int 
NULL]
    9: | | |   +-Literal[value=0,type=Int]
    9: | | +-project_expressions=
    9: | |   +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
    9: | |   
+-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
    9: | +-right=TableReference[relation=fact,
    9: | | output_partition_scheme_header=PARTITION BY HASH ( { 5 } ) 
PARTITIONS 4]
    9: | | +-AttributeReference[id=5,name=id,relation=fact,type=Int NULL]
    9: | | +-AttributeReference[id=6,name=score,relation=fact,type=Double NULL]
    9: | +-project_expressions=
    9: | | +-AttributeReference[id=5,name=id,relation=fact,type=Int NULL]
    9: | | +-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
    9: | +-left_join_attributes=
    9: | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
    9: | +-right_join_attributes=
    9: |   +-AttributeReference[id=5,name=id,relation=fact,type=Int NULL]
    9: +-output_attributes=
    9:   +-AttributeReference[id=5,name=id,relation=fact,type=Int NULL]
    9:   +-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
    9: I0708 15:31:29.932862 3661849536 PhysicalGenerator.cpp:192] After 
applying rule PushDownLowCostDisjunctivePredicate:
    9: TopLevelPlan
    9: +-plan=HashJoin
    9: | +-left=Selection
    9: | | +-input=Selection
    9: | | | +-input=TableReference[relation=Test,alias=test]
    9: | | | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int 
NULL]
    9: | | | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
    9: | | | | 
+-AttributeReference[id=2,name=float_col,relation=test,type=Float]
    9: | | | | 
+-AttributeReference[id=3,name=double_col,relation=test,type=Double NULL]
    9: | | | | 
+-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
    9: | | | +-filter_predicate=Or
    9: | | | | +-Greater
    9: | | | | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int 
NULL]
    9: | | | | | +-Literal[value=0,type=Int]
    9: | | | | +-Less
    9: | | | |   +-AttributeReference[id=0,name=int_col,relation=test,type=Int 
NULL]
    9: | | | |   +-Literal[value=0,type=Int]
    9: | | | +-project_expressions=
    9: | | |   +-AttributeReference[id=0,name=int_col,relation=test,type=Int 
NULL]
    9: | | |   +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
    9: | | |   
+-AttributeReference[id=2,name=float_col,relation=test,type=Float]
    9: | | |   
+-AttributeReference[id=3,name=double_col,relation=test,type=Double NULL]
    9: | | |   
+-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
    9: | | +-filter_predicate=Or
    9: | | | +-Greater
    9: | | | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int 
NULL]
    9: | | | | +-Literal[value=0,type=Int]
    9: | | | +-Less
    9: | | |   +-AttributeReference[id=0,name=int_col,relation=test,type=Int 
NULL]
    9: | | |   +-Literal[value=0,type=Int]
    9: | | +-project_expressions=
    9: | |   +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
    9: | |   
+-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
    9: | +-right=TableReference[relation=fact,
    9: | | output_partition_scheme_header=PARTITION BY HASH ( { 5 } ) 
PARTITIONS 4]
    9: | | +-AttributeReference[id=5,name=id,relation=fact,type=Int NULL]
    9: | | +-AttributeReference[id=6,name=score,relation=fact,type=Double NULL]
    9: | +-project_expressions=
    9: | | +-AttributeReference[id=5,name=id,relation=fact,type=Int NULL]
    9: | | +-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
    9: | +-left_join_attributes=
    9: | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
    9: | +-right_join_attributes=
    9: |   +-AttributeReference[id=5,name=id,relation=fact,type=Int NULL]
    9: +-output_attributes=
    9:   +-AttributeReference[id=5,name=id,relation=fact,type=Int NULL]
    9:   +-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
    ```


You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/zuyu/incubator-quickstep 
skip-predicate-pushdown

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/incubator-quickstep/pull/268.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #268
    
----
commit 7a1d827fb584074840ae9523fb910295af6f9c25
Author: Zuyu Zhang <z...@cs.wisc.edu>
Date:   2017-07-09T22:44:19Z

    Skip predicate pushdown if the node's input is a base relation.

----


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastruct...@apache.org or file a JIRA ticket
with INFRA.
---

Reply via email to