From: Bruce Momjian Date: Wed, 9 May 2001 21:13:35 +0000 (+0000) Subject: I have modifed heap.c so that it won't automatically generate duplicate X-Git-Tag: REL7_2_BETA1~1340 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bea7a8857655e5680a4b9aad7b66f07bd9c0264a;p=postgresql 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 --- diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 03f16e11c3..ec14a73696 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); } /*