[ 
https://issues.apache.org/jira/browse/CALCITE-2200?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16384162#comment-16384162
 ] 

Julian Hyde commented on CALCITE-2200:
--------------------------------------

Thanks for the test case. I can reproduce it. The problem seems to now 
HepPlanner handles when a rule produces a RelNode that is essentially the same 
as the one matched in the rule. It is currently not good at noticing that it is 
not making any progress.

Work in progress: https://github.com/julianhyde/calcite/tree/2200-rule-loop

> 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
>            Priority: Major
>             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)

Reply via email to