Questionable result from lead(0) IGNORE NULLS
| От | Tatsuo Ishii | 
|---|---|
| Тема | Questionable result from lead(0) IGNORE NULLS | 
| Дата | |
| Msg-id | 20251007.164115.365607411436183761.ishii@postgresql.org обсуждение исходный текст  | 
		
| Ответы | 
                	
            		Re: Questionable result from lead(0) IGNORE NULLS
            		
            		 Re: Questionable result from lead(0) IGNORE NULLS  | 
		
| Список | pgsql-hackers | 
Hi Oliver,
I noticed a questionable result from "lead(0) IGNORE NULLS".
CREATE TEMP TABLE g(x INT, y INT);
CREATE TABLE
INSERT INTO g (VALUES(NULL,1),(NULL,2),(1,3));
INSERT 0 3
SELECT * FROM g;
 x | y 
---+---
   | 1
   | 2
 1 | 3
(3 rows)
SELECT x, y, lead(x, 0) RESPECT NULLS OVER w FROM g
WINDOW w AS (ORDER BY y);
 x | y | lead 
---+---+------
   | 1 |     
   | 2 |     
 1 | 3 |    1
(3 rows)
SELECT x, y, lead(x, 0) IGNORE NULLS OVER w FROM g
WINDOW w AS (ORDER BY y);
 x | y | lead 
---+---+------
   | 1 |     
   | 2 |     
 1 | 3 |    1
(3 rows)
As you can see, "lead(x, 0) IGNORE NULLS" shows the same result as
"lead(x, 0) RESPECT NULLS". IMO "lead(x, 0) IGNORE NULLS" should show
something like:
 x | y | lead 
---+---+------
   | 1 |    1 
   | 2 |    1 
 1 | 3 |    1
(3 rows)
The same thing can be said to lag().
Looking into the code, in
WinGetFuncArgInPartition(src/backend/executor/nodeWindowAgg.c) I see
this:
    if (winobj->ignore_nulls == IGNORE_NULLS && relpos != 0)
    {
        null_treatment = true;
Here, if the caller is lead(0), then relpos == 0, thus
"null_treatment" is not set to true and falls into the code later on:
    if (!null_treatment)        /* IGNORE NULLS is not specified */
    {
        /* get tupple and evaluate in a partition */
        datum = gettuple_eval_partition(winobj, argno,
and runs through the same code path as RESPECT NULLS. I think this is
the reason why "lead(0, x) IGNORE NULLS" showed the same result as
"lead(0, x) RESPECT NULLS". "relpos != 0" part was originally in your
patch. Oliver, what's the reason why you excluded relpose==0 case? Can
we eliminate the restriction and let "lead(0) IGNORE NULLS" case run
the same code path as relpos!=0 (of course with proper adjustment in
related code)?
Best regards,
[1] https://www.postgresql.org/message-id/CAGMVOduHcfhh7Wo9W1Tff0DH_ccPuQGc8D_f5S2_y4OHFOjn%3DA%40mail.gmail.com
--
Tatsuo Ishii
SRA OSS K.K.
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp
		
	В списке pgsql-hackers по дате отправления: