Hi,
I was able to reproduce exactly the problem, with clean compile
and --enable-cassert:
test=# SELECT x,y,lead(y) IGNORE NULLS OVER (ORDER BY x) FROM
(VALUES(1,NULL),(2,2),(3,NULL)) AS v(x,y);
 x | y | lead
---+---+------
 1 |   |    2
 2 | 2 |    2
 3 |   |    2
(3 rows)

test=#
Also, make check errors out at window test (without --enable-cassert it was
passed in previous compile):
krasiyan@fedora:~/pgsql-src/postgresql$ cat
/home/krasiyan/pgsql-src/postgresql/src/test/regress/regression.diffs
diff -U3
/home/krasiyan/pgsql-src/postgresql/src/test/regress/expected/window.out
/home/krasiyan/pgsql-src/postgresql/src/test/regress/results/window.out
---
/home/krasiyan/pgsql-src/postgresql/src/test/regress/expected/window.out
2025-01-22 21:25:47.114508215 +0200
+++ /home/krasiyan/pgsql-src/postgresql/src/test/regress/results/window.out
2025-01-23 07:58:26.784659592 +0200
@@ -5477,12 +5477,12 @@
   name   | orbit | lead  | lead_respect | lead_ignore
 ---------+-------+-------+--------------+-------------
  earth   |       |  4332 |         4332 |        4332
- jupiter |  4332 |       |              |          88
+ jupiter |  4332 |       |              |
  mars    |       |    88 |           88 |          88
  mercury |    88 | 60182 |        60182 |       60182
  neptune | 60182 | 90560 |        90560 |       90560
  pluto   | 90560 | 24491 |        24491 |       24491
- saturn  | 24491 |       |              |         224
+ saturn  | 24491 |       |              |
  uranus  |       |   224 |          224 |         224
  venus   |   224 |       |              |
  xyzzy   |       |       |              |
@@ -5577,13 +5577,13 @@
   name   | orbit | first_value | last_value | nth_value | lead_ignore |
lag_ignore
 
---------+-------+-------------+------------+-----------+-------------+------------
  earth   |       |        4332 |       4332 |           |        4332 |

- jupiter |  4332 |          88 |         88 |           |          88 |

- mars    |       |        4332 |      60182 |        88 |          88 |
    4332
- mercury |    88 |        4332 |      90560 |     60182 |       60182 |
    4332
+ jupiter |  4332 |          88 |         88 |           |       60182 |

+ mars    |       |          88 |      60182 |     60182 |       60182 |
    4332
+ mercury |    88 |        4332 |      90560 |     90560 |       90560 |
    4332
  neptune | 60182 |          88 |      24491 |     90560 |       90560 |
      88
- pluto   | 90560 |          88 |      24491 |     60182 |       24491 |
   60182
- saturn  | 24491 |       60182 |        224 |     90560 |         224 |
   90560
- uranus  |       |       90560 |        224 |     24491 |         224 |
   24491
+ pluto   | 90560 |          88 |      24491 |     60182 |       60182 |
   60182
+ saturn  | 24491 |       60182 |        224 |     90560 |       90560 |
   90560
+ uranus  |       |       90560 |        224 |     24491 |       24491 |
   24491
  venus   |   224 |       24491 |      24491 |           |             |
   24491
  xyzzy   |       |         224 |        224 |           |             |
     224
 (10 rows)
@@ -5646,14 +5646,14 @@
   name   | orbit | first_value | last_value | nth_value | lead_ignore |
lag_ignore
 
---------+-------+-------------+------------+-----------+-------------+------------
  earth   |       |             |            |           |          88 |

- jupiter |       |          88 |         88 |           |          88 |

- mars    |       |          88 |      60182 |     60182 |          88 |

+ jupiter |       |          88 |         88 |           |       60182 |

+ mars    |       |          88 |      60182 |     60182 |       60182 |

  mercury |    88 |          88 |      90560 |     60182 |       60182 |

- neptune | 60182 |          88 |      24491 |     60182 |       90560 |
      88
- pluto   | 90560 |          88 |      24491 |     60182 |       24491 |
   60182
- saturn  | 24491 |       60182 |        224 |     90560 |         224 |
   90560
- uranus  |       |       90560 |        224 |     24491 |         224 |
   24491
- venus   |   224 |       24491 |        224 |       224 |             |
   24491
+ neptune | 60182 |          88 |      24491 |     60182 |       60182 |
      88
+ pluto   | 90560 |          88 |      24491 |     60182 |       60182 |
   60182
+ saturn  | 24491 |       60182 |        224 |     90560 |       90560 |
   90560
+ uranus  |       |       90560 |        224 |     24491 |       24491 |
   24491
+ venus   |   224 |       24491 |        224 |       224 |         224 |
   24491
  xyzzy   |       |         224 |        224 |           |             |
     224
 (10 rows)


На чт, 23.01.2025 г. в 6:25 Tatsuo Ishii <is...@postgresql.org> написа:

> > Hello,
> > I also played with the v4 patch and it produces correct result:
> > test=# SELECT x,y,lead(y) IGNORE NULLS OVER (ORDER BY x) FROM
> > (VALUES(1,NULL),(2,2),(3,NULL)) AS v(x,y);
> >  x | y | lead
> > ---+---+------
> >  1 |   |    2
> >  2 | 2 |
> >  3 |   |
> > (3 rows)
> >
> > test=#
> > It is from today's git, clean compile and install with only v4 patch
> > applied, make check also passes without errors.
>
> I guess you are just lucky. In my case I enabled --enable-cassert to
> build PostgreSQL and it automatically turn on CLOBBER_FREED_MEMORY and
> freed memory area is scrambled. If I look the patch closer, I found a
> problem:
>
> +void
> +WinCheckAndInitializeNullTreatment(WindowObject winobj,
> :
> :
> +               winobj->win_nonnulls = palloc_array(int64, 16);
>
> WinCheckAndInitializeNullTreatment is called in each built-in window
> function. Window functions are called in the per tuple memory context,
> which means win_nonnulls disappears when next tuple is supplied to the
> window function. If my understanding is correct, winobj->win_nonnulls
> needs to survive across processing tuples.
>
> Best reagards,
> --
> Tatsuo Ishii
> SRA OSS K.K.
> English: http://www.sraoss.co.jp/index_en/
> Japanese:http://www.sraoss.co.jp
>

Reply via email to