diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c index f3ded4def9..80bc7740fe 100644 --- a/src/backend/utils/cache/inval.c +++ b/src/backend/utils/cache/inval.c @@ -54,6 +54,7 @@ * Also, whenever we see an operation on a pg_class, pg_attribute, or * pg_index tuple, we register a relcache flush operation for the relation * described by that tuple (as specified in CacheInvalidateHeapTuple()). + * Likewise for pg_constraint tuples for foreign keys on relations. * * We keep the relcache flush requests in lists separate from the catcache * tuple flush requests. This allows us to issue all the pending catcache @@ -100,6 +101,7 @@ #include "access/htup_details.h" #include "access/xact.h" #include "catalog/catalog.h" +#include "catalog/pg_constraint.h" #include "miscadmin.h" #include "storage/sinval.h" #include "storage/smgr.h" @@ -1203,6 +1205,23 @@ CacheInvalidateHeapTuple(Relation relation, relationId = indextup->indexrelid; databaseId = MyDatabaseId; } + else if (tupleRelId == ConstraintRelationId) + { + Form_pg_constraint constrtup = (Form_pg_constraint) GETSTRUCT(tuple); + + /* + * Foreign keys are part of relcache entries, too, so send out an + * inval for the table that the FK applies to. + */ + if (constrtup->contype == CONSTRAINT_FOREIGN && + OidIsValid(constrtup->conrelid)) + { + relationId = constrtup->conrelid; + databaseId = MyDatabaseId; + } + else + return; + } else return;