Re: Row pattern recognition

Henson Choi <assam258@gmail.com>

From: Henson Choi <assam258@gmail.com>
To: Tatsuo Ishii <ishii@postgresql.org>
Cc: jacob.champion@enterprisedb.com, david.g.johnston@gmail.com, vik@postgresfriends.org, er@xs4all.nl, peter@eisentraut.org, pgsql-hackers@postgresql.org
Date: 2026-01-15T09:31:20Z
Lists: pgsql-hackers
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

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Adjust cross-version upgrade tests for seg_out() fix

  2. Rationalize error comments in partition split/merge tests

  3. Add fast path for foreign key constraint checks

  4. Fix assorted pretty-trivial memory leaks in the backend.

  5. Add temporal FOREIGN KEY contraints

  6. Add trailing commas to enum definitions

  7. Remove obsolete executor cleanup code