yisha zhou created CALCITE-6289:
-----------------------------------

             Summary: 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


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)

Reply via email to