Re: Possible bug (or at least unexpected behavior)
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Adam Mackler <adam@mackler.email>
Cc: "pgsql-sql@lists.postgresql.org" <pgsql-sql@lists.postgresql.org>
Date: 2022-08-07T23:31:41Z
Lists: pgsql-sql
Adam Mackler <adam@mackler.email> writes:
> Briefly, given the following function:
> CREATE FUNCTION runs(input int[], output int[] DEFAULT '{}')
> RETURNS int[] AS $$
> SELECT
> CASE WHEN cardinality(input) = 0 THEN output
> ELSE runs(input[2:],
> array_append(output, CASE
> WHEN input[1] = 0 THEN 0
> ELSE output[cardinality(output)] + input[1]
> END)
> )
> END
> $$ LANGUAGE SQL;
> I expect the following invocation to return an array with the same number of elements as the passed-in argument array:
> # select runs('{0,1,1,1,1,0,-1,-1,-1,0}');
> runs
> ----------------------------------------
> {0,1,2,3,4,5,6,0,0,0,-1,-2,-3,-4,-5,0}
> (1 row)
Yeah, there's a bug in here somewhere. If you transpose the logic
into plpgsql, it behaves fine:
CREATE FUNCTION runs_p(input int[], output int[] DEFAULT '{}')
RETURNS int[] AS $$
begin
return
CASE WHEN cardinality(input) = 0 THEN output
ELSE runs_p(input[2:],
array_append(output, CASE
WHEN input[1] = 0 THEN 0
ELSE output[cardinality(output)] + input[1]
END)
)
END;
end
$$ LANGUAGE plpgsql;
so that might do as a workaround. It looks like memory management
in SQL functions is not coping well with expanded arrays, but I'm
not quite sure where it's going off the rails.
regards, tom lane
Commits
-
Fix handling of R/W expanded datums that are passed to SQL functions.
- ad3e07c15654 15.0 landed
- 95bfadd4e83c 14.6 landed
- 71caf3c4da1c 13.9 landed
- 5b948b5c1336 12.13 landed
- 442dbd669828 11.18 landed
- 309857f9c182 16.0 landed
- 1446612c5b25 10.23 landed