yanjing.wang created CALCITE-4663:
-------------------------------------

             Summary: 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.27.0, 1.26.0
         Environment: jdk8

calcite1.27.0
            Reporter: yanjing.wang


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}
 

 



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

Reply via email to