[ https://issues.apache.org/jira/browse/CALCITE-2865?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Stamatis Zampetakis resolved CALCITE-2865. ------------------------------------------ Resolution: Fixed Fix Version/s: 1.20.0 Fixed in [89829252689477bfeb305071285edcde1b4a3048|https://github.com/apache/calcite/commit/89829252689477bfeb305071285edcde1b4a3048]. Thanks for the PR [~rubenql]! > FilterProjectTransposeRule generates wrong traitSet when copyFilter/Project > is true > ----------------------------------------------------------------------------------- > > Key: CALCITE-2865 > URL: https://issues.apache.org/jira/browse/CALCITE-2865 > Project: Calcite > Issue Type: Bug > Affects Versions: 1.18.0 > Reporter: Ruben Quesada Lopez > Assignee: Ruben Quesada Lopez > Priority: Major > Labels: pull-request-available > Fix For: 1.20.0 > > Time Spent: 2h 40m > Remaining Estimate: 0h > > Problem can be reproduced with the following steps: > As suggested by [~zabetak], a possibility to reproduce this issue is with the > following test in RelOptRulesTest: > {code:java} > /** Test case for > * <a > href="https://issues.apache.org/jira/browse/CALCITE-2865">[CALCITE-2865] > * FilterProjectTransposeRule generates wrong traitSet when > copyFilter/Project is true</a>. */ > @Test public void testFilterProjectTransposeRule() { > List<RelOptRule> rules = Arrays.asList( > FilterProjectTransposeRule.INSTANCE, // default values: > copyFilter=true, copyProject=true > new FilterProjectTransposeRule(Filter.class, Project.class, > /*copyFilter*/ false, /*copyProject*/ false, RelFactories.LOGICAL_BUILDER)); > List<RelNode> results = new ArrayList<>(2); > for (RelOptRule rule : rules) { > RelBuilder b = RelBuilder.create(RelBuilderTest.config().build()); > RelNode in = b > .scan("EMP") > .sort(-4) // salary desc > .project(b.field(3)) // salary > .filter(b.equals(b.field(0), b.literal(11500))) // salary = > 11500 > .build(); > HepProgram program = new HepProgramBuilder() > .addRuleInstance(rule) > .build(); > HepPlanner hepPlanner = new HepPlanner(program); > hepPlanner.setRoot(in); > results.add(hepPlanner.findBestExp()); > } > // compare LogicalFilter traitSet > assertEquals(results.get(0).getInput(0).getTraitSet(), > results.get(1).getInput(0).getTraitSet()); > } > {code} > Which fails with the following message: > {code:java} > java.lang.AssertionError: > Expected :NONE.[0 DESC] > Actual :NONE.[3 DESC] > {code} > If we run the test with a break point at the end of > {{FilterProjectTransposeRule#onMatch}} method, we can see that, when the > project and filter are transposed, the generated output (newFilterRel) is > different in terms of traitSet, depending if the copyFilter / copyProject > flags are used or not: > - copyFilter and copyProject TRUE (default) > {code:java} > LogicalProject.NONE.[0 DESC] > LogicalFilter.NONE.[0 DESC] // !!! > LogicalSort.NONE.[3 DESC] > {code} > - copyFilter and copyProject FALSE > {code:java} > LogicalProject.NONE.[0 DESC] > LogicalFilter.NONE.[3 DESC] // !!! > LogicalSort.NONE.[3 DESC] > {code} > As I see it, the default behavior (copyFilter/Project true) seems wrong in > terms of new filter's traitSet. -- This message was sent by Atlassian JIRA (v7.6.3#76005)