Hi Ishii-san,

I have one question regaring your patch.
>
> In update_reduced_frame():
> +       hasLimitedFrame = (frameOptions & FRAMEOPTION_ROWS) &&
> +                                         !(frameOptions &
> FRAMEOPTION_END_UNBOUNDED_FOLLOWING);
> +       if (hasLimitedFrame && winstate->endOffsetValue != 0)
> +               frameOffset = DatumGetInt64(winstate->endOffsetValue);
>
> frameOffset is a offset value n from "ROWS BETWEEN CURRENT ROW AND n
> FOLLOWING".
> Later you use this here:
>
> +       ctxFrameEnd = ctx->matchStartRow + frameOffset + 1;
>
> So my question is, how do you ensure that ctxFrameEnd does not go
> beyond the full window frame end?
>

In update_reduced_frame():

    frameOffset = endOffsetValue;     // e.g., 2 from "2 FOLLOWING"

    for each row (currentPos):

        if (!rowExists)               // partition end reached
            finalize all contexts;
            break;

        for each context:
            ctxFrameEnd = matchStartRow + frameOffset + 1;
            if (currentPos >= ctxFrameEnd)
                finalize this context;
                continue;

Even if ctxFrameEnd exceeds partition end, the "if (!rowExists)" check
fires first and finalizes all contexts at the actual partition boundary.

Best regards,
Henson

Reply via email to