BUG #18713: pg_upgrade fails when owner of an extension is changed or dropped

From: PG Bug reporting form <noreply(at)postgresql(dot)org>
To: pgsql-bugs(at)lists(dot)postgresql(dot)org
Cc: mittalhanumant(at)gmail(dot)com
Subject: BUG #18713: pg_upgrade fails when owner of an extension is changed or dropped
Date: 2024-11-18 13:38:30
Message-ID: 18713-21afc479c25cce4b@postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

The following bug has been logged on the website:

Bug reference: 18713
Logged by: Hanumant Mittal
Email address: mittalhanumant(at)gmail(dot)com
PostgreSQL version: 15.4
Operating system: Debian GNU/Linux rodete
Description:

pg_upgrade from pg14 to pg15 fails with error of this kind:
```
pg_restore: from TOC entry 3999; 0 0 ACL FUNCTION
"pg_stat_statements_reset"("userid" "oid", "dbid" "oid", "queryid" bigint)
newuser
pg_restore: error: could not execute query: ERROR: role "16384" does not
exist
```

Condition that seems to be triggering this is if we create an extension with
one user (e.g. olduser), reassigned to another user (e.g. newuser) and drop
the olduser. Post that if we trigger pg_upgrade it fails.

Steps to reproduce:
# Setup pg14
/usr/lib/postgresql/14/bin/initdb --locale=C.UTF-8 /tmp/data-14
/usr/lib/postgresql/14/bin/pg_ctl -D /tmp/data-14 -l logfile start

# Steps on psql
postgres=# select version();
version

------------------------------------------------------------------------------------------------------------------
PostgreSQL 14.5 (Debian 14.5-3+build1) on x86_64-pc-linux-gnu, compiled by
gcc (Debian 12.2.0-14) 12.2.0, 64-bit
(1 row)

postgres=# CREATE USER olduser WITH PASSWORD 'old_password';
ALTER USER olduser WITH SUPERUSER;
CREATE USER newuser WITH PASSWORD 'new_password';
ALTER USER newuser WITH SUPERUSER;
CREATE ROLE
ALTER ROLE
CREATE ROLE
ALTER ROLE
postgres=# \q
postgres(at)hanumant:~$ /usr/lib/postgresql/14/bin/psql -U olduser -d
postgres
psql (14.5 (Debian 14.5-3+build1))
Type "help" for help.

postgres=# CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
CREATE EXTENSION
postgres=# \q
postgres(at)hanumant:~$ /usr/lib/postgresql/14/bin/psql -U postgres -d
postgres^C
postgres(at)hanumant:~$ /usr/lib/postgresql/14/bin/psql -U postgres -d
postgres
psql (14.5 (Debian 14.5-3+build1))
Type "help" for help.

postgres=# REASSIGN OWNED by olduser to newuser;
DROP USER olduser;
\q
REASSIGN OWNED
DROP ROLE
postgres(at)hanumant:~$

# do pg_upgrade
## Setup pg15

/usr/lib/postgresql/15/bin/initdb --locale=C.UTF-8 /tmp/data-15

## Trigger upgrade
/usr/lib/postgresql/15/bin/pg_upgrade -b /usr/lib/postgresql/14/bin -B
/usr/lib/postgresql/15/bin -d /tmp/data-14 -D /tmp/data-15 -r -v

Fails with:
executing: ALTER DATABASE "template0" ALLOW_CONNECTIONS = false
ok
Restoring global objects in the new cluster
"/usr/lib/postgresql/15/bin/psql" --echo-queries --set ON_ERROR_STOP=on
--no-psqlrc --dbname=template1 --host /var/lib/postgresql --port 50432
--username postgres -f
"/tmp/data-15/pg_upgrade_output.d/20241118T132722.992/dump/pg_upgrade_dump_globals.sql"
>>
"/tmp/data-15/pg_upgrade_output.d/20241118T132722.992/log/pg_upgrade_utility.log"
2>&1
ok
Restoring database schemas in the new cluster
"/usr/lib/postgresql/15/bin/pg_restore" --host /var/lib/postgresql --port
50432 --username postgres --clean --create --exit-on-error --verbose
--dbname postgres
"/tmp/data-15/pg_upgrade_output.d/20241118T132722.992/dump/pg_upgrade_dump_1.custom"
>>
"/tmp/data-15/pg_upgrade_output.d/20241118T132722.992/log/pg_upgrade_dump_1.log"
2>&1
"/usr/lib/postgresql/15/bin/pg_restore" --host /var/lib/postgresql --port
50432 --username postgres --clean --create --exit-on-error --verbose
--dbname template1
"/tmp/data-15/pg_upgrade_output.d/20241118T132722.992/dump/pg_upgrade_dump_14426.custom"
>>
"/tmp/data-15/pg_upgrade_output.d/20241118T132722.992/log/pg_upgrade_dump_14426.log"
2>&1

*failure*
There were problems executing ""/usr/lib/postgresql/15/bin/pg_restore"
--host /var/lib/postgresql --port 50432 --username postgres --clean --create
--exit-on-error --verbose --dbname template1
"/tmp/data-15/pg_upgrade_output.d/20241118T132722.992/dump/pg_upgrade_dump_14426.custom"
>>
"/tmp/data-15/pg_upgrade_output.d/20241118T132722.992/log/pg_upgrade_dump_14426.log"
2>&1"

Consult the last few lines of
"/tmp/data-15/pg_upgrade_output.d/20241118T132722.992/log/pg_upgrade_dump_14426.log"
for
the probable cause of the failure.
Failure, exiting
"/usr/lib/postgresql/15/bin/pg_ctl" -w -D "/tmp/data-15" -o "" -m fast stop
>>
"/tmp/data-15/pg_upgrade_output.d/20241118T132722.992/log/pg_upgrade_server.log"
2>&1

## Checking logs:
pg_restore: creating ACL "public.FUNCTION
"pg_stat_statements_reset"("userid" "oid", "dbid" "oid", "queryid"
bigint)"
pg_restore: while PROCESSING TOC:
pg_restore: from TOC entry 3999; 0 0 ACL FUNCTION
"pg_stat_statements_reset"("userid" "oid", "dbid" "oid", "queryid" bigint)
newuser
pg_restore: error: could not execute query: ERROR: role "16384" does not
exist
Command was: SELECT pg_catalog.binary_upgrade_set_record_init_privs(true);
REVOKE ALL ON FUNCTION "public"."pg_stat_statements_reset"("userid" "oid",
"dbid" "oid", "queryid" bigint) FROM PUBLIC;
REVOKE ALL ON FUNCTION "public"."pg_stat_statements_reset"("userid" "oid",
"dbid" "oid", "queryid" bigint) FROM "newuser";
SET SESSION AUTHORIZATION "16384";
GRANT ALL ON FUNCTION "public"."pg_stat_statements_reset"("userid" "oid",
"dbid" "oid", "queryid" bigint) TO "16384";
RESET SESSION AUTHORIZATION;
SELECT pg_catalog.binary_upgrade_set_record_init_privs(false);
REVOKE ALL ON FUNCTION "public"."pg_stat_statements_reset"("userid" "oid",
"dbid" "oid", "queryid" bigint) FROM "16384";
GRANT ALL ON FUNCTION "public"."pg_stat_statements_reset"("userid" "oid",
"dbid" "oid", "queryid" bigint) TO "newuser";

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2024-11-18 15:22:09 Re: Getting error while building PSQL 17.1 on AIX box
Previous Message Sandeep Thakkar 2024-11-18 11:06:13 Re: [EXTERNAL] Re: BUG #18707: Installation issue