diff options
Diffstat (limited to 'src/backend/commands/indexcmds.c')
-rw-r--r-- | src/backend/commands/indexcmds.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 4d76da82937..d05d2fd3d5c 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -2444,17 +2444,25 @@ ReindexTable(RangeVar *relation, int options, bool concurrent) RangeVarCallbackOwnsTable, NULL); if (concurrent) + { result = ReindexRelationConcurrently(heapOid, options); + + if (!result) + ereport(NOTICE, + (errmsg("table \"%s\" has no indexes that can be reindexed concurrently", + relation->relname))); + } else + { result = reindex_relation(heapOid, REINDEX_REL_PROCESS_TOAST | REINDEX_REL_CHECK_CONSTRAINTS, options); - - if (!result) - ereport(NOTICE, - (errmsg("table \"%s\" has no indexes", - relation->relname))); + if (!result) + ereport(NOTICE, + (errmsg("table \"%s\" has no indexes to reindex", + relation->relname))); + } return heapOid; } @@ -2636,7 +2644,6 @@ ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind, foreach(l, relids) { Oid relid = lfirst_oid(l); - bool result; StartTransactionCommand(); /* functions in indexes may want a snapshot set */ @@ -2644,11 +2651,13 @@ ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind, if (concurrent) { - result = ReindexRelationConcurrently(relid, options); + (void) ReindexRelationConcurrently(relid, options); /* ReindexRelationConcurrently() does the verbose output */ } else { + bool result; + result = reindex_relation(relid, REINDEX_REL_PROCESS_TOAST | REINDEX_REL_CHECK_CONSTRAINTS, @@ -2675,13 +2684,19 @@ ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind, * ReindexRelationConcurrently - process REINDEX CONCURRENTLY for given * relation OID * - * The relation can be either an index or a table. If it is a table, all its - * valid indexes will be rebuilt, including its associated toast table - * indexes. If it is an index, this index itself will be rebuilt. + * 'relationOid' can either belong to an index, a table or a materialized + * view. For tables and materialized views, all its indexes will be rebuilt, + * excluding invalid indexes and any indexes used in exclusion constraints, + * but including its associated toast table indexes. For indexes, the index + * itself will be rebuilt. If 'relationOid' belongs to a partitioned table + * then we issue a warning to mention these are not yet supported. * * The locks taken on parent tables and involved indexes are kept until the * transaction is committed, at which point a session lock is taken on each * relation. Both of these protect against concurrent schema changes. + * + * Returns true if any indexes have been rebuilt (including toast table's + * indexes, when relevant), otherwise returns false. */ static bool ReindexRelationConcurrently(Oid relationOid, int options) |