diff --git a/src/backend/distributed/commands/table.c b/src/backend/distributed/commands/table.c index 227486d4d..d43d88f8d 100644 --- a/src/backend/distributed/commands/table.c +++ b/src/backend/distributed/commands/table.c @@ -251,6 +251,19 @@ PostprocessCreateTableStmtPartitionOf(CreateStmt *createStatement, const CreateDistributedTable(relationId, parentDistributionColumn, parentDistributionMethod, parentRelationName, viaDeprecatedAPI); + return; + } + + /* + * If parent is a postgres local table, then invalidate foreign key cache + * if the parent table is involved in any foreign key relationship. This is + * because, partition tables inherit foreign keys from parent tables. + * Note that if parent table is a citus table, then CreateDistributedTable + * already invalidates foreign key cache and we handle that case above. + */ + if ((TableReferenced(parentRelationId) || TableReferencing(parentRelationId))) + { + MarkInvalidateForeignKeyGraph(); } } @@ -326,6 +339,23 @@ PostprocessAlterTableStmtAttachPartition(AlterTableStmt *alterTableStatement, distributionMethod, parentRelationName, viaDeprecatedAPI); } + + if (!IsCitusTable(relationId) && + !IsCitusTable(partitionRelationId)) + { + /* + * If parent and child tables are postgres local tables, then invalidate + * foreign key cache if the parent table is involved in any foreign key + * relationship. This is because, partition tables inherit foreign keys + * from parent tables. + * Note that if parent table is a citus table, then CreateDistributedTable + * already invalidates foreign key cache and we handle that case above. + */ + if ((TableReferenced(relationId) || TableReferencing(relationId))) + { + MarkInvalidateForeignKeyGraph(); + } + } } }