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