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)