Claude Brisson created CALCITE-6621:
---------------------------------------

             Summary: RexBuilder.makeOver() should not try to nullify a null 
result
                 Key: CALCITE-6621
                 URL: https://issues.apache.org/jira/browse/CALCITE-6621
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.38.0
            Reporter: Claude Brisson


This is probably linked to CALCITE-6020.

In a window function that uses the nullable {{SUM}} aggregation operator, 
{{RexBuilder.makeOver()}} will produce the following construct:
{code:java}
CASE((COUNT($0) OVER (...), 0), SUM($0) OVER (...), null:BIGINT) {code}
which is both useless and inefficient.

Using this construct should only be done for non-nullable aggregation operators 
like {{SUM0}} (that's the only one I can think of).

The workaround is to inherit {{RexBuilder}} and override {{makeOver() }}as 
follow:
{code:java}
public RexNode makeOver(
        RelDataType type,
        SqlAggFunction operator,
        List<RexNode> exprs,
        List<RexNode> partitionKeys,
        ImmutableList<RexFieldCollation> orderKeys,
        RexWindowBound lowerBound,
        RexWindowBound upperBound,
        RexWindowExclusion exclude,
        boolean rows,
        boolean allowPartial,
        boolean nullWhenCountZero,
        boolean distinct,
        boolean ignoreNulls) {
    return super.makeOver(
            type,
            operator,
            exprs,
            partitionKeys,
            orderKeys,
            lowerBound,
            upperBound,
            exclude,
            rows,
            allowPartial,
            nullWhenCountZero && operator.getKind() == SqlKind.SUM0,
            distinct,
            ignoreNulls
    );
 {code}
 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to