This is an automated email from the ASF dual-hosted git repository. chunwei pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/master by this push: new fb1835c [CALCITE-4192] RelMdColumnOrigins gets the wrong index of group by columns after RelNode was optimized by AggregateProjectMergeRule rule (FangZheng Li) fb1835c is described below commit fb1835c3741018f805b61aae7888f0afe65761ee Author: majiao <fangzheng....@antfin.com> AuthorDate: Wed Aug 26 14:52:04 2020 +0800 [CALCITE-4192] RelMdColumnOrigins gets the wrong index of group by columns after RelNode was optimized by AggregateProjectMergeRule rule (FangZheng Li) close apache/calcite#2121 --- .../calcite/rel/metadata/RelMdColumnOrigins.java | 4 ++-- .../org/apache/calcite/test/RelMetadataTest.java | 23 ++++++++++++++++++++++ .../org/apache/calcite/test/RelOptRulesTest.java | 1 - 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java index 2958c12..ed1b9cc 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java @@ -65,8 +65,8 @@ public class RelMdColumnOrigins public Set<RelColumnOrigin> getColumnOrigins(Aggregate rel, RelMetadataQuery mq, int iOutputColumn) { if (iOutputColumn < rel.getGroupCount()) { - // Group columns pass through directly. - return mq.getColumnOrigins(rel.getInput(), iOutputColumn); + // get actual index of Group columns. + return mq.getColumnOrigins(rel.getInput(), rel.getGroupSet().asList().get(iOutputColumn)); } // Aggregate columns are derived from input columns diff --git a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java index 62485dc..7e9dd3e 100644 --- a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java @@ -3273,4 +3273,27 @@ public class RelMetadataTest extends SqlToRelTestBase { return this; } } + + /** Test case for + * <a href="https://issues.apache.org/jira/browse/CALCITE-4192">[CALCITE-4192] + * RelMdColumnOrigins get the wrong index of group by columns after RelNode was optimized by + * AggregateProjectMergeRule rule</a>. */ + @Test void testColumnOriginAfterAggProjectMergeRule() { + final String sql = "select count(ename), SAL from emp group by SAL"; + final RelNode rel = tester.convertSqlToRel(sql).rel; + final HepProgramBuilder programBuilder = HepProgram.builder(); + programBuilder.addRuleInstance(CoreRules.AGGREGATE_PROJECT_MERGE); + final HepPlanner planner = new HepPlanner(programBuilder.build()); + planner.setRoot(rel); + final RelNode optimizedRel = planner.findBestExp(); + + Set<RelColumnOrigin> origins = RelMetadataQuery.instance() + .getColumnOrigins(optimizedRel, 1); + assertThat(origins.size(), equalTo(1)); + + RelColumnOrigin columnOrigin = origins.iterator().next(); + assertThat(columnOrigin.getOriginColumnOrdinal(), equalTo(5)); + assertThat(columnOrigin.getOriginTable().getRowType().getFieldNames().get(5), + equalTo("SAL")); + } } diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java index b049154..bafe0a0 100644 --- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java @@ -6812,5 +6812,4 @@ class RelOptRulesTest extends RelOptTestBase { .withRule(CoreRules.FILTER_REDUCE_EXPRESSIONS) .checkUnchanged(); } - }