From 9bf3a414560d93ef8e8cf61748cd5783ab4bc9f9 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Tue, 8 Sep 2026 12:06:09 -0700 Subject: [PATCH] Fix REPACK (CONCURRENTLY) when the table owner lacks CONNECT. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit REPACK (CONCURRENTLY) launches a background worker to decode changes made while the table is being rewritten. The worker connects as the table owner but bypassed the LOGIN check only, so CONNECT was still checked against a role that need not have it, and the command could fail with "permission denied for database". Pass BGWORKER_BYPASS_ALLOWCONN as well, as we do for parallel workers. That is safe because the leader already checked the invoking user's privileges on the table before starting the worker. Reported-by: Nathan Bossart Author: Matheus Alcantara Reviewed-by: Nathan Bossart Reviewed-by: Bharath Rupireddy Reviewed-by: Masahiko Sawada Reviewed-by: Álvaro Herrera Discussion: https://postgr.es/m/apBbzFd_EYAfHV45@nathan Backpatch-through: 19 --- src/backend/commands/repack_worker.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/backend/commands/repack_worker.c b/src/backend/commands/repack_worker.c index af7e2a94764..b4ba9cfc67b 100644 --- a/src/backend/commands/repack_worker.c +++ b/src/backend/commands/repack_worker.c @@ -101,8 +101,14 @@ RepackWorkerMain(Datum main_arg) pq_set_parallel_leader(shared->backend_pid, shared->backend_proc_number); - /* Connect to the database. LOGIN is not required. */ + /* + * Connect to the database, skipping the connection authorization checks + * as parallel workers do. Note that we run as the owner of the table + * being repacked, who need not be able to log in or connect; the leader + * checked the invoking user's privileges before starting us. + */ BackgroundWorkerInitializeConnectionByOid(shared->dbid, shared->roleid, + BGWORKER_BYPASS_ALLOWCONN | BGWORKER_BYPASS_ROLELOGINCHECK); /*