1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-08 11:42:09 +03:00

Don't reset relhasindex for partitioned tables on ANALYZE

Commit 0e69f705cc introduced code to analyze partitioned table;
however, that code fails to preserve pg_class.relhasindex correctly.
Fix by observing whether any indexes exist rather than accidentally
falling through to assuming none do.

Backpatch to 14.

Author: Alexander Pyhalov <a.pyhalov@postgrespro.ru>
Reviewed-by: Álvaro Herrera <alvherre@alvh.no-ip.org>
Reviewed-by: Zhihong Yu <zyu@yugabyte.com>
Discussion: https://postgr.es/m/CALNJ-vS1R3Qoe5t4tbzxrkpBtzRbPq1dDcW4RmA_a+oqweF30w@mail.gmail.com
This commit is contained in:
Alvaro Herrera
2021-07-01 12:56:30 -04:00
parent 2f7bae2f92
commit d700518d74
3 changed files with 61 additions and 9 deletions

View File

@ -420,20 +420,34 @@ do_analyze_rel(Relation onerel, VacuumParams *params,
/*
* Open all indexes of the relation, and see if there are any analyzable
* columns in the indexes. We do not analyze index columns if there was
* an explicit column list in the ANALYZE command, however. If we are
* doing a recursive scan, we don't want to touch the parent's indexes at
* all.
* an explicit column list in the ANALYZE command, however.
*
* If we are doing a recursive scan, we don't want to touch the parent's
* indexes at all. If we're processing a partitioned table, we need to
* know if there are any indexes, but we don't want to process them.
*/
if (!inh)
if (onerel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
{
List *idxs = RelationGetIndexList(onerel);
Irel = NULL;
nindexes = 0;
hasindex = idxs != NIL;
list_free(idxs);
}
else if (!inh)
{
vac_open_indexes(onerel, AccessShareLock, &nindexes, &Irel);
hasindex = nindexes > 0;
}
else
{
Irel = NULL;
nindexes = 0;
hasindex = false;
}
hasindex = (nindexes > 0);
indexdata = NULL;
if (hasindex)
if (nindexes > 0)
{
indexdata = (AnlIndexData *) palloc0(nindexes * sizeof(AnlIndexData));
for (ind = 0; ind < nindexes; ind++)
@ -572,7 +586,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params,
MemoryContextResetAndDeleteChildren(col_context);
}
if (hasindex)
if (nindexes > 0)
compute_index_stats(onerel, totalrows,
indexdata, nindexes,
rows, numrows,
@ -660,10 +674,10 @@ do_analyze_rel(Relation onerel, VacuumParams *params,
/*
* Partitioned tables don't have storage, so we don't set any fields
* in their pg_class entries except for reltuples, which is necessary
* for auto-analyze to work properly.
* for auto-analyze to work properly, and relhasindex.
*/
vac_update_relstats(onerel, -1, totalrows,
0, false, InvalidTransactionId,
0, hasindex, InvalidTransactionId,
InvalidMultiXactId,
in_outer_xact);
}