diff options
author | Michael Paquier <michael@paquier.xyz> | 2019-05-10 08:18:46 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2019-05-10 08:18:46 +0900 |
commit | 508300e2e141a9fd87758ce01374c5b0597986fd (patch) | |
tree | 1772248fd66b1fe83e98c0d741c9aa33d0884f29 /src/backend/commands/indexcmds.c | |
parent | 24c19e9f66863d83009a370604e40b1eaa71bcdd (diff) | |
download | postgresql-508300e2e141a9fd87758ce01374c5b0597986fd.tar.gz postgresql-508300e2e141a9fd87758ce01374c5b0597986fd.zip |
Improve and fix some error handling for REINDEX INDEX/TABLE CONCURRENTLY
This improves the user experience when it comes to restrict several
flavors of REINDEX CONCURRENTLY. First, for INDEX, remove a restriction
on shared relations as we already check after catalog relations. Then,
for TABLE, add a proper error message when attempting to run the command
on system catalogs. The code path of CREATE INDEX CONCURRENTLY already
complains about that, but if a REINDEX is issued then then the error
generated is confusing.
While on it, add more tests to check restrictions on catalog indexes and
on toast table/index for catalogs. Some error messages are improved,
with wording suggestion coming from Tom Lane.
Reported-by: Tom Lane
Author: Michael Paquier
Reviewed-by: Tom Lane
Discussion: https://postgr.es/m/23694.1556806002@sss.pgh.pa.us
Diffstat (limited to 'src/backend/commands/indexcmds.c')
-rw-r--r-- | src/backend/commands/indexcmds.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index dab06e20a83..7e7c03ef124 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -2743,6 +2743,12 @@ ReindexRelationConcurrently(Oid relationOid, int options) MemoryContextSwitchTo(oldcontext); + /* A system catalog cannot be reindexed concurrently */ + if (IsCatalogRelationOid(relationOid)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot reindex a system catalog concurrently"))); + /* Open relation to get its indexes */ heapRelation = table_open(relationOid, ShareUpdateExclusiveLock); @@ -2756,13 +2762,13 @@ ReindexRelationConcurrently(Oid relationOid, int options) if (!indexRelation->rd_index->indisvalid) ereport(WARNING, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot reindex concurrently invalid index \"%s.%s\", skipping", + errmsg("cannot reindex invalid index \"%s.%s\" concurrently, skipping", get_namespace_name(get_rel_namespace(cellOid)), get_rel_name(cellOid)))); else if (indexRelation->rd_index->indisexclusion) ereport(WARNING, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot reindex concurrently exclusion constraint index \"%s.%s\", skipping", + errmsg("cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping", get_namespace_name(get_rel_namespace(cellOid)), get_rel_name(cellOid)))); else @@ -2802,7 +2808,7 @@ ReindexRelationConcurrently(Oid relationOid, int options) if (!indexRelation->rd_index->indisvalid) ereport(WARNING, (errcode(ERRCODE_INDEX_CORRUPTED), - errmsg("cannot reindex concurrently invalid index \"%s.%s\", skipping", + errmsg("cannot reindex invalid index \"%s.%s\" concurrently, skipping", get_namespace_name(get_rel_namespace(cellOid)), get_rel_name(cellOid)))); else @@ -2831,17 +2837,11 @@ ReindexRelationConcurrently(Oid relationOid, int options) { Oid heapId = IndexGetRelation(relationOid, false); - /* A shared relation cannot be reindexed concurrently */ - if (IsSharedRelation(heapId)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("concurrent reindex is not supported for shared relations"))); - /* A system catalog cannot be reindexed concurrently */ if (IsCatalogRelationOid(heapId)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("concurrent reindex is not supported for catalog relations"))); + errmsg("cannot reindex a system catalog concurrently"))); /* Save the list of relation OIDs in private context */ oldcontext = MemoryContextSwitchTo(private_context); @@ -2869,7 +2869,7 @@ ReindexRelationConcurrently(Oid relationOid, int options) /* Return error if type of relation is not supported */ ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("cannot reindex concurrently this type of relation"))); + errmsg("cannot reindex this type of relation concurrently"))); break; } |