List *rtables; /* list of rangetables to resolve Vars */
} find_expr_references_context;
-/*
- * This constant table maps ObjectClasses to the corresponding catalog OIDs.
- * See also getObjectClass().
- */
-static const Oid object_classes[] = {
- RelationRelationId, /* OCLASS_CLASS */
- ProcedureRelationId, /* OCLASS_PROC */
- TypeRelationId, /* OCLASS_TYPE */
- CastRelationId, /* OCLASS_CAST */
- CollationRelationId, /* OCLASS_COLLATION */
- ConstraintRelationId, /* OCLASS_CONSTRAINT */
- ConversionRelationId, /* OCLASS_CONVERSION */
- AttrDefaultRelationId, /* OCLASS_DEFAULT */
- LanguageRelationId, /* OCLASS_LANGUAGE */
- LargeObjectRelationId, /* OCLASS_LARGEOBJECT */
- OperatorRelationId, /* OCLASS_OPERATOR */
- OperatorClassRelationId, /* OCLASS_OPCLASS */
- OperatorFamilyRelationId, /* OCLASS_OPFAMILY */
- AccessMethodRelationId, /* OCLASS_AM */
- AccessMethodOperatorRelationId, /* OCLASS_AMOP */
- AccessMethodProcedureRelationId, /* OCLASS_AMPROC */
- RewriteRelationId, /* OCLASS_REWRITE */
- TriggerRelationId, /* OCLASS_TRIGGER */
- NamespaceRelationId, /* OCLASS_SCHEMA */
- StatisticExtRelationId, /* OCLASS_STATISTIC_EXT */
- TSParserRelationId, /* OCLASS_TSPARSER */
- TSDictionaryRelationId, /* OCLASS_TSDICT */
- TSTemplateRelationId, /* OCLASS_TSTEMPLATE */
- TSConfigRelationId, /* OCLASS_TSCONFIG */
- AuthIdRelationId, /* OCLASS_ROLE */
- AuthMemRelationId, /* OCLASS_ROLE_MEMBERSHIP */
- DatabaseRelationId, /* OCLASS_DATABASE */
- TableSpaceRelationId, /* OCLASS_TBLSPACE */
- ForeignDataWrapperRelationId, /* OCLASS_FDW */
- ForeignServerRelationId, /* OCLASS_FOREIGN_SERVER */
- UserMappingRelationId, /* OCLASS_USER_MAPPING */
- DefaultAclRelationId, /* OCLASS_DEFACL */
- ExtensionRelationId, /* OCLASS_EXTENSION */
- EventTriggerRelationId, /* OCLASS_EVENT_TRIGGER */
- ParameterAclRelationId, /* OCLASS_PARAMETER_ACL */
- PolicyRelationId, /* OCLASS_POLICY */
- PublicationNamespaceRelationId, /* OCLASS_PUBLICATION_NAMESPACE */
- PublicationRelationId, /* OCLASS_PUBLICATION */
- PublicationRelRelationId, /* OCLASS_PUBLICATION_REL */
- SubscriptionRelationId, /* OCLASS_SUBSCRIPTION */
- TransformRelationId /* OCLASS_TRANSFORM */
-};
-
-/*
- * Make sure object_classes is kept up to date with the ObjectClass enum.
- */
-StaticAssertDecl(lengthof(object_classes) == LAST_OCLASS + 1,
- "object_classes[] must cover all ObjectClasses");
-
static void findDependentObjects(const ObjectAddress *object,
int objflags,
find_expr_references_context *context);
static void eliminate_duplicate_dependencies(ObjectAddresses *addrs);
static int object_address_comparator(const void *a, const void *b);
-static void add_object_address(ObjectClass oclass, Oid objectId, int32 subId,
+static void add_object_address(Oid classId, Oid objectId, int32 subId,
ObjectAddresses *addrs);
static void add_exact_object_address_extra(const ObjectAddress *object,
const ObjectAddressExtra *extra,
if (rte->rtekind == RTE_RELATION)
{
/* If it's a plain relation, reference this column */
- add_object_address(OCLASS_CLASS, rte->relid, var->varattno,
+ add_object_address(RelationRelationId, rte->relid, var->varattno,
context->addrs);
}
else if (rte->rtekind == RTE_FUNCTION)
Oid objoid;
/* A constant must depend on the constant's datatype */
- add_object_address(OCLASS_TYPE, con->consttype, 0,
+ add_object_address(TypeRelationId, con->consttype, 0,
context->addrs);
/*
*/
if (OidIsValid(con->constcollid) &&
con->constcollid != DEFAULT_COLLATION_OID)
- add_object_address(OCLASS_COLLATION, con->constcollid, 0,
+ add_object_address(CollationRelationId, con->constcollid, 0,
context->addrs);
/*
objoid = DatumGetObjectId(con->constvalue);
if (SearchSysCacheExists1(PROCOID,
ObjectIdGetDatum(objoid)))
- add_object_address(OCLASS_PROC, objoid, 0,
+ add_object_address(ProcedureRelationId, objoid, 0,
context->addrs);
break;
case REGOPEROID:
objoid = DatumGetObjectId(con->constvalue);
if (SearchSysCacheExists1(OPEROID,
ObjectIdGetDatum(objoid)))
- add_object_address(OCLASS_OPERATOR, objoid, 0,
+ add_object_address(OperatorRelationId, objoid, 0,
context->addrs);
break;
case REGCLASSOID:
objoid = DatumGetObjectId(con->constvalue);
if (SearchSysCacheExists1(RELOID,
ObjectIdGetDatum(objoid)))
- add_object_address(OCLASS_CLASS, objoid, 0,
+ add_object_address(RelationRelationId, objoid, 0,
context->addrs);
break;
case REGTYPEOID:
objoid = DatumGetObjectId(con->constvalue);
if (SearchSysCacheExists1(TYPEOID,
ObjectIdGetDatum(objoid)))
- add_object_address(OCLASS_TYPE, objoid, 0,
+ add_object_address(TypeRelationId, objoid, 0,
context->addrs);
break;
case REGCOLLATIONOID:
objoid = DatumGetObjectId(con->constvalue);
if (SearchSysCacheExists1(COLLOID,
ObjectIdGetDatum(objoid)))
- add_object_address(OCLASS_COLLATION, objoid, 0,
+ add_object_address(CollationRelationId, objoid, 0,
context->addrs);
break;
case REGCONFIGOID:
objoid = DatumGetObjectId(con->constvalue);
if (SearchSysCacheExists1(TSCONFIGOID,
ObjectIdGetDatum(objoid)))
- add_object_address(OCLASS_TSCONFIG, objoid, 0,
+ add_object_address(TSConfigRelationId, objoid, 0,
context->addrs);
break;
case REGDICTIONARYOID:
objoid = DatumGetObjectId(con->constvalue);
if (SearchSysCacheExists1(TSDICTOID,
ObjectIdGetDatum(objoid)))
- add_object_address(OCLASS_TSDICT, objoid, 0,
+ add_object_address(TSDictionaryRelationId, objoid, 0,
context->addrs);
break;
objoid = DatumGetObjectId(con->constvalue);
if (SearchSysCacheExists1(NAMESPACEOID,
ObjectIdGetDatum(objoid)))
- add_object_address(OCLASS_SCHEMA, objoid, 0,
+ add_object_address(NamespaceRelationId, objoid, 0,
context->addrs);
break;
Param *param = (Param *) node;
/* A parameter must depend on the parameter's datatype */
- add_object_address(OCLASS_TYPE, param->paramtype, 0,
+ add_object_address(TypeRelationId, param->paramtype, 0,
context->addrs);
/* and its collation, just as for Consts */
if (OidIsValid(param->paramcollid) &&
param->paramcollid != DEFAULT_COLLATION_OID)
- add_object_address(OCLASS_COLLATION, param->paramcollid, 0,
+ add_object_address(CollationRelationId, param->paramcollid, 0,
context->addrs);
}
else if (IsA(node, FuncExpr))
{
FuncExpr *funcexpr = (FuncExpr *) node;
- add_object_address(OCLASS_PROC, funcexpr->funcid, 0,
+ add_object_address(ProcedureRelationId, funcexpr->funcid, 0,
context->addrs);
/* fall through to examine arguments */
}
{
OpExpr *opexpr = (OpExpr *) node;
- add_object_address(OCLASS_OPERATOR, opexpr->opno, 0,
+ add_object_address(OperatorRelationId, opexpr->opno, 0,
context->addrs);
/* fall through to examine arguments */
}
{
DistinctExpr *distinctexpr = (DistinctExpr *) node;
- add_object_address(OCLASS_OPERATOR, distinctexpr->opno, 0,
+ add_object_address(OperatorRelationId, distinctexpr->opno, 0,
context->addrs);
/* fall through to examine arguments */
}
{
NullIfExpr *nullifexpr = (NullIfExpr *) node;
- add_object_address(OCLASS_OPERATOR, nullifexpr->opno, 0,
+ add_object_address(OperatorRelationId, nullifexpr->opno, 0,
context->addrs);
/* fall through to examine arguments */
}
{
ScalarArrayOpExpr *opexpr = (ScalarArrayOpExpr *) node;
- add_object_address(OCLASS_OPERATOR, opexpr->opno, 0,
+ add_object_address(OperatorRelationId, opexpr->opno, 0,
context->addrs);
/* fall through to examine arguments */
}
{
Aggref *aggref = (Aggref *) node;
- add_object_address(OCLASS_PROC, aggref->aggfnoid, 0,
+ add_object_address(ProcedureRelationId, aggref->aggfnoid, 0,
context->addrs);
/* fall through to examine arguments */
}
{
WindowFunc *wfunc = (WindowFunc *) node;
- add_object_address(OCLASS_PROC, wfunc->winfnoid, 0,
+ add_object_address(ProcedureRelationId, wfunc->winfnoid, 0,
context->addrs);
/* fall through to examine arguments */
}
*/
if (sbsref->refrestype != sbsref->refcontainertype &&
sbsref->refrestype != sbsref->refelemtype)
- add_object_address(OCLASS_TYPE, sbsref->refrestype, 0,
+ add_object_address(TypeRelationId, sbsref->refrestype, 0,
context->addrs);
/* fall through to examine arguments */
}
* anywhere else in the expression.
*/
if (OidIsValid(reltype))
- add_object_address(OCLASS_CLASS, reltype, fselect->fieldnum,
+ add_object_address(RelationRelationId, reltype, fselect->fieldnum,
context->addrs);
else
- add_object_address(OCLASS_TYPE, fselect->resulttype, 0,
+ add_object_address(TypeRelationId, fselect->resulttype, 0,
context->addrs);
/* the collation might not be referenced anywhere else, either */
if (OidIsValid(fselect->resultcollid) &&
fselect->resultcollid != DEFAULT_COLLATION_OID)
- add_object_address(OCLASS_COLLATION, fselect->resultcollid, 0,
+ add_object_address(CollationRelationId, fselect->resultcollid, 0,
context->addrs);
}
else if (IsA(node, FieldStore))
ListCell *l;
foreach(l, fstore->fieldnums)
- add_object_address(OCLASS_CLASS, reltype, lfirst_int(l),
+ add_object_address(RelationRelationId, reltype, lfirst_int(l),
context->addrs);
}
else
- add_object_address(OCLASS_TYPE, fstore->resulttype, 0,
+ add_object_address(TypeRelationId, fstore->resulttype, 0,
context->addrs);
}
else if (IsA(node, RelabelType))
RelabelType *relab = (RelabelType *) node;
/* since there is no function dependency, need to depend on type */
- add_object_address(OCLASS_TYPE, relab->resulttype, 0,
+ add_object_address(TypeRelationId, relab->resulttype, 0,
context->addrs);
/* the collation might not be referenced anywhere else, either */
if (OidIsValid(relab->resultcollid) &&
relab->resultcollid != DEFAULT_COLLATION_OID)
- add_object_address(OCLASS_COLLATION, relab->resultcollid, 0,
+ add_object_address(CollationRelationId, relab->resultcollid, 0,
context->addrs);
}
else if (IsA(node, CoerceViaIO))
CoerceViaIO *iocoerce = (CoerceViaIO *) node;
/* since there is no exposed function, need to depend on type */
- add_object_address(OCLASS_TYPE, iocoerce->resulttype, 0,
+ add_object_address(TypeRelationId, iocoerce->resulttype, 0,
context->addrs);
/* the collation might not be referenced anywhere else, either */
if (OidIsValid(iocoerce->resultcollid) &&
iocoerce->resultcollid != DEFAULT_COLLATION_OID)
- add_object_address(OCLASS_COLLATION, iocoerce->resultcollid, 0,
+ add_object_address(CollationRelationId, iocoerce->resultcollid, 0,
context->addrs);
}
else if (IsA(node, ArrayCoerceExpr))
ArrayCoerceExpr *acoerce = (ArrayCoerceExpr *) node;
/* as above, depend on type */
- add_object_address(OCLASS_TYPE, acoerce->resulttype, 0,
+ add_object_address(TypeRelationId, acoerce->resulttype, 0,
context->addrs);
/* the collation might not be referenced anywhere else, either */
if (OidIsValid(acoerce->resultcollid) &&
acoerce->resultcollid != DEFAULT_COLLATION_OID)
- add_object_address(OCLASS_COLLATION, acoerce->resultcollid, 0,
+ add_object_address(CollationRelationId, acoerce->resultcollid, 0,
context->addrs);
/* fall through to examine arguments */
}
ConvertRowtypeExpr *cvt = (ConvertRowtypeExpr *) node;
/* since there is no function dependency, need to depend on type */
- add_object_address(OCLASS_TYPE, cvt->resulttype, 0,
+ add_object_address(TypeRelationId, cvt->resulttype, 0,
context->addrs);
}
else if (IsA(node, CollateExpr))
{
CollateExpr *coll = (CollateExpr *) node;
- add_object_address(OCLASS_COLLATION, coll->collOid, 0,
+ add_object_address(CollationRelationId, coll->collOid, 0,
context->addrs);
}
else if (IsA(node, RowExpr))
{
RowExpr *rowexpr = (RowExpr *) node;
- add_object_address(OCLASS_TYPE, rowexpr->row_typeid, 0,
+ add_object_address(TypeRelationId, rowexpr->row_typeid, 0,
context->addrs);
}
else if (IsA(node, RowCompareExpr))
foreach(l, rcexpr->opnos)
{
- add_object_address(OCLASS_OPERATOR, lfirst_oid(l), 0,
+ add_object_address(OperatorRelationId, lfirst_oid(l), 0,
context->addrs);
}
foreach(l, rcexpr->opfamilies)
{
- add_object_address(OCLASS_OPFAMILY, lfirst_oid(l), 0,
+ add_object_address(OperatorFamilyRelationId, lfirst_oid(l), 0,
context->addrs);
}
/* fall through to examine arguments */
{
CoerceToDomain *cd = (CoerceToDomain *) node;
- add_object_address(OCLASS_TYPE, cd->resulttype, 0,
+ add_object_address(TypeRelationId, cd->resulttype, 0,
context->addrs);
}
else if (IsA(node, NextValueExpr))
{
NextValueExpr *nve = (NextValueExpr *) node;
- add_object_address(OCLASS_CLASS, nve->seqid, 0,
+ add_object_address(RelationRelationId, nve->seqid, 0,
context->addrs);
}
else if (IsA(node, OnConflictExpr))
OnConflictExpr *onconflict = (OnConflictExpr *) node;
if (OidIsValid(onconflict->constraint))
- add_object_address(OCLASS_CONSTRAINT, onconflict->constraint, 0,
+ add_object_address(ConstraintRelationId, onconflict->constraint, 0,
context->addrs);
/* fall through to examine arguments */
}
{
SortGroupClause *sgc = (SortGroupClause *) node;
- add_object_address(OCLASS_OPERATOR, sgc->eqop, 0,
+ add_object_address(OperatorRelationId, sgc->eqop, 0,
context->addrs);
if (OidIsValid(sgc->sortop))
- add_object_address(OCLASS_OPERATOR, sgc->sortop, 0,
+ add_object_address(OperatorRelationId, sgc->sortop, 0,
context->addrs);
return false;
}
WindowClause *wc = (WindowClause *) node;
if (OidIsValid(wc->startInRangeFunc))
- add_object_address(OCLASS_PROC, wc->startInRangeFunc, 0,
+ add_object_address(ProcedureRelationId, wc->startInRangeFunc, 0,
context->addrs);
if (OidIsValid(wc->endInRangeFunc))
- add_object_address(OCLASS_PROC, wc->endInRangeFunc, 0,
+ add_object_address(ProcedureRelationId, wc->endInRangeFunc, 0,
context->addrs);
if (OidIsValid(wc->inRangeColl) &&
wc->inRangeColl != DEFAULT_COLLATION_OID)
- add_object_address(OCLASS_COLLATION, wc->inRangeColl, 0,
+ add_object_address(CollationRelationId, wc->inRangeColl, 0,
context->addrs);
/* fall through to examine substructure */
}
CTECycleClause *cc = (CTECycleClause *) node;
if (OidIsValid(cc->cycle_mark_type))
- add_object_address(OCLASS_TYPE, cc->cycle_mark_type, 0,
+ add_object_address(TypeRelationId, cc->cycle_mark_type, 0,
context->addrs);
if (OidIsValid(cc->cycle_mark_collation))
- add_object_address(OCLASS_COLLATION, cc->cycle_mark_collation, 0,
+ add_object_address(CollationRelationId, cc->cycle_mark_collation, 0,
context->addrs);
if (OidIsValid(cc->cycle_mark_neop))
- add_object_address(OCLASS_OPERATOR, cc->cycle_mark_neop, 0,
+ add_object_address(OperatorRelationId, cc->cycle_mark_neop, 0,
context->addrs);
/* fall through to examine substructure */
}
switch (rte->rtekind)
{
case RTE_RELATION:
- add_object_address(OCLASS_CLASS, rte->relid, 0,
+ add_object_address(RelationRelationId, rte->relid, 0,
context->addrs);
break;
case RTE_JOIN:
if (tle->resjunk)
continue; /* ignore junk tlist items */
- add_object_address(OCLASS_CLASS, rte->relid, tle->resno,
+ add_object_address(RelationRelationId, rte->relid, tle->resno,
context->addrs);
}
}
*/
foreach(lc, query->constraintDeps)
{
- add_object_address(OCLASS_CONSTRAINT, lfirst_oid(lc), 0,
+ add_object_address(ConstraintRelationId, lfirst_oid(lc), 0,
context->addrs);
}
*/
foreach(ct, rtfunc->funccoltypes)
{
- add_object_address(OCLASS_TYPE, lfirst_oid(ct), 0,
+ add_object_address(TypeRelationId, lfirst_oid(ct), 0,
context->addrs);
}
foreach(ct, rtfunc->funccolcollations)
Oid collid = lfirst_oid(ct);
if (OidIsValid(collid) && collid != DEFAULT_COLLATION_OID)
- add_object_address(OCLASS_COLLATION, collid, 0,
+ add_object_address(CollationRelationId, collid, 0,
context->addrs);
}
}
*/
foreach(ct, tf->coltypes)
{
- add_object_address(OCLASS_TYPE, lfirst_oid(ct), 0,
+ add_object_address(TypeRelationId, lfirst_oid(ct), 0,
context->addrs);
}
foreach(ct, tf->colcollations)
Oid collid = lfirst_oid(ct);
if (OidIsValid(collid) && collid != DEFAULT_COLLATION_OID)
- add_object_address(OCLASS_COLLATION, collid, 0,
+ add_object_address(CollationRelationId, collid, 0,
context->addrs);
}
}
{
TableSampleClause *tsc = (TableSampleClause *) node;
- add_object_address(OCLASS_PROC, tsc->tsmhandler, 0,
+ add_object_address(ProcedureRelationId, tsc->tsmhandler, 0,
context->addrs);
/* fall through to examine arguments */
}
Assert(attnum - atts_done <= tupdesc->natts);
if (OidIsValid(reltype)) /* can this fail? */
- add_object_address(OCLASS_CLASS, reltype,
+ add_object_address(RelationRelationId, reltype,
attnum - atts_done,
context->addrs);
return;
/*
* Add an entry to an ObjectAddresses array.
- *
- * It is convenient to specify the class by ObjectClass rather than directly
- * by catalog OID.
*/
static void
-add_object_address(ObjectClass oclass, Oid objectId, int32 subId,
+add_object_address(Oid classId, Oid objectId, int32 subId,
ObjectAddresses *addrs)
{
ObjectAddress *item;
}
/* record this item */
item = addrs->refs + addrs->numrefs;
- item->classId = object_classes[oclass];
+ item->classId = classId;
item->objectId = objectId;
item->objectSubId = subId;
addrs->numrefs++;
/*
* Determine the class of a given object identified by objectAddress.
*
- * This function is essentially the reverse mapping for the object_classes[]
- * table. We implement it as a function because the OIDs aren't consecutive.
+ * We implement it as a function instead of an array because the OIDs aren't
+ * consecutive.
*/
ObjectClass
getObjectClass(const ObjectAddress *object)