aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2020-04-06 11:44:23 +0900
committerMichael Paquier <michael@paquier.xyz>2020-04-06 11:44:23 +0900
commit8ef9451f58ee92d1cdb910e72010dbe75e76f9b8 (patch)
tree0139670b79fed18fe65e33ec94dde4bd6f525f8b
parent33e05f89c53e5a1533d624046bb6fb0da7bb7141 (diff)
downloadpostgresql-8ef9451f58ee92d1cdb910e72010dbe75e76f9b8.tar.gz
postgresql-8ef9451f58ee92d1cdb910e72010dbe75e76f9b8.zip
Refactor cluster.c to use new routine get_index_isclustered()
This new cache lookup routine has been introduced in a40caf5, and more code paths can directly use it. Note that in cluster_rel(), the code was returning immediately if the tuple's entry in pg_index for the clustered index was not valid. This commit changes the code so as a lookup error is raised instead, something that could not happen from the start as we check for the existence of the index beforehand, while holding an exclusive lock on the parent table. Author: Justin Pryzby Reviewed-by: Álvaro Herrera, Michael Paquier Discussion: https://postgr.es/m/20200202161718.GI13621@telsasoft.com
-rw-r--r--src/backend/commands/cluster.c41
1 files changed, 3 insertions, 38 deletions
diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c
index ccd0c9b286e..04d12a7ece6 100644
--- a/src/backend/commands/cluster.c
+++ b/src/backend/commands/cluster.c
@@ -139,21 +139,9 @@ cluster(ClusterStmt *stmt, bool isTopLevel)
/* We need to find the index that has indisclustered set. */
foreach(index, RelationGetIndexList(rel))
{
- HeapTuple idxtuple;
- Form_pg_index indexForm;
-
indexOid = lfirst_oid(index);
- idxtuple = SearchSysCache1(INDEXRELID,
- ObjectIdGetDatum(indexOid));
- if (!HeapTupleIsValid(idxtuple))
- elog(ERROR, "cache lookup failed for index %u", indexOid);
- indexForm = (Form_pg_index) GETSTRUCT(idxtuple);
- if (indexForm->indisclustered)
- {
- ReleaseSysCache(idxtuple);
+ if (get_index_isclustered(indexOid))
break;
- }
- ReleaseSysCache(idxtuple);
indexOid = InvalidOid;
}
@@ -304,9 +292,6 @@ cluster_rel(Oid tableOid, Oid indexOid, int options)
*/
if (recheck)
{
- HeapTuple tuple;
- Form_pg_index indexForm;
-
/* Check that the user still owns the relation */
if (!pg_class_ownercheck(tableOid, GetUserId()))
{
@@ -345,22 +330,12 @@ cluster_rel(Oid tableOid, Oid indexOid, int options)
/*
* Check that the index is still the one with indisclustered set.
*/
- tuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(indexOid));
- if (!HeapTupleIsValid(tuple)) /* probably can't happen */
- {
- relation_close(OldHeap, AccessExclusiveLock);
- pgstat_progress_end_command();
- return;
- }
- indexForm = (Form_pg_index) GETSTRUCT(tuple);
- if (!indexForm->indisclustered)
+ if (!get_index_isclustered(indexOid))
{
- ReleaseSysCache(tuple);
relation_close(OldHeap, AccessExclusiveLock);
pgstat_progress_end_command();
return;
}
- ReleaseSysCache(tuple);
}
}
@@ -519,18 +494,8 @@ mark_index_clustered(Relation rel, Oid indexOid, bool is_internal)
*/
if (OidIsValid(indexOid))
{
- indexTuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(indexOid));
- if (!HeapTupleIsValid(indexTuple))
- elog(ERROR, "cache lookup failed for index %u", indexOid);
- indexForm = (Form_pg_index) GETSTRUCT(indexTuple);
-
- if (indexForm->indisclustered)
- {
- ReleaseSysCache(indexTuple);
+ if (get_index_isclustered(indexOid))
return;
- }
-
- ReleaseSysCache(indexTuple);
}
/*