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)