diff options
Diffstat (limited to 'src/backend/catalog/pg_constraint.c')
-rw-r--r-- | src/backend/catalog/pg_constraint.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c index d92bbf84cc0..02cf5f1400b 100644 --- a/src/backend/catalog/pg_constraint.c +++ b/src/backend/catalog/pg_constraint.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/pg_constraint.c,v 1.49 2009/10/13 00:53:07 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/pg_constraint.c,v 1.50 2009/12/07 05:22:21 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -59,6 +59,7 @@ CreateConstraintEntry(const char *constraintName, char foreignUpdateType, char foreignDeleteType, char foreignMatchType, + const Oid *exclOp, Node *conExpr, const char *conBin, const char *conSrc, @@ -75,6 +76,7 @@ CreateConstraintEntry(const char *constraintName, ArrayType *conpfeqopArray; ArrayType *conppeqopArray; ArrayType *conffeqopArray; + ArrayType *conexclopArray; NameData cname; int i; ObjectAddress conobject; @@ -130,6 +132,19 @@ CreateConstraintEntry(const char *constraintName, conffeqopArray = NULL; } + if (exclOp != NULL) + { + Datum *opdatums; + + opdatums = (Datum *) palloc(constraintNKeys * sizeof(Datum)); + for (i = 0; i < constraintNKeys; i++) + opdatums[i] = ObjectIdGetDatum(exclOp[i]); + conexclopArray = construct_array(opdatums, constraintNKeys, + OIDOID, sizeof(Oid), true, 'i'); + } + else + conexclopArray = NULL; + /* initialize nulls and values */ for (i = 0; i < Natts_pg_constraint; i++) { @@ -177,6 +192,11 @@ CreateConstraintEntry(const char *constraintName, else nulls[Anum_pg_constraint_conffeqop - 1] = true; + if (conexclopArray) + values[Anum_pg_constraint_conexclop - 1] = PointerGetDatum(conexclopArray); + else + nulls[Anum_pg_constraint_conexclop - 1] = true; + /* * initialize the binary form of the check constraint. */ @@ -321,6 +341,14 @@ CreateConstraintEntry(const char *constraintName, } } + /* + * We don't bother to register dependencies on the exclusion operators + * of an exclusion constraint. We assume they are members of the opclass + * supporting the index, so there's an indirect dependency via that. + * (This would be pretty dicey for cross-type operators, but exclusion + * operators can never be cross-type.) + */ + if (conExpr != NULL) { /* |