You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "yanjing.wang (Jira)" <ji...@apache.org> on 2021/06/23 03:51:00 UTC

[jira] [Updated] (CALCITE-4663) JoinConditionBasedPredicateInference doesn't simplify childPredicates which causes JoinPushTransitivePredicatesRule pulls up predicates infinitely and StackOverflowError

     [ https://issues.apache.org/jira/browse/CALCITE-4663?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

yanjing.wang updated CALCITE-4663:
----------------------------------
    Description: 
we can reproduce this problem through adding a test case like SortRemoveRuleTest.
{code:java}
public final class JoinPushTransitivePredicatesRuleTest {
  @Test
  void conjunctionTransitive() throws Exception {

    SchemaPlus rootSchema = Frameworks.createRootSchema(true);
    SchemaPlus defSchema = rootSchema.add("hr", new HrClusteredSchema());
    FrameworkConfig config = Frameworks.newConfigBuilder()
        .parserConfig(SqlParser.Config.DEFAULT)
        .defaultSchema(defSchema)
        .traitDefs(ConventionTraitDef.INSTANCE, RelCollationTraitDef.INSTANCE)
        .build();

    String sql = "select \"empid\" from \"hr\".\"emps\" where \"deptno\" in (select \"deptno\" from \"hr\".\"depts\" where \"deptno\" between 1000 and 2000)";
    Planner planner = Frameworks.getPlanner(config);
    SqlNode parse = planner.parse(sql);
    SqlNode validate = planner.validate(parse);
    RelRoot planRoot = planner.rel(validate);
    RelNode planBefore = planRoot.rel;
    HepProgram hepProgram = HepProgram.builder().addRuleCollection(
        Arrays.asList(
        CoreRules.FILTER_REDUCE_EXPRESSIONS,
        CoreRules.FILTER_SUB_QUERY_TO_CORRELATE,
        CoreRules.JOIN_PUSH_TRANSITIVE_PREDICATES)
    ).build();

    HepPlanner hepPlanner = new HepPlanner(hepProgram);
    hepPlanner.setRoot(planBefore);
    hepPlanner.findBestExp();
  }
}

{code}
Though we can add a *CoreRules.FILTER_REDUCE_EXPRESSIONS* before *CoreRules.JOIN_PUSH_TRANSITIVE_PREDICATES* as a workaround, but I think we can simplify left and right child predicates in JoinConditionBasedPredicateInference constructor.
{code:java}
leftChildPredicates = simplify.simplify(leftPredicates.accept(
    new RexPermuteInputsShuttle(leftMapping, joinRel.getInput(0))));

rightChildPredicates = simplify.simplify(rightPredicates.accept(
    new RexPermuteInputsShuttle(rightMapping, joinRel.getInput(1))));

{code}
 

 

  was:
we can reproduce this problem through adding a test case like SortRemoveRuleTest.

 
{code:java}

public final class JoinPushTransitivePredicatesRuleTest {
  @Test
  void conjunctionTransitive() throws Exception {

    SchemaPlus rootSchema = Frameworks.createRootSchema(true);
    SchemaPlus defSchema = rootSchema.add("hr", new HrClusteredSchema());
    FrameworkConfig config = Frameworks.newConfigBuilder()
        .parserConfig(SqlParser.Config.DEFAULT)
        .defaultSchema(defSchema)
        .traitDefs(ConventionTraitDef.INSTANCE, RelCollationTraitDef.INSTANCE)
        .build();

    String sql = "select \"empid\" from \"hr\".\"emps\" where \"deptno\" in (select \"deptno\" from \"hr\".\"depts\" where \"deptno\" between 1000 and 2000)";
    Planner planner = Frameworks.getPlanner(config);
    SqlNode parse = planner.parse(sql);
    SqlNode validate = planner.validate(parse);
    RelRoot planRoot = planner.rel(validate);
    RelNode planBefore = planRoot.rel;
    HepProgram hepProgram = HepProgram.builder().addRuleCollection(
        Arrays.asList(
        CoreRules.FILTER_REDUCE_EXPRESSIONS,
        CoreRules.FILTER_SUB_QUERY_TO_CORRELATE,
        CoreRules.JOIN_PUSH_TRANSITIVE_PREDICATES)
    ).build();

    HepPlanner hepPlanner = new HepPlanner(hepProgram);
    hepPlanner.setRoot(planBefore);
    hepPlanner.findBestExp();
  }
}

{code}
Though we can add a CoreRules.FILTER_REDUCE_EXPRESSIONS before  CoreRules.JOIN_PUSH_TRANSITIVE_PREDICATES, but I think we can simplify left and right child predicates in JoinConditionBasedPredicateInference constructor.
{code:java}

leftChildPredicates = simplify.simplify(leftPredicates.accept(
    new RexPermuteInputsShuttle(leftMapping, joinRel.getInput(0))));

rightChildPredicates = simplify.simplify(rightPredicates.accept(
    new RexPermuteInputsShuttle(rightMapping, joinRel.getInput(1))));

{code}
 

 


> JoinConditionBasedPredicateInference doesn't simplify childPredicates which causes JoinPushTransitivePredicatesRule pulls up predicates infinitely and StackOverflowError
> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CALCITE-4663
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4663
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.26.0, 1.27.0
>         Environment: jdk8
> calcite1.27.0
>            Reporter: yanjing.wang
>            Priority: Major
>
> we can reproduce this problem through adding a test case like SortRemoveRuleTest.
> {code:java}
> public final class JoinPushTransitivePredicatesRuleTest {
>   @Test
>   void conjunctionTransitive() throws Exception {
>     SchemaPlus rootSchema = Frameworks.createRootSchema(true);
>     SchemaPlus defSchema = rootSchema.add("hr", new HrClusteredSchema());
>     FrameworkConfig config = Frameworks.newConfigBuilder()
>         .parserConfig(SqlParser.Config.DEFAULT)
>         .defaultSchema(defSchema)
>         .traitDefs(ConventionTraitDef.INSTANCE, RelCollationTraitDef.INSTANCE)
>         .build();
>     String sql = "select \"empid\" from \"hr\".\"emps\" where \"deptno\" in (select \"deptno\" from \"hr\".\"depts\" where \"deptno\" between 1000 and 2000)";
>     Planner planner = Frameworks.getPlanner(config);
>     SqlNode parse = planner.parse(sql);
>     SqlNode validate = planner.validate(parse);
>     RelRoot planRoot = planner.rel(validate);
>     RelNode planBefore = planRoot.rel;
>     HepProgram hepProgram = HepProgram.builder().addRuleCollection(
>         Arrays.asList(
>         CoreRules.FILTER_REDUCE_EXPRESSIONS,
>         CoreRules.FILTER_SUB_QUERY_TO_CORRELATE,
>         CoreRules.JOIN_PUSH_TRANSITIVE_PREDICATES)
>     ).build();
>     HepPlanner hepPlanner = new HepPlanner(hepProgram);
>     hepPlanner.setRoot(planBefore);
>     hepPlanner.findBestExp();
>   }
> }
> {code}
> Though we can add a *CoreRules.FILTER_REDUCE_EXPRESSIONS* before *CoreRules.JOIN_PUSH_TRANSITIVE_PREDICATES* as a workaround, but I think we can simplify left and right child predicates in JoinConditionBasedPredicateInference constructor.
> {code:java}
> leftChildPredicates = simplify.simplify(leftPredicates.accept(
>     new RexPermuteInputsShuttle(leftMapping, joinRel.getInput(0))));
> rightChildPredicates = simplify.simplify(rightPredicates.accept(
>     new RexPermuteInputsShuttle(rightMapping, joinRel.getInput(1))));
> {code}
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)