Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian2001-05-09 21:13:35 +0000
committerBruce Momjian2001-05-09 21:13:35 +0000
commitbea7a8857655e5680a4b9aad7b66f07bd9c0264a (patch)
tree651e2c1d47d2d48faa603e6092c155020f031272
parent999a4d48d3727774d1c36b734130cdc0931a2bc9 (diff)
I have modifed heap.c so that it won't automatically generate duplicate
constraint names. > > A reasonable interpretation of DROP CONSTRAINT "foo" is to drop *all* > > constraints named "foo" on the target table. > > Then it should probably be a good thing to avoid the automatic > generation of > duplicate names? I might take a look at that, actually... > Christopher Kings-Lynne
-rw-r--r--src/backend/catalog/heap.c43
1 files changed, 41 insertions, 2 deletions
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 03f16e11c3f..ec14a736965 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.163 2001/05/07 00:43:17 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.164 2001/05/09 21:13:35 momjian Exp $
*
*
* INTERFACE ROUTINES
@@ -1832,8 +1832,47 @@ AddRelationRawConstraints(Relation rel,
}
else
{
+ int i;
+ int j;
+ bool success;
+ List *listptr2;
ccname = (char *) palloc(NAMEDATALEN);
- snprintf(ccname, NAMEDATALEN, "$%d", numchecks + 1);
+
+ /* Loop until we find a non-conflicting constraint name */
+ /* What happens if this loops forever? */
+ j = numchecks + 1;
+ do {
+ success = true;
+ snprintf(ccname, NAMEDATALEN, "$%d", j);
+
+ /* Check against old constraints */
+ for (i = 0; i < numoldchecks; i++)
+ {
+ if (strcmp(oldchecks[i].ccname, ccname) == 0) {
+ success = false;
+ break;
+ }
+ }
+ /* Check against other new constraints, if the check hasn't already failed */
+ if (success) {
+ foreach(listptr2, rawConstraints)
+ {
+ Constraint *cdef2 = (Constraint *) lfirst(listptr2);
+
+ if (cdef2 == cdef ||
+ cdef2->contype != CONSTR_CHECK ||
+ cdef2->raw_expr == NULL ||
+ cdef2->name == NULL)
+ continue;
+ if (strcmp(cdef2->name, ccname) == 0) {
+ success = false;
+ break;
+ }
+ }
+ }
+
+ ++j;
+ } while (!success);
}
/*