[ 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)