summaryrefslogtreecommitdiff
path: root/src/backend/catalog/dependency.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-04-14 20:03:27 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-04-14 20:03:27 +0000
commit162bd08b3f2e6783d1d75ae79f86fc444d34a28d (patch)
tree0220cd8a906557db64763a1a57dd339de313d221 /src/backend/catalog/dependency.c
parent9dc2e6deaf66f97ff9157478a517d0f48a1e5060 (diff)
downloadpostgresql-162bd08b3f2e6783d1d75ae79f86fc444d34a28d.tar.gz
Completion of project to use fixed OIDs for all system catalogs and
indexes. Replace all heap_openr and index_openr calls by heap_open and index_open. Remove runtime lookups of catalog OID numbers in various places. Remove relcache's support for looking up system catalogs by name. Bulky but mostly very boring patch ...
Diffstat (limited to 'src/backend/catalog/dependency.c')
-rw-r--r--src/backend/catalog/dependency.c189
1 files changed, 76 insertions, 113 deletions
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index 4090eb3a91..febd0b42dc 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/catalog/dependency.c,v 1.43 2005/04/14 01:38:15 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/catalog/dependency.c,v 1.44 2005/04/14 20:03:23 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -16,7 +16,6 @@
#include "access/genam.h"
#include "access/heapam.h"
-#include "catalog/catname.h"
#include "catalog/dependency.h"
#include "catalog/heap.h"
#include "catalog/index.h"
@@ -28,7 +27,9 @@
#include "catalog/pg_conversion.h"
#include "catalog/pg_depend.h"
#include "catalog/pg_language.h"
+#include "catalog/pg_namespace.h"
#include "catalog/pg_opclass.h"
+#include "catalog/pg_operator.h"
#include "catalog/pg_proc.h"
#include "catalog/pg_rewrite.h"
#include "catalog/pg_trigger.h"
@@ -65,14 +66,25 @@ typedef struct
List *rtables; /* list of rangetables to resolve Vars */
} find_expr_references_context;
-
/*
- * Because not all system catalogs have predetermined OIDs, we build a table
- * mapping between ObjectClasses and OIDs. This is done at most once per
- * backend run, to minimize lookup overhead.
+ * This constant table maps ObjectClasses to the corresponding catalog OIDs.
+ * See also getObjectClass().
*/
-static bool object_classes_initialized = false;
-static Oid object_classes[MAX_OCLASS];
+static const Oid object_classes[MAX_OCLASS] = {
+ RelationRelationId, /* OCLASS_CLASS */
+ ProcedureRelationId, /* OCLASS_PROC */
+ TypeRelationId, /* OCLASS_TYPE */
+ CastRelationId, /* OCLASS_CAST */
+ ConstraintRelationId, /* OCLASS_CONSTRAINT */
+ ConversionRelationId, /* OCLASS_CONVERSION */
+ AttrDefaultRelationId, /* OCLASS_DEFAULT */
+ LanguageRelationId, /* OCLASS_LANGUAGE */
+ OperatorRelationId, /* OCLASS_OPERATOR */
+ OperatorClassRelationId, /* OCLASS_OPCLASS */
+ RewriteRelationId, /* OCLASS_REWRITE */
+ TriggerRelationId, /* OCLASS_TRIGGER */
+ NamespaceRelationId /* OCLASS_SCHEMA */
+};
static void findAutoDeletableObjects(const ObjectAddress *object,
@@ -103,7 +115,6 @@ static void add_exact_object_address(const ObjectAddress *object,
static bool object_address_present(const ObjectAddress *object,
ObjectAddresses *addrs);
static void term_object_addresses(ObjectAddresses *addrs);
-static void init_object_classes(void);
static void getRelationDescription(StringInfo buffer, Oid relid);
@@ -135,7 +146,7 @@ performDeletion(const ObjectAddress *object,
* We save some cycles by opening pg_depend just once and passing the
* Relation pointer down to all the recursive deletion steps.
*/
- depRel = heap_openr(DependRelationName, RowExclusiveLock);
+ depRel = heap_open(DependRelationId, RowExclusiveLock);
/*
* Construct a list of objects that are reachable by AUTO or INTERNAL
@@ -189,7 +200,7 @@ deleteWhatDependsOn(const ObjectAddress *object,
* We save some cycles by opening pg_depend just once and passing the
* Relation pointer down to all the recursive deletion steps.
*/
- depRel = heap_openr(DependRelationName, RowExclusiveLock);
+ depRel = heap_open(DependRelationId, RowExclusiveLock);
/*
* Construct a list of objects that are reachable by AUTO or INTERNAL
@@ -282,7 +293,7 @@ findAutoDeletableObjects(const ObjectAddress *object,
else
nkeys = 2;
- scan = systable_beginscan(depRel, DependReferenceIndex, true,
+ scan = systable_beginscan(depRel, DependReferenceIndexId, true,
SnapshotNow, nkeys, key);
while (HeapTupleIsValid(tup = systable_getnext(scan)))
@@ -417,7 +428,7 @@ recursiveDeletion(const ObjectAddress *object,
else
nkeys = 2;
- scan = systable_beginscan(depRel, DependDependerIndex, true,
+ scan = systable_beginscan(depRel, DependDependerIndexId, true,
SnapshotNow, nkeys, key);
while (HeapTupleIsValid(tup = systable_getnext(scan)))
@@ -650,7 +661,7 @@ deleteDependentObjects(const ObjectAddress *object,
else
nkeys = 2;
- scan = systable_beginscan(depRel, DependReferenceIndex, true,
+ scan = systable_beginscan(depRel, DependReferenceIndexId, true,
SnapshotNow, nkeys, key);
while (HeapTupleIsValid(tup = systable_getnext(scan)))
@@ -1203,11 +1214,6 @@ init_object_addresses(ObjectAddresses *addrs)
addrs->maxrefs = 32; /* arbitrary initial array size */
addrs->refs = (ObjectAddress *)
palloc(addrs->maxrefs * sizeof(ObjectAddress));
-
- /* Initialize object_classes[] if not done yet */
- /* This will be needed by add_object_address() */
- if (!object_classes_initialized)
- init_object_classes();
}
/*
@@ -1298,41 +1304,14 @@ term_object_addresses(ObjectAddresses *addrs)
}
/*
- * Initialize the object_classes[] table.
- *
- * Although some of these OIDs aren't compile-time constants, they surely
- * shouldn't change during a backend's run. So, we look them up the
- * first time through and then cache them.
- */
-static void
-init_object_classes(void)
-{
- object_classes[OCLASS_CLASS] = RelationRelationId;
- object_classes[OCLASS_PROC] = ProcedureRelationId;
- object_classes[OCLASS_TYPE] = TypeRelationId;
- object_classes[OCLASS_CAST] = get_system_catalog_relid(CastRelationName);
- object_classes[OCLASS_CONSTRAINT] = get_system_catalog_relid(ConstraintRelationName);
- object_classes[OCLASS_CONVERSION] = get_system_catalog_relid(ConversionRelationName);
- object_classes[OCLASS_DEFAULT] = get_system_catalog_relid(AttrDefaultRelationName);
- object_classes[OCLASS_LANGUAGE] = get_system_catalog_relid(LanguageRelationName);
- object_classes[OCLASS_OPERATOR] = get_system_catalog_relid(OperatorRelationName);
- object_classes[OCLASS_OPCLASS] = get_system_catalog_relid(OperatorClassRelationName);
- object_classes[OCLASS_REWRITE] = get_system_catalog_relid(RewriteRelationName);
- object_classes[OCLASS_TRIGGER] = get_system_catalog_relid(TriggerRelationName);
- object_classes[OCLASS_SCHEMA] = get_system_catalog_relid(NamespaceRelationName);
- object_classes_initialized = true;
-}
-
-/*
* Determine the class of a given object identified by objectAddress.
*
- * This function is needed just because some of the system catalogs do
- * not have hardwired-at-compile-time OIDs.
+ * This function is essentially the reverse mapping for the object_classes[]
+ * table. We implement it as a function because the OIDs aren't consecutive.
*/
ObjectClass
getObjectClass(const ObjectAddress *object)
{
- /* Easy for the bootstrapped catalogs... */
switch (object->classId)
{
case RelationRelationId:
@@ -1346,65 +1325,49 @@ getObjectClass(const ObjectAddress *object)
case TypeRelationId:
Assert(object->objectSubId == 0);
return OCLASS_TYPE;
- }
- /*
- * Handle cases where catalog's OID is not hardwired.
- */
- if (!object_classes_initialized)
- init_object_classes();
+ case CastRelationId:
+ Assert(object->objectSubId == 0);
+ return OCLASS_CAST;
- if (object->classId == object_classes[OCLASS_CAST])
- {
- Assert(object->objectSubId == 0);
- return OCLASS_CAST;
- }
- if (object->classId == object_classes[OCLASS_CONSTRAINT])
- {
- Assert(object->objectSubId == 0);
- return OCLASS_CONSTRAINT;
- }
- if (object->classId == object_classes[OCLASS_CONVERSION])
- {
- Assert(object->objectSubId == 0);
- return OCLASS_CONVERSION;
- }
- if (object->classId == object_classes[OCLASS_DEFAULT])
- {
- Assert(object->objectSubId == 0);
- return OCLASS_DEFAULT;
- }
- if (object->classId == object_classes[OCLASS_LANGUAGE])
- {
- Assert(object->objectSubId == 0);
- return OCLASS_LANGUAGE;
- }
- if (object->classId == object_classes[OCLASS_OPERATOR])
- {
- Assert(object->objectSubId == 0);
- return OCLASS_OPERATOR;
- }
- if (object->classId == object_classes[OCLASS_OPCLASS])
- {
- Assert(object->objectSubId == 0);
- return OCLASS_OPCLASS;
- }
- if (object->classId == object_classes[OCLASS_REWRITE])
- {
- Assert(object->objectSubId == 0);
- return OCLASS_REWRITE;
- }
- if (object->classId == object_classes[OCLASS_TRIGGER])
- {
- Assert(object->objectSubId == 0);
- return OCLASS_TRIGGER;
- }
- if (object->classId == object_classes[OCLASS_SCHEMA])
- {
- Assert(object->objectSubId == 0);
- return OCLASS_SCHEMA;
+ case ConstraintRelationId:
+ Assert(object->objectSubId == 0);
+ return OCLASS_CONSTRAINT;
+
+ case ConversionRelationId:
+ Assert(object->objectSubId == 0);
+ return OCLASS_CONVERSION;
+
+ case AttrDefaultRelationId:
+ Assert(object->objectSubId == 0);
+ return OCLASS_DEFAULT;
+
+ case LanguageRelationId:
+ Assert(object->objectSubId == 0);
+ return OCLASS_LANGUAGE;
+
+ case OperatorRelationId:
+ Assert(object->objectSubId == 0);
+ return OCLASS_OPERATOR;
+
+ case OperatorClassRelationId:
+ Assert(object->objectSubId == 0);
+ return OCLASS_OPCLASS;
+
+ case RewriteRelationId:
+ Assert(object->objectSubId == 0);
+ return OCLASS_REWRITE;
+
+ case TriggerRelationId:
+ Assert(object->objectSubId == 0);
+ return OCLASS_TRIGGER;
+
+ case NamespaceRelationId:
+ Assert(object->objectSubId == 0);
+ return OCLASS_SCHEMA;
}
+ /* shouldn't get here */
elog(ERROR, "unrecognized object class: %u", object->classId);
return OCLASS_CLASS; /* keep compiler quiet */
}
@@ -1449,14 +1412,14 @@ getObjectDescription(const ObjectAddress *object)
HeapTuple tup;
Form_pg_cast castForm;
- castDesc = heap_openr(CastRelationName, AccessShareLock);
+ castDesc = heap_open(CastRelationId, AccessShareLock);
ScanKeyInit(&skey[0],
ObjectIdAttributeNumber,
BTEqualStrategyNumber, F_OIDEQ,
ObjectIdGetDatum(object->objectId));
- rcscan = systable_beginscan(castDesc, CastOidIndex, true,
+ rcscan = systable_beginscan(castDesc, CastOidIndexId, true,
SnapshotNow, 1, skey);
tup = systable_getnext(rcscan);
@@ -1484,14 +1447,14 @@ getObjectDescription(const ObjectAddress *object)
HeapTuple tup;
Form_pg_constraint con;
- conDesc = heap_openr(ConstraintRelationName, AccessShareLock);
+ conDesc = heap_open(ConstraintRelationId, AccessShareLock);
ScanKeyInit(&skey[0],
ObjectIdAttributeNumber,
BTEqualStrategyNumber, F_OIDEQ,
ObjectIdGetDatum(object->objectId));
- rcscan = systable_beginscan(conDesc, ConstraintOidIndex, true,
+ rcscan = systable_beginscan(conDesc, ConstraintOidIndexId, true,
SnapshotNow, 1, skey);
tup = systable_getnext(rcscan);
@@ -1544,14 +1507,14 @@ getObjectDescription(const ObjectAddress *object)
Form_pg_attrdef attrdef;
ObjectAddress colobject;
- attrdefDesc = heap_openr(AttrDefaultRelationName, AccessShareLock);
+ attrdefDesc = heap_open(AttrDefaultRelationId, AccessShareLock);
ScanKeyInit(&skey[0],
ObjectIdAttributeNumber,
BTEqualStrategyNumber, F_OIDEQ,
ObjectIdGetDatum(object->objectId));
- adscan = systable_beginscan(attrdefDesc, AttrDefaultOidIndex,
+ adscan = systable_beginscan(attrdefDesc, AttrDefaultOidIndexId,
true, SnapshotNow, 1, skey);
tup = systable_getnext(adscan);
@@ -1643,14 +1606,14 @@ getObjectDescription(const ObjectAddress *object)
HeapTuple tup;
Form_pg_rewrite rule;
- ruleDesc = heap_openr(RewriteRelationName, AccessShareLock);
+ ruleDesc = heap_open(RewriteRelationId, AccessShareLock);
ScanKeyInit(&skey[0],
ObjectIdAttributeNumber,
BTEqualStrategyNumber, F_OIDEQ,
ObjectIdGetDatum(object->objectId));
- rcscan = systable_beginscan(ruleDesc, RewriteOidIndex, true,
+ rcscan = systable_beginscan(ruleDesc, RewriteOidIndexId, true,
SnapshotNow, 1, skey);
tup = systable_getnext(rcscan);
@@ -1678,14 +1641,14 @@ getObjectDescription(const ObjectAddress *object)
HeapTuple tup;
Form_pg_trigger trig;
- trigDesc = heap_openr(TriggerRelationName, AccessShareLock);
+ trigDesc = heap_open(TriggerRelationId, AccessShareLock);
ScanKeyInit(&skey[0],
ObjectIdAttributeNumber,
BTEqualStrategyNumber, F_OIDEQ,
ObjectIdGetDatum(object->objectId));
- tgscan = systable_beginscan(trigDesc, TriggerOidIndex, true,
+ tgscan = systable_beginscan(trigDesc, TriggerOidIndexId, true,
SnapshotNow, 1, skey);
tup = systable_getnext(tgscan);