BUG #19034: Recursive function with sql_body can replace an existing function but can not be created on it's own
PG Bug reporting form <noreply@postgresql.org>
From: PG Bug reporting form <noreply@postgresql.org>
To: pgsql-bugs@lists.postgresql.org
Cc: katja.henke@foo.ag
Date: 2025-08-28T12:09:30Z
Lists: pgsql-bugs
The following bug has been logged on the website: Bug reference: 19034 Logged by: Katja Henke Email address: katja.henke@foo.ag PostgreSQL version: 15.3 Operating system: Linux Description: An existing function can be converted into a recursive function that uses sql_body. But it is not possible to create this same recursive function using CREATE FUNCTION. In other words: if you managed to have a recursive function with sql_body in your database, you can't simply restore a dump of this database. The following statement results in ERROR: 42883: function pg_temp.do_something(integer) does not exist CREATE FUNCTION pg_temp.do_something(int) RETURNS int LANGUAGE sql RETURN CASE WHEN $1 % 2 = 1 THEN pg_temp.do_something($1 + 1) ELSE $1 END; But the combination of the following statements works. It does not matter if the first function uses sql_body or a string constant. CREATE FUNCTION pg_temp.do_something(int) RETURNS int LANGUAGE sql RETURN 42; CREATE OR REPLACE FUNCTION pg_temp.do_something(int) RETURNS int LANGUAGE sql RETURN CASE WHEN $1 % 2 = 1 THEN pg_temp.do_something($1 + 1) ELSE $1 END;