@@ -1780,37 +1780,37 @@ ReindexTable(RangeVar *relation)
17801780}
17811781
17821782/*
1783- *ReindexObject
1784- *Recreate indexes ofobject whose type is defined by objectKind.
1783+ *ReindexMultipleTables
1784+ *Recreate indexes oftables selected byobjectName/ objectKind.
17851785 *
17861786 * To reduce the probability of deadlocks, each table is reindexed in a
17871787 * separate transaction, so we can release the lock on it right away.
17881788 * That means this must not be called within a user transaction block!
17891789 */
1790- Oid
1791- ReindexObject (const char * objectName ,ReindexObjectType objectKind )
1790+ void
1791+ ReindexMultipleTables (const char * objectName ,ReindexObjectType objectKind )
17921792{
17931793Oid objectOid ;
17941794Relation relationRelation ;
17951795HeapScanDesc scan ;
1796- ScanKeyData * scan_keys = NULL ;
1796+ ScanKeyData scan_keys [ 1 ] ;
17971797HeapTuple tuple ;
17981798MemoryContext private_context ;
17991799MemoryContext old ;
18001800List * relids = NIL ;
18011801ListCell * l ;
1802- int num_keys ;
1802+ int num_keys ;
18031803
18041804AssertArg (objectName );
18051805Assert (objectKind == REINDEX_OBJECT_SCHEMA ||
18061806objectKind == REINDEX_OBJECT_SYSTEM ||
18071807objectKind == REINDEX_OBJECT_DATABASE );
18081808
18091809/*
1810- * Get OID of object to reindex, being the database currently being
1811- *used by session for a database or for system catalogs, or the schema
1812- *defined by caller. At the same time do permission checks that need
1813- *different processing depending on the object type.
1810+ * Get OID of object to reindex, being the database currently being used
1811+ * by session for a database or for system catalogs, or the schema defined
1812+ * by caller. At the same time do permission checks that need different
1813+ * processing depending on the object type.
18141814 */
18151815if (objectKind == REINDEX_OBJECT_SCHEMA )
18161816{
@@ -1824,11 +1824,11 @@ ReindexObject(const char *objectName, ReindexObjectType objectKind)
18241824{
18251825objectOid = MyDatabaseId ;
18261826
1827- if (strcmp (objectName ,get_database_name (MyDatabaseId ))!= 0 )
1827+ if (strcmp (objectName ,get_database_name (objectOid ))!= 0 )
18281828ereport (ERROR ,
18291829(errcode (ERRCODE_FEATURE_NOT_SUPPORTED ),
18301830errmsg ("can only reindex the currently open database" )));
1831- if (!pg_database_ownercheck (MyDatabaseId ,GetUserId ()))
1831+ if (!pg_database_ownercheck (objectOid ,GetUserId ()))
18321832aclcheck_error (ACLCHECK_NOT_OWNER ,ACL_KIND_DATABASE ,
18331833objectName );
18341834}
@@ -1840,42 +1840,19 @@ ReindexObject(const char *objectName, ReindexObjectType objectKind)
18401840 * abort cleanup logic.
18411841 */
18421842private_context = AllocSetContextCreate (PortalContext ,
1843- (objectKind == REINDEX_OBJECT_SCHEMA ) ?
1844- "ReindexSchema" :"ReindexDatabase" ,
1843+ "ReindexMultipleTables" ,
18451844ALLOCSET_DEFAULT_MINSIZE ,
18461845ALLOCSET_DEFAULT_INITSIZE ,
18471846ALLOCSET_DEFAULT_MAXSIZE );
18481847
18491848/*
1850- * We always want to reindex pg_class first when reindexing system
1851- * catalogs or a database. This ensures that if there is any corruption
1852- * in pg_class' indexes, they will be fixed before we process any other
1853- * tables. This is critical because reindexing itself will try to
1854- * update pg_class.
1855- */
1856- if (objectKind == REINDEX_OBJECT_DATABASE ||
1857- objectKind == REINDEX_OBJECT_SYSTEM ||
1858- (objectKind == REINDEX_OBJECT_SCHEMA &&
1859- IsSystemNamespace (objectOid )))
1860- {
1861- old = MemoryContextSwitchTo (private_context );
1862- relids = lappend_oid (relids ,RelationRelationId );
1863- MemoryContextSwitchTo (old );
1864- }
1865-
1866- /*
1867- * Define the search keys to find the objects to reindex. For a schema,
1868- * we search target relations using relnamespace and relkind, something
1869- * not necessary for a database-wide operation.
1849+ * Define the search keys to find the objects to reindex. For a schema, we
1850+ * select target relations using relnamespace, something not necessary for
1851+ * a database-wide operation.
18701852 */
18711853if (objectKind == REINDEX_OBJECT_SCHEMA )
18721854{
1873- /*
1874- * Return all objects in schema. We filter out
1875- * inappropriate objects as we walk through results.
1876- */
18771855num_keys = 1 ;
1878- scan_keys = palloc (sizeof (ScanKeyData ));
18791856ScanKeyInit (& scan_keys [0 ],
18801857Anum_pg_class_relnamespace ,
18811858BTEqualStrategyNumber ,F_OIDEQ ,
@@ -1898,8 +1875,8 @@ ReindexObject(const char *objectName, ReindexObjectType objectKind)
18981875Oid relid = HeapTupleGetOid (tuple );
18991876
19001877/*
1901- * Only regular tables and matviews can have indexes,
1902- *so filter out any other kind ofobject .
1878+ * Only regular tables and matviews can have indexes, so ignore any
1879+ * other kind ofrelation .
19031880 */
19041881if (classtuple -> relkind != RELKIND_RELATION &&
19051882classtuple -> relkind != RELKIND_MATVIEW )
@@ -1911,20 +1888,25 @@ ReindexObject(const char *objectName, ReindexObjectType objectKind)
19111888continue ;
19121889
19131890/* Check user/system classification, and optionally skip */
1914- if (! IsSystemClass ( relid , classtuple ) &&
1915- objectKind == REINDEX_OBJECT_SYSTEM )
1891+ if (objectKind == REINDEX_OBJECT_SYSTEM &&
1892+ ! IsSystemClass ( relid , classtuple ) )
19161893continue ;
19171894
1895+ /* Save the list of relation OIDs in private context */
1896+ old = MemoryContextSwitchTo (private_context );
1897+
19181898/*
1919- * Already have it in the case of system catalogs being all
1920- * reindexed, of a database or of a system catalog being reindexed
1921- * as a schema.
1899+ * We always want to reindex pg_class first if it's selected to be
1900+ * reindexed. This ensures that if there is any corruption in
1901+ * pg_class' indexes, they will be fixed before we process any other
1902+ * tables. This is critical because reindexing itself will try to
1903+ * update pg_class.
19221904 */
1923- if (HeapTupleGetOid (tuple )== RelationRelationId )
1924- continue ;
1905+ if (relid == RelationRelationId )
1906+ relids = lcons_oid (relid ,relids );
1907+ else
1908+ relids = lappend_oid (relids ,relid );
19251909
1926- old = MemoryContextSwitchTo (private_context );
1927- relids = lappend_oid (relids ,relid );
19281910MemoryContextSwitchTo (old );
19291911}
19301912heap_endscan (scan );
@@ -1953,8 +1935,4 @@ ReindexObject(const char *objectName, ReindexObjectType objectKind)
19531935StartTransactionCommand ();
19541936
19551937MemoryContextDelete (private_context );
1956- if (scan_keys )
1957- pfree (scan_keys );
1958-
1959- return objectOid ;
19601938}