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

Reply via email to