You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Vitalii Diravka (JIRA)" <ji...@apache.org> on 2018/03/02 19:42:00 UTC

[jira] [Created] (CALCITE-2200) Infinite loop for JoinPushTransitivePredicatesRule

Vitalii Diravka created CALCITE-2200:
----------------------------------------

             Summary: Infinite loop for JoinPushTransitivePredicatesRule
                 Key: CALCITE-2200
                 URL: https://issues.apache.org/jira/browse/CALCITE-2200
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.15.0
            Reporter: Vitalii Diravka
            Assignee: Julian Hyde
             Fix For: next


Infinite loop is obtained while using FilterIntoJoinRule + JoinPushTransitivePredicatesRule in HEP planner for some correlated queries, for instance:
select d.deptno from sales.emp d where d.deptno IN (select e.deptno from sales.emp e where e.deptno = d.deptno or e.deptno = 4)

{code}
  @Test public void testJoinPushTransitivePredicatesRule() {
    HepProgram preProgram = new HepProgramBuilder()
        .addRuleInstance(FilterJoinRule.FILTER_ON_JOIN)
        .addRuleInstance(FilterJoinRule.JOIN)
        .addRuleInstance(JoinPushTransitivePredicatesRule.INSTANCE)
        .build();

    HepProgramBuilder builder = new HepProgramBuilder();
    HepPlanner hepPlanner = new HepPlanner(builder.build());

    final String sql = "select d.deptno from sales.emp d where d.deptno\n"
        + "IN (select e.deptno from sales.emp e "
        + "where e.deptno = d.deptno or e.deptno = 4)";
    TesterImpl tester = new TesterImpl(getDiffRepos(), true, false, true, false, null, null);
    checkPlanning(tester, preProgram, hepPlanner, sql);
  }
{code}

{code}
java.lang.StackOverflowError
	at org.apache.calcite.util.mapping.Mappings$PartialFunctionImpl.<init>(Mappings.java:1568)
	at org.apache.calcite.util.mapping.Mappings.create(Mappings.java:76)
	at org.apache.calcite.rel.metadata.RelMdPredicates.getPredicates(RelMdPredicates.java:185)
	at GeneratedMetadataHandler_Predicates.getPredicates_$(Unknown Source)
	at GeneratedMetadataHandler_Predicates.getPredicates(Unknown Source)
	at GeneratedMetadataHandler_Predicates.getPredicates_$(Unknown Source)
	at GeneratedMetadataHandler_Predicates.getPredicates(Unknown Source)
	at org.apache.calcite.rel.metadata.RelMetadataQuery.getPulledUpPredicates(RelMetadataQuery.java:802)
	at org.apache.calcite.rel.metadata.RelMdPredicates.getPredicates(RelMdPredicates.java:344)
	at GeneratedMetadataHandler_Predicates.getPredicates_$(Unknown Source)
	at GeneratedMetadataHandler_Predicates.getPredicates(Unknown Source)
	at GeneratedMetadataHandler_Predicates.getPredicates_$(Unknown Source)
	at GeneratedMetadataHandler_Predicates.getPredicates(Unknown Source)
	at org.apache.calcite.rel.metadata.RelMetadataQuery.getPulledUpPredicates(RelMetadataQuery.java:802)
	at org.apache.calcite.rel.metadata.RelMdPredicates.getPredicates(RelMdPredicates.java:318)
	at GeneratedMetadataHandler_Predicates.getPredicates_$(Unknown Source)
...
{code}

Note1: for the same query, but with AND operator the rule works fine.
Note2: the rile works also after firing JoinToCorrelateRule rule.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)