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 c4067383cb 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 <lic@highgo.com>
Reviewed-by: Fujii Masao <masao.fujii@gmail.com>
Discussion: https://postgr.es/m/EDFF0AFB-050F-4FBF-8D4F-B44DC454D957@gmail.com
This commit is contained in:
Fujii Masao 2026-06-03 16:53:16 +09:00
parent 273a3c7761
commit 95b6ec52e6
2 changed files with 12 additions and 6 deletions

View file

@ -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,

View file

@ -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) ", "