From 95b6ec52e684e5de743e5bf4a2303f6cac466682 Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Wed, 3 Jun 2026 16:53:16 +0900 Subject: [PATCH] vacuumdb: Fix --analyze-in-stages skipping partitioned tables Commit 6429e5b77 changed vacuumdb to process partitioned tables when --analyze-only or --analyze-in-stages is specified, matching the documented behavior of analyzing regular tables, partitioned tables, and materialized views. Later, commit c4067383cb2 accidentally changed this behavior so that partitioned tables were processed for --analyze-only, but skipped for --analyze-in-stages. As a result, vacuumdb --analyze-in-stages no longer matched its documentation. Partitioned tables were skipped, leaving parent-table statistics outdated even though users running vacuumdb --analyze-in-stages after pg_upgrade, restore, or bulk loading would expect statistics to be rebuilt for the database. Fix this issue by making --analyze-in-stages process partitioned tables again. Author: Chao Li Reviewed-by: Fujii Masao Discussion: https://postgr.es/m/EDFF0AFB-050F-4FBF-8D4F-B44DC454D957@gmail.com --- src/bin/scripts/t/100_vacuumdb.pl | 4 ++++ src/bin/scripts/vacuuming.c | 14 ++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/bin/scripts/t/100_vacuumdb.pl b/src/bin/scripts/t/100_vacuumdb.pl index 84fcacd57fa..5fd55628507 100644 --- a/src/bin/scripts/t/100_vacuumdb.pl +++ b/src/bin/scripts/t/100_vacuumdb.pl @@ -363,6 +363,10 @@ $node->issues_sql_like( [ 'vacuumdb', '--analyze-only', 'postgres' ], qr/statement: ANALYZE public.parent_table/s, '--analyze-only updates statistics for partitioned tables'); +$node->issues_sql_like( + [ 'vacuumdb', '--analyze-in-stages', 'postgres' ], + qr/statement: ANALYZE public.parent_table/s, + '--analyze-in-stages updates statistics for partitioned tables'); $node->issues_sql_unlike( [ 'vacuumdb', '--analyze-only', 'postgres' ], qr/statement:\ VACUUM/sx, diff --git a/src/bin/scripts/vacuuming.c b/src/bin/scripts/vacuuming.c index faac9089a01..37608806056 100644 --- a/src/bin/scripts/vacuuming.c +++ b/src/bin/scripts/vacuuming.c @@ -650,13 +650,15 @@ retrieve_objects(PGconn *conn, vacuumingOptions *vacopts, { /* * vacuumdb should generally follow the behavior of the underlying - * VACUUM and ANALYZE commands. In MODE_ANALYZE mode, process regular - * tables, materialized views, and partitioned tables, just like - * ANALYZE (with no specific target tables) does. Otherwise, process - * only regular tables and materialized views, since VACUUM skips - * partitioned tables when no target tables are specified. + * VACUUM and ANALYZE commands. In MODE_ANALYZE or + * MODE_ANALYZE_IN_STAGES modes, process regular tables, materialized + * views, and partitioned tables, just like ANALYZE (with no specific + * target tables) does. Otherwise, process only regular tables and + * materialized views, since VACUUM skips partitioned tables when no + * target tables are specified. */ - if (vacopts->mode == MODE_ANALYZE) + if (vacopts->mode == MODE_ANALYZE || + vacopts->mode == MODE_ANALYZE_IN_STAGES) appendPQExpBufferStr(&catalog_query, " AND c.relkind OPERATOR(pg_catalog.=) ANY (array[" CppAsString2(RELKIND_RELATION) ", "