On 2019-Mar-21, Alvaro Herrera wrote:
> I figured this out. It's actually a bug in pg11, whereby we're setting
> a dependency wrongly. If you try to do pg_describe_object() the
> pg_depend entries for tables set up the way the regression test does it,
> it'll fail with a "cache lookup failed for constraint XYZ". In other
> words, pg_depend contains bogus data :-(
Oh, actually, it's not a problem in PG11 ... or at least, it's not THIS
problem in pg11. The bug was introduced by 1d92a0c9f7dd which ended the
DEPENDENCY_INTERNAL_AUTO saga, so the bug is only in master, and that
explains why I hadn't seen the problem before with my posted patch
series.
I think the attached is a better solution, which I'll go push shortly.
--
Álvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index c339a2bb779..cb2c0010171 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1247,7 +1247,7 @@ index_constraint_create(Relation heapRelation,
{
Oid namespaceId = RelationGetNamespace(heapRelation);
ObjectAddress myself,
- referenced;
+ idxaddr;
Oid conOid;
bool deferrable;
bool initdeferred;
@@ -1341,15 +1341,9 @@ index_constraint_create(Relation heapRelation,
* Note that the constraint has a dependency on the table, so we don't
* need (or want) any direct dependency from the index to the table.
*/
- myself.classId = RelationRelationId;
- myself.objectId = indexRelationId;
- myself.objectSubId = 0;
-
- referenced.classId = ConstraintRelationId;
- referenced.objectId = conOid;
- referenced.objectSubId = 0;
-
- recordDependencyOn(&myself, &referenced, DEPENDENCY_INTERNAL);
+ ObjectAddressSet(myself, ConstraintRelationId, conOid);
+ ObjectAddressSet(idxaddr, RelationRelationId, indexRelationId);
+ recordDependencyOn(&idxaddr, &myself, DEPENDENCY_INTERNAL);
/*
* Also, if this is a constraint on a partition, give it partition-type
@@ -1357,7 +1351,8 @@ index_constraint_create(Relation heapRelation,
*/
if (OidIsValid(parentConstraintId))
{
- ObjectAddressSet(myself, ConstraintRelationId, conOid);
+ ObjectAddress referenced;
+
ObjectAddressSet(referenced, ConstraintRelationId, parentConstraintId);
recordDependencyOn(&myself, &referenced, DEPENDENCY_PARTITION_PRI);
ObjectAddressSet(referenced, RelationRelationId,
@@ -1444,7 +1439,7 @@ index_constraint_create(Relation heapRelation,
table_close(pg_index, RowExclusiveLock);
}
- return referenced;
+ return myself;
}
/*