BUG #15122: can't import data if table has a constraint with afunction calling another function
От | PG Bug reporting form |
---|---|
Тема | BUG #15122: can't import data if table has a constraint with afunction calling another function |
Дата | |
Msg-id | 152153826367.11956.8092048336300020216@wrigleys.postgresql.org обсуждение исходный текст |
Ответы |
Re: BUG #15122: can't import data if table has a constraint with a function calling another function
|
Список | pgsql-bugs |
The following bug has been logged on the website: Bug reference: 15122 Logged by: Asier Lostalé Email address: asier.lostale@openbravo.com PostgreSQL version: 9.3.22 Operating system: ubuntu Description: Using only public schema, data in tables that use in check constraints functions that invoke other functions does not get imported with pg_restore after it was dumped with pg_dump. But if functions in check constraints do not invoke other functions, data is correctly imported. I have noted this behavior after minor upgrading from 9.3.22 to 9.3.23 and from 9.4.16 to 9.4.17; in 9.3.22 and 9.3.17 it worked fine. I understand is due to changes in search_path (https://bucardo.org/postgres_all_versions.html#version_9.3.22). But it's unclear to me why having one level public functions is allowed but it is not those functions to invoke other ones. It looks inconsistent. For example, having this structure and data: CREATE OR REPLACE FUNCTION is_even(n integer) RETURNS boolean AS $BODY$ BEGIN return n%2 = 0; END ; $BODY$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION is_even_positive(n integer) RETURNS boolean AS $BODY$ BEGIN return is_even(n) and n > 0; END ; $BODY$ LANGUAGE plpgsql; CREATE TABLE test_check ( n integer CONSTRAINT even_chk CHECK (is_even(n))); CREATE TABLE test_check2( n integer CONSTRAINT even_positive_chk CHECK (is_even_positive(n))); insert into test_check values (2); insert into test_check values (-2); insert into test_check2 values (2); Exporting it with: pg_dump -h localhost -p 5432 -F c -b -v -f test.dmp test -U test And importing it in a new database: $ pg_restore -d test2 -U test -v test.dmp -h localhost pg_restore: connecting to database for restore pg_restore: creating SCHEMA "public" pg_restore: creating COMMENT "SCHEMA public" pg_restore: creating EXTENSION "plpgsql" pg_restore: creating COMMENT "EXTENSION plpgsql" pg_restore: creating FUNCTION "public.is_even(integer)" pg_restore: creating FUNCTION "public.is_even_positive(integer)" pg_restore: creating TABLE "public.test_check" pg_restore: creating TABLE "public.test_check2" pg_restore: processing data for table "public.test_check" pg_restore: processing data for table "public.test_check2" pg_restore: [archiver (db)] Error while PROCESSING TOC: pg_restore: [archiver (db)] Error from TOC entry 2035; 0 7784774 TABLE DATA test_check2 tad pg_restore: [archiver (db)] COPY failed for table "test_check2": ERROR: function is_even(integer) does not exist LINE 1: SELECT is_even(n) and n > 0 ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. QUERY: SELECT is_even(n) and n > 0 CONTEXT: PL/pgSQL function public.is_even_positive(integer) line 3 at RETURN COPY test_check2, line 1: "2" pg_restore: creating ACL "SCHEMA public" WARNING: errors ignored on restore: 1
В списке pgsql-bugs по дате отправления: