Commit 8ef9451f authored by Michael Paquier's avatar Michael Paquier

Refactor cluster.c to use new routine get_index_isclustered()

This new cache lookup routine has been introduced in a40caf5f, 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
parent 33e05f89
...@@ -139,21 +139,9 @@ cluster(ClusterStmt *stmt, bool isTopLevel) ...@@ -139,21 +139,9 @@ cluster(ClusterStmt *stmt, bool isTopLevel)
/* We need to find the index that has indisclustered set. */ /* We need to find the index that has indisclustered set. */
foreach(index, RelationGetIndexList(rel)) foreach(index, RelationGetIndexList(rel))
{ {
HeapTuple idxtuple;
Form_pg_index indexForm;
indexOid = lfirst_oid(index); indexOid = lfirst_oid(index);
idxtuple = SearchSysCache1(INDEXRELID, if (get_index_isclustered(indexOid))
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);
break; break;
}
ReleaseSysCache(idxtuple);
indexOid = InvalidOid; indexOid = InvalidOid;
} }
...@@ -304,9 +292,6 @@ cluster_rel(Oid tableOid, Oid indexOid, int options) ...@@ -304,9 +292,6 @@ cluster_rel(Oid tableOid, Oid indexOid, int options)
*/ */
if (recheck) if (recheck)
{ {
HeapTuple tuple;
Form_pg_index indexForm;
/* Check that the user still owns the relation */ /* Check that the user still owns the relation */
if (!pg_class_ownercheck(tableOid, GetUserId())) if (!pg_class_ownercheck(tableOid, GetUserId()))
{ {
...@@ -345,22 +330,12 @@ cluster_rel(Oid tableOid, Oid indexOid, int options) ...@@ -345,22 +330,12 @@ cluster_rel(Oid tableOid, Oid indexOid, int options)
/* /*
* Check that the index is still the one with indisclustered set. * Check that the index is still the one with indisclustered set.
*/ */
tuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(indexOid)); if (!get_index_isclustered(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)
{ {
ReleaseSysCache(tuple);
relation_close(OldHeap, AccessExclusiveLock); relation_close(OldHeap, AccessExclusiveLock);
pgstat_progress_end_command(); pgstat_progress_end_command();
return; return;
} }
ReleaseSysCache(tuple);
} }
} }
...@@ -519,18 +494,8 @@ mark_index_clustered(Relation rel, Oid indexOid, bool is_internal) ...@@ -519,18 +494,8 @@ mark_index_clustered(Relation rel, Oid indexOid, bool is_internal)
*/ */
if (OidIsValid(indexOid)) if (OidIsValid(indexOid))
{ {
indexTuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(indexOid)); if (get_index_isclustered(indexOid))
if (!HeapTupleIsValid(indexTuple))
elog(ERROR, "cache lookup failed for index %u", indexOid);
indexForm = (Form_pg_index) GETSTRUCT(indexTuple);
if (indexForm->indisclustered)
{
ReleaseSysCache(indexTuple);
return; return;
}
ReleaseSysCache(indexTuple);
} }
/* /*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment