mirror of
https://github.com/postgres/postgres.git
synced 2025-11-22 12:22:45 +03:00
Refactor option handling of CLUSTER, REINDEX and VACUUM
This continues the work done in b5913f6. All the options of those
commands are changed to use hex values rather than enums to reduce the
risk of compatibility bugs when introducing new options. Each option
set is moved into a new structure that can be extended with more
non-boolean options (this was already the case of VACUUM). The code of
REINDEX is restructured so as manual REINDEX commands go through a
single routine from utility.c, like VACUUM, to ease the allocation
handling of option parameters when a command needs to go through
multiple transactions.
This can be used as a base infrastructure for future patches related to
those commands, including reindex filtering and tablespace support.
Per discussion with people mentioned below, as well as Alvaro Herrera
and Peter Eisentraut.
Author: Michael Paquier, Justin Pryzby
Reviewed-by: Alexey Kondratov, Justin Pryzby
Discussion: https://postgr.es/m/X8riynBLwxAD9uKk@paquier.xyz
This commit is contained in:
@@ -3594,7 +3594,7 @@ IndexGetRelation(Oid indexId, bool missing_ok)
|
||||
*/
|
||||
void
|
||||
reindex_index(Oid indexId, bool skip_constraint_checks, char persistence,
|
||||
int options)
|
||||
ReindexParams *params)
|
||||
{
|
||||
Relation iRel,
|
||||
heapRelation;
|
||||
@@ -3602,7 +3602,7 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence,
|
||||
IndexInfo *indexInfo;
|
||||
volatile bool skipped_constraint = false;
|
||||
PGRUsage ru0;
|
||||
bool progress = (options & REINDEXOPT_REPORT_PROGRESS) != 0;
|
||||
bool progress = ((params->options & REINDEXOPT_REPORT_PROGRESS) != 0);
|
||||
|
||||
pg_rusage_init(&ru0);
|
||||
|
||||
@@ -3611,12 +3611,12 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence,
|
||||
* we only need to be sure no schema or data changes are going on.
|
||||
*/
|
||||
heapId = IndexGetRelation(indexId,
|
||||
(options & REINDEXOPT_MISSING_OK) != 0);
|
||||
(params->options & REINDEXOPT_MISSING_OK) != 0);
|
||||
/* if relation is missing, leave */
|
||||
if (!OidIsValid(heapId))
|
||||
return;
|
||||
|
||||
if ((options & REINDEXOPT_MISSING_OK) != 0)
|
||||
if ((params->options & REINDEXOPT_MISSING_OK) != 0)
|
||||
heapRelation = try_table_open(heapId, ShareLock);
|
||||
else
|
||||
heapRelation = table_open(heapId, ShareLock);
|
||||
@@ -3792,7 +3792,7 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence,
|
||||
}
|
||||
|
||||
/* Log what we did */
|
||||
if (options & REINDEXOPT_VERBOSE)
|
||||
if ((params->options & REINDEXOPT_VERBOSE) != 0)
|
||||
ereport(INFO,
|
||||
(errmsg("index \"%s\" was reindexed",
|
||||
get_rel_name(indexId)),
|
||||
@@ -3846,7 +3846,7 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence,
|
||||
* index rebuild.
|
||||
*/
|
||||
bool
|
||||
reindex_relation(Oid relid, int flags, int options)
|
||||
reindex_relation(Oid relid, int flags, ReindexParams *params)
|
||||
{
|
||||
Relation rel;
|
||||
Oid toast_relid;
|
||||
@@ -3861,7 +3861,7 @@ reindex_relation(Oid relid, int flags, int options)
|
||||
* to prevent schema and data changes in it. The lock level used here
|
||||
* should match ReindexTable().
|
||||
*/
|
||||
if ((options & REINDEXOPT_MISSING_OK) != 0)
|
||||
if ((params->options & REINDEXOPT_MISSING_OK) != 0)
|
||||
rel = try_table_open(relid, ShareLock);
|
||||
else
|
||||
rel = table_open(relid, ShareLock);
|
||||
@@ -3935,7 +3935,7 @@ reindex_relation(Oid relid, int flags, int options)
|
||||
}
|
||||
|
||||
reindex_index(indexOid, !(flags & REINDEX_REL_CHECK_CONSTRAINTS),
|
||||
persistence, options);
|
||||
persistence, params);
|
||||
|
||||
CommandCounterIncrement();
|
||||
|
||||
@@ -3965,8 +3965,10 @@ reindex_relation(Oid relid, int flags, int options)
|
||||
* Note that this should fail if the toast relation is missing, so
|
||||
* reset REINDEXOPT_MISSING_OK.
|
||||
*/
|
||||
result |= reindex_relation(toast_relid, flags,
|
||||
options & ~(REINDEXOPT_MISSING_OK));
|
||||
ReindexParams newparams = *params;
|
||||
|
||||
newparams.options &= ~(REINDEXOPT_MISSING_OK);
|
||||
result |= reindex_relation(toast_relid, flags, &newparams);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
Reference in New Issue
Block a user