From: | Mark Hills <mark(at)xwax(dot)org> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | pgsql-hackers(at)postgresql(dot)org |
Subject: | Re: Regression on pg_restore to 16.0: DOMAIN not available to SQL function |
Date: | 2023-11-06 16:46:36 |
Message-ID: | 683ef58e-130a-f0d8-da98-ce7f97ff8086@xwax.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On Fri, 3 Nov 2023, Tom Lane wrote:
> Mark Hills <mark(at)xwax(dot)org> writes:
> > On Fri, 3 Nov 2023, Tom Lane wrote:
> >> However, then it's not clear why it would've worked
> >> in 15.4 which does the same thing. I wonder whether you are
> >> using this function in a column default for the troublesome
> >> table.
>
> > Yes, it's just a simple DEFAULT:
>
> > CREATE TABLE authentic (
> > key hash NOT NULL UNIQUE DEFAULT gen_hash(32),
>
> > and so every row would have a value.
>
> Right, so the 910eb61b2 fix explains it. I guess I'd better
> expand the release note entry, because we'd not foreseen this
> particular failure mode.
Indeed, and curiosity got the better of me so I constructed a minimal test
case (see below)
This minimal test demonstrates a database which will pg_dump but cannot
restore (custom with pg_restore, or plain SQL with psql.)
I assumed I'd need at least one row of data to trigger the bug (to call on
a default), but that's not the case and here it is with an empty table.
I then tested REL_16_STABLE branch (e24daa94b) the problem does not occur,
as expected.
Also, the stable branch version was able to restore the pg_dump from 16.0
release, which is as expected and is probably important (and helpful)
Thanks
--
Mark
==> test.sql <==
CREATE FUNCTION inner()
RETURNS integer AS
$$
SELECT 1;
$$ LANGUAGE SQL;
CREATE FUNCTION outer()
RETURNS integer AS
$$
SELECT inner();
$$ LANGUAGE SQL;
CREATE TABLE test (
v integer NOT NULL DEFAULT outer()
);
$ createdb test
$ psql test < test.sql
$ pg_dump --format custom --file test.pgdump test
$ createdb restore
$ pg_restore --dbname restore test.pgdump
pg_restore: error: could not execute query: ERROR: function inner() does not exist
LINE 2: SELECT inner();
^
HINT: No function matches the given name and argument types. You might
need to add explicit type casts.
QUERY:
SELECT inner();
CONTEXT: SQL function "outer" during inlining
Command was: COPY public.test (v) FROM stdin;
pg_restore: warning: errors ignored on restore: 1
$ pg_dump --format plain --file test.pgdump test
$ createdb restore
$ psql restore < test.pgdump
SET
SET
SET
SET
SET
set_config
------------
(1 row)
SET
SET
SET
SET
CREATE FUNCTION
ALTER FUNCTION
CREATE FUNCTION
ALTER FUNCTION
SET
SET
CREATE TABLE
ALTER TABLE
ERROR: function inner() does not exist
LINE 2: SELECT inner();
^
HINT: No function matches the given name and argument types. You might
need to add explicit type casts.
QUERY:
SELECT inner();
CONTEXT: SQL function "outer" during inlining
invalid command \.
From | Date | Subject | |
---|---|---|---|
Next Message | Laurenz Albe | 2023-11-06 16:58:01 | Re: Wrong security context for deferred triggers? |
Previous Message | Peter Eisentraut | 2023-11-06 16:46:23 | Re: Explicitly skip TAP tests under Meson if disabled |