>> +/* >> + * ignorenulls_getfuncarginframe >> + * For IGNORE NULLS, get the next nonnull value in the frame, moving >> forward or backward >> + * until we find a value or reach the frame's end. >> + */ >> +static Datum >> +ignorenulls_getfuncarginframe(WindowObject winobj, int argno, >> >> Do you assume that win_nonnulls is sorted by pos? I think it's >> necessarily true that pos in win_nonnulls array is sorted. Is that ok? > > Yes it must be sorted on my understanding of the code.
Then the patch has a problem. I ran a query below and examined win_nonnulls. It seems it was not sorted out. SELECT x,y, nth_value(y,1) IGNORE NULLS OVER w FROM (VALUES (1,1), (2,2), (3,NULL), (4,4), (5,NULL), (6,6), (7,7)) AS t(x,y) WINDOW w AS (ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW); (gdb) p *winobj->win_nonnulls @ winobj->nonnulls_len $8 = {1, 0, 3, 6, 5} Best reagards, -- Tatsuo Ishii SRA OSS K.K. English: http://www.sraoss.co.jp/index_en/ Japanese:http://www.sraoss.co.jp