Thanks for logging the bug, and all the research. I couldn’t see a quick fix. But maybe someone who has a little more time could look into it.
> On Mar 2, 2023, at 2:00 PM, Andrew Pilloud <[email protected]> > wrote: > > I filed https://issues.apache.org/jira/browse/CALCITE-5553 > > I also opened a pull request with the test as a commit and a second > commit to delete the bad method (but I'm not sure if that is a viable > fix): https://github.com/apache/calcite/pull/3092 > > On Thu, Mar 2, 2023 at 1:03 PM Julian Hyde <[email protected]> wrote: >> >> Can you please log this? It might be useful if you create a PR with a single >> commit to represent the test case. >> >> We can discuss workarounds or fixes in the jira case. >> >>> On Mar 2, 2023, at 11:44 AM, Andrew Pilloud <[email protected]> >>> wrote: >>> >>> A Beam user brought us a query that produces an invalid plan after >>> upgrading to a newer version of Beam (moving them from Calcite 1.20 to >>> 1.28). I was able to write a test case which demonstrates this issue >>> with a trivial filter on a table containing a nested struct with a >>> single field. The issue appears to be coming out of >>> RelStructuredTypeFlattener.rewrite and I bisected it to a single >>> commit: >>> https://github.com/apache/calcite/commit/e44beba286ea9049c5fd00c3a3b0e4a4f1c03356 >>> >>> Removing the noFlatteningForInput function added in this commit fixes >>> the issue. That method doesn't appear to be looking at types at all, >>> only mismatches in field count, I expect so any single field struct >>> would hit this. Any suggestions on how we can work around this in >>> Beam? >>> >>> The test query and plans are as follows, the test case is attached. >>> >>> select dn.skill from sales.dept_single dn WHERE dn.skill.type = '' >>> >>> Expected plan: >>> LogicalProject(SKILL=[ROW($0)]) >>> LogicalFilter(condition=[=($0, '')]) >>> LogicalProject(TYPE=[$0.TYPE]) >>> LogicalTableScan(table=[[CATALOG, SALES, DEPT_SINGLE]]) >>> >>> Actual Plan: >>> LogicalProject(SKILL=[ROW($0)]) >>> LogicalFilter(condition=[=($0.TYPE, '')]) >>> LogicalProject(TYPE=[$0.TYPE]) >>> LogicalTableScan(table=[[CATALOG, SALES, DEPT_SINGLE]]) >>> >>> Plan before flatten: >>> LogicalProject(SKILL=[$0]) >>> LogicalFilter(condition=[=($0.TYPE, '')]) >>> LogicalTableScan(table=[[CATALOG, SALES, DEPT_SINGLE]]) >>> <wrongplan.patch> >>
