Hi all,

I noticed this strange behaviour whilst trying to write a function for Postgres 
11.5 (PostgreSQL 11.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 
20150623 (Red Hat 4.8.5-36), 64-bit) and reduced it to this minimal example.  
Using a function parameter in the window frame definition seems to be the cause 
of the error.

    create or replace function f(group_size bigint) returns setof int[] as
    $$
        select array_agg(s) over w
        from generate_series(1,10) s
        window w as (order by s rows between current row and group_size 
following)
    $$ language sql immutable;

Calling the function without a column list succeeds:

    postgres=# select f(3);
        f
    ------------
    {1,2,3,4}
    {2,3,4,5}
    {3,4,5,6}
    {4,5,6,7}
    {5,6,7,8}
    {6,7,8,9}
    {7,8,9,10}
    {8,9,10}
    {9,10}
    {10}
    (10 rows)

Calling the function with select * fails:

    postgres=# select * from f(3);
    ERROR:  42704: no value found for parameter 1
    LOCATION:  ExecEvalParamExtern, execExprInterp.c:2296

Using a plpgsql function with a stringified query works, which is my current 
workaround:

    create or replace function f1(group_size bigint) returns setof int[] as
    $$
    begin
        return query execute format($q$
            select array_agg(s) over w as t
            from generate_series(1,10) s
            window w as (order by s rows between current row and %1$s following)
        $q$,group_size);
    end;
    $$ language plpgsql immutable;

This appears to be a bug to me.  If confirmed that this is not some expected 
behaviour unknown to me I will report this.

Alastair







Reply via email to