[ 
https://issues.apache.org/jira/browse/CALCITE-5166?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Roman Kondakov updated CALCITE-5166:
------------------------------------
    Description: 
Method {{RelNode#accept(RelShuttle)}} is not overridden for {{LogicalCalc}} and 
{{{}LogicalTableModify{}}}. This leads to the bug when logic implemented in 
{{RelShuttle#visit(LogicalCalc)}} is never applied because {{visit()}} method 
is never called due to incorrect dispatching.

This test will fail without {{accept(RelShuttle)}} method is overridden in Calc:
{code:java}
@Test void testRelShuttleForLogicalCalc() {
  final String sql = "select ename from emp";
  final RelNode rel = sql(sql).toRel();
  final HepProgramBuilder programBuilder = HepProgram.builder();
  programBuilder.addRuleInstance(CoreRules.PROJECT_TO_CALC);
  final HepPlanner planner = new HepPlanner(programBuilder.build());
  planner.setRoot(rel);
  final RelNode calc = planner.findBestExp();
  final List<RelNode> rels = new ArrayList<>();
  final RelShuttleImpl visitor = new RelShuttleImpl() {
    @Override public RelNode visit(LogicalCalc calc) {
      RelNode visitedRel = super.visit(calc);
      rels.add(visitedRel);
      return visitedRel;
    }
  };
  calc.accept(visitor);
  assertThat(rels.size(), is(1));
  assertThat(rels.get(0), isA(LogicalCalc.class));
} {code}

  was:
Method {{RelNode#accept(RelShuttle)}} is not overridden for {{LogicalCalc}} and 
{{{}LogicalTableModify{}}}. This leads to the bug when logic implemented in 
{{RelShuttle#visit(LogicalCalc)}} is never applied because {{visit()}} method 
is never called due to incorrect dispatching.

This test will fail without {{accept(RelShuttle)}} method is overridden in Calc:
{code:java}
@Test void testRelShuttleForLogicalCalc() {
    final String sql = "select ename from emp";
    final RelNode rel = sql(sql).toRel();
    final HepProgramBuilder programBuilder = HepProgram.builder();
    programBuilder.addRuleInstance(CoreRules.PROJECT_TO_CALC);
    final HepPlanner planner = new HepPlanner(programBuilder.build());
    planner.setRoot(rel);
    final RelNode calc = planner.findBestExp();
    final List<RelNode> rels = new ArrayList<>();
    final RelShuttleImpl visitor = new RelShuttleImpl() {
      @Override public RelNode visit(LogicalCalc calc) {
        RelNode visitedRel = super.visit(calc);
        rels.add(visitedRel);
        return visitedRel;
      }
    };
    visitor.visit(calc);
    assertThat(rels.size(), is(1));
    assertThat(rels.get(0), isA(LogicalCalc.class));
  }
{code}


> Method accept(RelShuttle) is not overridden in LogicalCalc and 
> LogicalTableModify
> ---------------------------------------------------------------------------------
>
>                 Key: CALCITE-5166
>                 URL: https://issues.apache.org/jira/browse/CALCITE-5166
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.30.0
>            Reporter: Roman Kondakov
>            Assignee: Roman Kondakov
>            Priority: Major
>             Fix For: 1.31.0
>
>
> Method {{RelNode#accept(RelShuttle)}} is not overridden for {{LogicalCalc}} 
> and {{{}LogicalTableModify{}}}. This leads to the bug when logic implemented 
> in {{RelShuttle#visit(LogicalCalc)}} is never applied because {{visit()}} 
> method is never called due to incorrect dispatching.
> This test will fail without {{accept(RelShuttle)}} method is overridden in 
> Calc:
> {code:java}
> @Test void testRelShuttleForLogicalCalc() {
>   final String sql = "select ename from emp";
>   final RelNode rel = sql(sql).toRel();
>   final HepProgramBuilder programBuilder = HepProgram.builder();
>   programBuilder.addRuleInstance(CoreRules.PROJECT_TO_CALC);
>   final HepPlanner planner = new HepPlanner(programBuilder.build());
>   planner.setRoot(rel);
>   final RelNode calc = planner.findBestExp();
>   final List<RelNode> rels = new ArrayList<>();
>   final RelShuttleImpl visitor = new RelShuttleImpl() {
>     @Override public RelNode visit(LogicalCalc calc) {
>       RelNode visitedRel = super.visit(calc);
>       rels.add(visitedRel);
>       return visitedRel;
>     }
>   };
>   calc.accept(visitor);
>   assertThat(rels.size(), is(1));
>   assertThat(rels.get(0), isA(LogicalCalc.class));
> } {code}



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to