| From: | Henson Choi <assam258(at)gmail(dot)com> |
|---|---|
| To: | Tatsuo Ishii <ishii(at)postgresql(dot)org> |
| Cc: | jacob(dot)champion(at)enterprisedb(dot)com, david(dot)g(dot)johnston(at)gmail(dot)com, vik(at)postgresfriends(dot)org, er(at)xs4all(dot)nl, peter(at)eisentraut(dot)org, pgsql-hackers(at)postgresql(dot)org |
| Subject: | Re: Row pattern recognition |
| Date: | 2026-01-15 09:31:20 |
| Message-ID: | CAAAe_zBbeBckRpbasfwn74FUoOVMcaUE0hwfNuQtGY_=QpjoBQ@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| 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
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Michael Paquier | 2026-01-15 09:33:59 | Re: Extended Statistics set/restore/clear functions. |
| Previous Message | Tatsuro Yamada | 2026-01-15 09:20:52 | Re: [PATCH] psql: add \dcs to list all constraints |