From 8f9ef63e8a993eb5a576aa7ca28463ee63f202b6 Mon Sep 17 00:00:00 2001 From: Onur Tirtir Date: Fri, 15 May 2020 17:36:59 +0300 Subject: [PATCH] Implement get_relation_constraint_oid_compat helper (#3836) --- .../distributed/commands/foreign_constraint.c | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/backend/distributed/commands/foreign_constraint.c b/src/backend/distributed/commands/foreign_constraint.c index 2f3338766..d0b49dcbe 100644 --- a/src/backend/distributed/commands/foreign_constraint.c +++ b/src/backend/distributed/commands/foreign_constraint.c @@ -42,6 +42,7 @@ static void ForeignConstraintFindDistKeys(HeapTuple pgConstraintTuple, Var *referencedDistColumn, int *referencingAttrIndex, int *referencedAttrIndex); +static Oid get_relation_constraint_oid_compat(HeapTuple heapTuple); /* * ConstraintIsAForeignKeyToReferenceTable checks if the given constraint is a @@ -514,9 +515,7 @@ GetTableForeignConstraintCommands(Oid relationId) if (!inheritedConstraint && constraintForm->contype == CONSTRAINT_FOREIGN) { - Oid constraintId = get_relation_constraint_oid(relationId, - constraintForm->conname.data, - true); + Oid constraintId = get_relation_constraint_oid_compat(heapTuple); char *statementDef = pg_get_constraintdef_command(constraintId); tableForeignConstraints = lappend(tableForeignConstraints, statementDef); @@ -536,6 +535,31 @@ GetTableForeignConstraintCommands(Oid relationId) } +/* + * get_relation_constraint_oid_compat returns OID of the constraint represented + * by the constraintForm, which is passed as an heapTuple. OID of the contraint + * is already stored in the constraintForm struct if major PostgreSQL version is + * 12. However, in the older versions, we should utilize HeapTupleGetOid to deduce + * that OID with no cost. + */ +static Oid +get_relation_constraint_oid_compat(HeapTuple heapTuple) +{ + Assert(heapTuple != NULL); + + Oid constraintOid = InvalidOid; + +#if PG_VERSION_NUM >= PG_VERSION_12 + Form_pg_constraint constraintForm = (Form_pg_constraint) GETSTRUCT(heapTuple); + constraintOid = constraintForm->oid; +#else + constraintOid = HeapTupleGetOid(heapTuple); +#endif + + return constraintOid; +} + + /* * HasForeignKeyToReferenceTable function scans the pgConstraint table to * fetch all of the constraints on the given relationId and see if at least one