[
https://issues.apache.org/jira/browse/CALCITE-6289?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17823332#comment-17823332
]
Julian Hyde commented on CALCITE-6289:
--------------------------------------
What would the plan look like if reuse was occurring?
Reusing the plan nodes is one thing. It's quite possible - especially under the
Volcano planner - that the LogicalAggregate is in fact reused.
But reusing the data at runtime is different. For that, the solution is a DAG
plan using the Spool operator. You should be able to find Jira cases concerning
Spool.
> View in union cannot be reused
> ------------------------------
>
> Key: CALCITE-6289
> URL: https://issues.apache.org/jira/browse/CALCITE-6289
> Project: Calcite
> Issue Type: Improvement
> Components: core
> Affects Versions: 1.36.0
> Reporter: yisha zhou
> Priority: Major
>
> When union two different projection of same view, the view cannot be reuse.
> To reproduce the problem, please create a `MockRelViewTable` in
> `MockCatalogReaderExtended` use code below:
> {code:java}
> List<String> empModifiableViewNames5 =
> ImmutableList.of(salesSchema.getCatalogName(), salesSchema.getName(),
> "EMP_VIEW");
> TableMacro empModifiableViewMacro5 =
> MockModifiableViewRelOptTable.viewMacro(rootSchema,
> "select EMPNO, DEPTNO, ENAME\n"
> + "from EMPDEFAULTS\n"
> + "group by EMPNO, DEPTNO, ENAME",
> empModifiableViewNames5.subList(0, 2),
> ImmutableList.of(empModifiableViewNames5.get(2)), true);
> TranslatableTable empModifiableView5 =
> empModifiableViewMacro5.apply(ImmutableList.of());
> MockTable mockEmpViewTable5 =
> MockRelViewTable.create(
> (ViewTable) empModifiableView5, this,
> empModifiableViewNames5.get(0), empModifiableViewNames5.get(1),
> empModifiableViewNames5.get(2), false, 20, null);
> registerTable(mockEmpViewTable5); {code}
> And then add a test in `SqlToRelConverterTest`:
>
> {code:java}
> @Test void testView() {
> final String sql = "select empno from EMP_VIEW\n"
> + "union all\n"
> + "select deptno from EMP_VIEW";
> sql(sql).withExtendedTester().ok();
> } {code}
> You will get the plan:
>
> {code:java}
> LogicalUnion(all=[true])
> LogicalProject(EMPNO=[$0])
> LogicalAggregate(group=[{0, 1, 2}])
> LogicalProject(EMPNO=[$0], DEPTNO=[$7], ENAME=[$1])
> LogicalTableScan(table=[[CATALOG, SALES, EMPDEFAULTS]])
> LogicalProject(DEPTNO=[$1])
> LogicalAggregate(group=[{0, 1, 2}])
> LogicalProject(EMPNO=[$0], DEPTNO=[$7], ENAME=[$1])
> LogicalTableScan(table=[[CATALOG, SALES, EMPDEFAULTS]]) {code}
> Obviously, RelNode tree in the view is not reused. The root cause is that we
> expand the views in `SqlToRelConverter#convertIdentifier` . Therefore I
> suggest to reintroduce the `SqlToRelConverter.Config#isConvertTableAccess`
> which is removed in
> [CALCITE-3801|https://issues.apache.org/jira/browse/CALCITE-3801]. So that we
> can expand view at the time we want, e.g. after divide the projections in
> union and logic in the view into two subgraph.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)