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

George Theodorakis commented on CALCITE-1593:
---------------------------------------------

I can't find where I can declare which RelMetadataProvider the VolcanoPlanner 
uses. For example with HepPlanner I register it with 
HepPlanner.registerMetadataProviders(...). If VolcanoPlanner uses the 
DefaultMetadataProdiver, shouldn't it catch this exception because of 
RelMdRowCount.INSTANCE? In order to overpass this obstacle, in the 
computeSelfCost method of all the operators I used instead of :

{noformat}
double rowCount = mq.getRowCount(this);
{noformat}

this:
{noformat}
double rowCount;
try {
   rowCount = mq.getRowCount(this);
} catch (CyclicMetadataException e) {
   rowcount = 1e6d;
}
{noformat}

I don't know if it is equivalent, but I don't get the CyclicMetadataException. 
Now I get this exception:
{noformat}
Exception in thread "main" java.lang.StackOverflowError
        at 
com.google.common.collect.SingletonImmutableList.size(SingletonImmutableList.java:52)
        at 
org.apache.calcite.plan.volcano.RelSubset$CheapestPlanReplacer.visit(RelSubset.java:463)
        at 
org.apache.calcite.plan.volcano.RelSubset$CheapestPlanReplacer.visit(RelSubset.java:465)
...
{noformat}



> JoinAssociateRule throws Exception in thread "main" java.lang.AssertionError: 
> Internal error: Error while applying...
> ---------------------------------------------------------------------------------------------------------------------
>
>                 Key: CALCITE-1593
>                 URL: https://issues.apache.org/jira/browse/CALCITE-1593
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.10.0
>            Reporter: George Theodorakis
>            Assignee: Julian Hyde
>            Priority: Blocker
>              Labels: beginner
>
> I have created my own operators and Convention to apply my custom cost logic. 
> I have tried many rules with both Volcano and HepPlanner and everything works 
> fine. When I apply LoptOptimizeRule I get the correct output. However, when I 
> try to use:
> *     JoinPushThroughJoinRule.LEFT,
> *     JoinPushThroughJoinRule.RIGHT,
> *     JoinAssociateRule.INSTANCE,
> *     JoinCommuteRule.INSTANCE
> something goes wrong. I try to apply them in VolcanoPlanner in the same step 
> I use my converter rules to change the initial Logical Operators to the 
> custom ones. 
> I declare them as:
> {code}
>       static final RelOptRule SABER_JOIN_PUSH_THROUGH_JOIN_RULE_RIGHT = new 
> JoinPushThroughJoinRule("JoinPushThroughJoinRule", true, SaberJoinRel.class, 
> SaberRelFactories.SABER_LOGICAL_BUILDER);
>       
>       static final RelOptRule SABER_JOIN_PUSH_THROUGH_JOIN_RULE_LEFT = new 
> JoinPushThroughJoinRule("JoinPushThroughJoinRule", false, SaberJoinRel.class, 
> SaberRelFactories.SABER_LOGICAL_BUILDER);
>       static final RelOptRule SABER_JOIN_COMMUTE_RULE = new 
> JoinCommuteRule(SaberJoinRel.class, SaberRelFactories.SABER_LOGICAL_BUILDER, 
> false);
> {code}
>               
> So, when I use the four of them I get:
> {noformat}
> Exception in thread "main" java.lang.AssertionError: Internal error: Error 
> while applying rule SaberProjectRule, args 
> [rel#171:LogicalProject.NONE.[](input=rel#170:Subset#20.LOGICAL.[],rowtime=$8,customerid=$9,phone=$10,rowtime0=$0,orderid=$1,productid=$2,units=$3,customerid0=$4,rowtime00=$5,productid0=$6,description=$7)]
>       at org.apache.calcite.util.Util.newInternal(Util.java:792)
>       at 
> org.apache.calcite.plan.volcano.VolcanoRuleCall.onMatch(VolcanoRuleCall.java:236)
>       at 
> org.apache.calcite.plan.volcano.VolcanoPlanner.findBestExp(VolcanoPlanner.java:819)
>       at 
> org.apache.calcite.tools.Programs$RuleSetProgram.run(Programs.java:334)
>       at 
> org.apache.calcite.prepare.PlannerImpl.transform(PlannerImpl.java:308)
>       at calcite.planner.SaberPlanner.getLogicalPlan(SaberPlanner.java:257)
>       at calcite.Tester.main(Tester.java:183)
> Caused by: java.lang.AssertionError: Internal error: Error occurred while 
> applying rule SaberProjectRule
>       at org.apache.calcite.util.Util.newInternal(Util.java:792)
>       at 
> org.apache.calcite.plan.volcano.VolcanoRuleCall.transformTo(VolcanoRuleCall.java:148)
>       at 
> org.apache.calcite.plan.RelOptRuleCall.transformTo(RelOptRuleCall.java:225)
>       at 
> org.apache.calcite.rel.convert.ConverterRule.onMatch(ConverterRule.java:117)
>       at 
> org.apache.calcite.plan.volcano.VolcanoRuleCall.onMatch(VolcanoRuleCall.java:213)
>       ... 5 more
> Caused by: org.apache.calcite.rel.metadata.CyclicMetadataException
>       at 
> org.apache.calcite.rel.metadata.CyclicMetadataException.<clinit>(CyclicMetadataException.java:28)
>       at GeneratedMetadataHandler_RowCount.getRowCount(Unknown Source)
>       at 
> org.apache.calcite.rel.metadata.RelMetadataQuery.getRowCount(RelMetadataQuery.java:201)
>       at 
> org.apache.calcite.rel.metadata.RelMdRowCount.getRowCount(RelMdRowCount.java:132)
>       at GeneratedMetadataHandler_RowCount.getRowCount_$(Unknown Source)
>       at GeneratedMetadataHandler_RowCount.getRowCount(Unknown Source)
>       at 
> org.apache.calcite.rel.metadata.RelMetadataQuery.getRowCount(RelMetadataQuery.java:201)
> {noformat}
> If it helps, when I don't use JoinCommuteRule I don't get an exception, but I 
> get wrong result and when I don't use JoinAssociateRule I get:
> {noformat}Exception in thread "main" java.lang.StackOverflowError
>       at 
> com.google.common.collect.ImmutableCollection.<init>(ImmutableCollection.java:157)
>       at 
> com.google.common.collect.ImmutableList.<init>(ImmutableList.java:313)
>       at 
> com.google.common.collect.SingletonImmutableList.<init>(SingletonImmutableList.java:35)
>       at com.google.common.collect.ImmutableList.of(ImmutableList.java:76)
>       at org.apache.calcite.rel.SingleRel.getInputs(SingleRel.java:63)
>       at 
> org.apache.calcite.plan.volcano.RelSubset$CheapestPlanReplacer.visit(RelSubset.java:461)
> {noformat}
> Here is a link to the operators I created: 
> https://github.com/giwrgostheod/Calcite-Saber/tree/master/src/main/java/calcite/planner/common



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to