[
https://issues.apache.org/jira/browse/CALCITE-7843?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Alessandro Solimando updated CALCITE-7843:
------------------------------------------
Fix Version/s: 1.43.0
> RelMdExpressionLineage should support Window
> --------------------------------------------
>
> Key: CALCITE-7843
> URL: https://issues.apache.org/jira/browse/CALCITE-7843
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.42.0
> Reporter: Alessandro Solimando
> Assignee: Alessandro Solimando
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.43.0
>
>
> RelMdExpressionLineage has no handler for {_}Window{_}, so it falls back to
> the catch-all _RelNode_ handler
> ([here|https://github.com/apache/calcite/blob/6484bed4572adbc219b171a9efbbd08a1b662f3a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExpressionLineage.java#L101-L104]),
> which always returns null. This happens even for columns that _Window_
> simply passes through from its input.
> _RelMdTableReferences_ already supports Window
> ([here|https://github.com/apache/calcite/blob/6484bed4572adbc219b171a9efbbd08a1b662f3a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java#L276-L290]),
> so the two metadata types are not consistent. Any consumer of expression
> lineage, such as materialized view rewriting, fails on plans containing a
> {_}Window{_}.
> Reproducer (for {_}RelMetadataTest{_}):
> {code:java}
> @Test void testExpressionLineageWindow() {
> final RelNode rel = sql("select empno, row_number() over (order by sal)
> from emp")
> .toRel();
> final HepProgram program = new HepProgramBuilder()
> .addRuleInstance(CoreRules.PROJECT_TO_LOGICAL_PROJECT_AND_WINDOW)
> .build();
> final HepPlanner planner = new HepPlanner(program);
> planner.setRoot(rel);
> final RelNode window = planner.findBestExp().getInput(0);
> assertThat(window, instanceOf(Window.class));
> final RelMetadataQuery mq = window.getCluster().getMetadataQuery();
> final RexNode ref = RexInputRef.of(0, window.getRowType().getFieldList());
> final Set<RexNode> r = mq.getExpressionLineage(window, ref);
> assertThat(String.valueOf(r), is("[[CATALOG, SALES, EMP].#0.$0]"));
> }
> {code}
> The test currently fails as follows:
> {noformat}
> Expected: is "[[CATALOG, SALES, EMP].#0.$0]"
> but: was "null"
> {noformat}
> Proposed fix: add a _Window_ handler to {_}RelMdExpressionLineage{_}. The
> output of a _Window_ is all its input columns, in the same order, followed by
> one column for each window function call. If the expression references only
> input columns, the handler delegates to the input, the same way the _Sort_
> handler does
> ([here|https://github.com/apache/calcite/blob/6484bed4572adbc219b171a9efbbd08a1b662f3a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExpressionLineage.java#L422-L425]).
> If it references a window function call column, the handler returns null.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)