BUG #19535: Splitting window input targets can break same-level SRF lockstep semantics

Started by PG Bug reporting formabout 1 month ago2 messagesbugs
Jump to latest
#1PG Bug reporting form
noreply@postgresql.org

The following bug has been logged on the website:

Bug reference: 19535
Logged by: Qifan Liu
Email address: imchifan@163.com
PostgreSQL version: 18.4
Operating system: Ubuntu 20.04 x86-64, docker image postgres:18.4
Description:

## PoC

```sql
WITH source AS (
SELECT row_number() OVER (
PARTITION BY generate_series(1, 2)
ORDER BY generate_series(1, 2)
) AS rn,
generate_series(1, 2) AS g1,
generate_series(11, 12) AS g2
)
SELECT *
FROM source
ORDER BY rn, g1, g2;

WITH s AS (
SELECT generate_series(1, 2) AS g1,
generate_series(11, 12) AS g2
)
SELECT 1::bigint AS rn, g1, g2
FROM s
ORDER BY rn, g1, g2;

EXPLAIN (COSTS OFF)
WITH source AS (
SELECT row_number() OVER (
PARTITION BY generate_series(1, 2)
ORDER BY generate_series(1, 2)
) AS rn,
generate_series(1, 2) AS g1,
generate_series(11, 12) AS g2
)
SELECT *
FROM source
ORDER BY rn, g1, g2;
```

## Expected Behavior

The two same-level SRFs should run in lockstep, yielding:

```text
1 | 1 | 11
1 | 2 | 12
```

## Actual Behavior

The query returns four rows instead of two:

```text
1 | 1 | 11
1 | 1 | 12
1 | 2 | 11
1 | 2 | 12
```

The plan shows one `ProjectSet` below `WindowAgg` and another above it,
which breaks same-level SRF lockstep semantics.

#2David Rowley
dgrowleyml@gmail.com
In reply to: PG Bug reporting form (#1)
Re: BUG #19535: Splitting window input targets can break same-level SRF lockstep semantics

On Sun, 28 Jun 2026 at 00:55, PG Bug reporting form
<noreply@postgresql.org> wrote:

## Actual Behavior

The query returns four rows instead of two:

```text
1 | 1 | 11
1 | 1 | 12
1 | 2 | 11
1 | 2 | 12
```

The plan shows one `ProjectSet` below `WindowAgg` and another above it,
which breaks same-level SRF lockstep semantics.

Thanks for the report. This is the same as what was discussed in bug
#17502. There was a patch there to disallow SRFs in the WindowClause.
I believe it was intended to go into master only, but that wasn't
done.

David

[1]: /messages/by-id/flat/17502-281a7aaacfaa872a@postgresql.org