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

Julian Hyde commented on CALCITE-4530:
--------------------------------------

Replacing an input with another input with different types is not normal 
behavior. The {{copy}} method should not have to deal with it. (If we changed 
it here, we would have to make the {{copy}} method on every {{RelNode}} much 
more defensive.)

You should write your own code to rebuild the window. Maybe if you implement 
something like {{RexNode.accept(RexVisitor)}} for {{RexWinAggCall}} and 
{{Window.Group}} it will be easier.

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