Thread

  1. Re: Add RESPECT/IGNORE NULLS and FROM FIRST/LAST options

    Tatsuo Ishii <ishii@postgresql.org> — 2025-10-16T10:17:06Z

    Thanks for the report.
    
    > Coverity thinks that this code has still some incorrect bits, and I
    > think that it is right to think so even on today's HEAD at
    > 02c171f63fca.
    > 
    > In WinGetFuncArgInPartition()@nodeWindowAgg.c, we have the following
    > loop (keeping only the relevant parts:
    >     do
    >     {
    >         [...]
    >         else                    /* need to check NULL or not */
    >         {
    >             /* get tuple and evaluate in partition */
    >             datum = gettuple_eval_partition(winobj, argno,
    >                                             abs_pos, isnull, &myisout);
    >             if (myisout)        /* out of partition? */
    >                 break;
    >             if (!*isnull)
    >                 notnull_offset++;
    >             /* record the row status */
    >             put_notnull_info(winobj, abs_pos, *isnull);
    >         }
    >     } while (notnull_offset < notnull_relpos);
    > 
    >     /* get tuple and evaluate in partition */
    >     datum = gettuple_eval_partition(winobj, argno,
    >                                     abs_pos, isnull, &myisout);
    > 
    > And Coverity is telling that there is no point in setting a datum in
    > this else condition to just override its value when we exit the while
    > loop.  To me, it's a sigh that this code's logic could be simplified.
    
    To fix the issue, I think we can change:
    
    >     datum = gettuple_eval_partition(winobj, argno,
    >                                     abs_pos, isnull, &myisout);
    
    to:
    
         (void) gettuple_eval_partition(winobj, argno,
                                               abs_pos, isnull, &myisout);
    
    This explicitely stats that we ignore the return value from
    gettuple_eval_partition. I hope coverity understands this.
    
    > In passing, gettuple_eval_partition() is under-documented for me.  Its
    > name refers to the fact that it gets a tuple and evaluates a
    > partition.  Its top comment tells the same thing as the name of the
    > function, so it's a bit hard to say why it is useful with the code
    > written this way, and how others many benefit when attempting to reuse
    > it, or if it even makes sense to reuse it for other purposes.
    
    What about changing the comment this way?
    
    /* gettuple_eval_partition
     * get tuple in a patition and evaluate the window function's argument
     * expression on it.
     */
    
    Attached is the patch for above.
    --
    Tatsuo Ishii
    SRA OSS K.K.
    English: http://www.sraoss.co.jp/index_en/
    Japanese:http://www.sraoss.co.jp