mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
Refactor duplicate code into DeconstructFkConstraintRow
My commit 3de241dba8
introduced some code (in tablecmds.c) to obtain
data from a pg_constraint row for a foreign key, that already existed in
ri_triggers.c. Split it out into its own routine in pg_constraint.c,
where it naturally belongs.
No functional code changes, only code movement.
Backpatch to pg11, because a future bugfix is simpler after this.
This commit is contained in:
@ -2189,10 +2189,6 @@ ri_LoadConstraintInfo(Oid constraintOid)
|
||||
bool found;
|
||||
HeapTuple tup;
|
||||
Form_pg_constraint conForm;
|
||||
Datum adatum;
|
||||
bool isNull;
|
||||
ArrayType *arr;
|
||||
int numkeys;
|
||||
|
||||
/*
|
||||
* On the first call initialize the hashtable
|
||||
@ -2234,84 +2230,13 @@ ri_LoadConstraintInfo(Oid constraintOid)
|
||||
riinfo->confdeltype = conForm->confdeltype;
|
||||
riinfo->confmatchtype = conForm->confmatchtype;
|
||||
|
||||
/*
|
||||
* We expect the arrays to be 1-D arrays of the right types; verify that.
|
||||
* We don't need to use deconstruct_array() since the array data is just
|
||||
* going to look like a C array of values.
|
||||
*/
|
||||
adatum = SysCacheGetAttr(CONSTROID, tup,
|
||||
Anum_pg_constraint_conkey, &isNull);
|
||||
if (isNull)
|
||||
elog(ERROR, "null conkey for constraint %u", constraintOid);
|
||||
arr = DatumGetArrayTypeP(adatum); /* ensure not toasted */
|
||||
if (ARR_NDIM(arr) != 1 ||
|
||||
ARR_HASNULL(arr) ||
|
||||
ARR_ELEMTYPE(arr) != INT2OID)
|
||||
elog(ERROR, "conkey is not a 1-D smallint array");
|
||||
numkeys = ARR_DIMS(arr)[0];
|
||||
if (numkeys <= 0 || numkeys > RI_MAX_NUMKEYS)
|
||||
elog(ERROR, "foreign key constraint cannot have %d columns", numkeys);
|
||||
riinfo->nkeys = numkeys;
|
||||
memcpy(riinfo->fk_attnums, ARR_DATA_PTR(arr), numkeys * sizeof(int16));
|
||||
if ((Pointer) arr != DatumGetPointer(adatum))
|
||||
pfree(arr); /* free de-toasted copy, if any */
|
||||
|
||||
adatum = SysCacheGetAttr(CONSTROID, tup,
|
||||
Anum_pg_constraint_confkey, &isNull);
|
||||
if (isNull)
|
||||
elog(ERROR, "null confkey for constraint %u", constraintOid);
|
||||
arr = DatumGetArrayTypeP(adatum); /* ensure not toasted */
|
||||
if (ARR_NDIM(arr) != 1 ||
|
||||
ARR_DIMS(arr)[0] != numkeys ||
|
||||
ARR_HASNULL(arr) ||
|
||||
ARR_ELEMTYPE(arr) != INT2OID)
|
||||
elog(ERROR, "confkey is not a 1-D smallint array");
|
||||
memcpy(riinfo->pk_attnums, ARR_DATA_PTR(arr), numkeys * sizeof(int16));
|
||||
if ((Pointer) arr != DatumGetPointer(adatum))
|
||||
pfree(arr); /* free de-toasted copy, if any */
|
||||
|
||||
adatum = SysCacheGetAttr(CONSTROID, tup,
|
||||
Anum_pg_constraint_conpfeqop, &isNull);
|
||||
if (isNull)
|
||||
elog(ERROR, "null conpfeqop for constraint %u", constraintOid);
|
||||
arr = DatumGetArrayTypeP(adatum); /* ensure not toasted */
|
||||
/* see TryReuseForeignKey if you change the test below */
|
||||
if (ARR_NDIM(arr) != 1 ||
|
||||
ARR_DIMS(arr)[0] != numkeys ||
|
||||
ARR_HASNULL(arr) ||
|
||||
ARR_ELEMTYPE(arr) != OIDOID)
|
||||
elog(ERROR, "conpfeqop is not a 1-D Oid array");
|
||||
memcpy(riinfo->pf_eq_oprs, ARR_DATA_PTR(arr), numkeys * sizeof(Oid));
|
||||
if ((Pointer) arr != DatumGetPointer(adatum))
|
||||
pfree(arr); /* free de-toasted copy, if any */
|
||||
|
||||
adatum = SysCacheGetAttr(CONSTROID, tup,
|
||||
Anum_pg_constraint_conppeqop, &isNull);
|
||||
if (isNull)
|
||||
elog(ERROR, "null conppeqop for constraint %u", constraintOid);
|
||||
arr = DatumGetArrayTypeP(adatum); /* ensure not toasted */
|
||||
if (ARR_NDIM(arr) != 1 ||
|
||||
ARR_DIMS(arr)[0] != numkeys ||
|
||||
ARR_HASNULL(arr) ||
|
||||
ARR_ELEMTYPE(arr) != OIDOID)
|
||||
elog(ERROR, "conppeqop is not a 1-D Oid array");
|
||||
memcpy(riinfo->pp_eq_oprs, ARR_DATA_PTR(arr), numkeys * sizeof(Oid));
|
||||
if ((Pointer) arr != DatumGetPointer(adatum))
|
||||
pfree(arr); /* free de-toasted copy, if any */
|
||||
|
||||
adatum = SysCacheGetAttr(CONSTROID, tup,
|
||||
Anum_pg_constraint_conffeqop, &isNull);
|
||||
if (isNull)
|
||||
elog(ERROR, "null conffeqop for constraint %u", constraintOid);
|
||||
arr = DatumGetArrayTypeP(adatum); /* ensure not toasted */
|
||||
if (ARR_NDIM(arr) != 1 ||
|
||||
ARR_DIMS(arr)[0] != numkeys ||
|
||||
ARR_HASNULL(arr) ||
|
||||
ARR_ELEMTYPE(arr) != OIDOID)
|
||||
elog(ERROR, "conffeqop is not a 1-D Oid array");
|
||||
memcpy(riinfo->ff_eq_oprs, ARR_DATA_PTR(arr), numkeys * sizeof(Oid));
|
||||
if ((Pointer) arr != DatumGetPointer(adatum))
|
||||
pfree(arr); /* free de-toasted copy, if any */
|
||||
DeconstructFkConstraintRow(tup,
|
||||
&riinfo->nkeys,
|
||||
riinfo->fk_attnums,
|
||||
riinfo->pk_attnums,
|
||||
riinfo->pf_eq_oprs,
|
||||
riinfo->pp_eq_oprs,
|
||||
riinfo->ff_eq_oprs);
|
||||
|
||||
ReleaseSysCache(tup);
|
||||
|
||||
|
Reference in New Issue
Block a user