[ 
https://issues.apache.org/jira/browse/CALCITE-4530?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17302519#comment-17302519
 ] 

Thomas Rebele commented on CALCITE-4530:
----------------------------------------

I've had a look at the copy methods ([^copy-methods-084d608.zip]). It looks to 
me that only the following classes do not support changing the input row type:
 * {{EnumerableWindow}}, {{BindableWindow}}, {{LogicalWindow}},
 * {{LogicalMatch}}, {{EnumerableMatch}}, {{BindableMatch}},
 * {{TableFunctionScan}},
 * {{Project}}, and
 * {{MultiJoin}}.

The other {{AbstractRelNode}} classes do not pass the row type. Instead they 
rely on {{AbstractRelNode.deriveRowType()}}. Maybe it would make sense to adapt 
the above classes to use {{deriveRowType()}}, too?

I do not see how a RexVisitor could help here, as the rex nodes of the window 
do not use any of the changed input fields.

> EnumerableWindow.copy(...) should adapt the rowType
> ---------------------------------------------------
>
>                 Key: CALCITE-4530
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4530
>             Project: Calcite
>          Issue Type: Bug
>    Affects Versions: 1.26.0
>            Reporter: Thomas Rebele
>            Priority: Minor
>         Attachments: copy-methods-084d608.zip
>
>
> The method EnumerableWindow.copy(RelTraitSet, List<RelNode>) copies the row 
> type. However, if some input fields have changed their type, then the row 
> type of the new EnumerableWindow instance will be wrong.
> The following snippet provides a workaround:
> {code:java}
> private RelNode fixEnumerableWindowType(EnumerableWindow win, List<RelNode> 
> newInputs)
> {
>       RelDataType winType = win.getRowType();
>       RelDataType newType = newInputs.get(0).getRowType();
>       RelDataTypeFactory.Builder typeBuilder = new 
> RelDataTypeFactory.Builder(win.getCluster().getTypeFactory());
>       typeBuilder.addAll(newType.getFieldList());
>       for (int i = newType.getFieldCount(); i < 
> win.getRowType().getFieldCount(); i++)
>       {
>               typeBuilder.add(winType.getFieldList().get(i));
>       }
>       return RelBridge.createWindow(win.getCluster(), win.getTraitSet(), 
> newInputs.get(0), win.constants,
>               typeBuilder.build(), win.groups);
> }
> {code}
> (The implementation of RelBridge.createWindow is trivial).



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to