diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2000-12-05 19:57:56 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2000-12-05 19:57:56 +0000 |
commit | 981a7d32d1326325caefa3e22df090e48f54cc6c (patch) | |
tree | fe6d1347a00c32f2da5f6fe98df76ff90c7d09f3 /src/backend/commands/command.c | |
parent | 5ce8ab96f5ba00c061340c26e998f7a272455f6f (diff) | |
download | postgresql-981a7d32d1326325caefa3e22df090e48f54cc6c.tar.gz postgresql-981a7d32d1326325caefa3e22df090e48f54cc6c.zip |
From Stephan Szabo:
I believe this should fix the issue that Philip Warner
noticed about the check for unique constraints meeting the
referenced keys of a foreign key constraint allowing the
specification of a subset of a foreign key instead of
rejecting it. I also added tests for a base case of
this to the foreign key and alter table tests and patches
for expected output.
Diffstat (limited to 'src/backend/commands/command.c')
-rw-r--r-- | src/backend/commands/command.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/src/backend/commands/command.c b/src/backend/commands/command.c index 42f05f0761c..78a3d5e1a75 100644 --- a/src/backend/commands/command.c +++ b/src/backend/commands/command.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.112 2000/11/16 22:30:19 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.113 2000/12/05 19:57:55 tgl Exp $ * * NOTES * The PerformAddAttribute() code, like most of the relation @@ -1287,26 +1287,33 @@ AlterTableAddConstraint(char *relationName, { List *attrl; - /* go through the fkconstraint->pk_attrs list */ - foreach(attrl, fkconstraint->pk_attrs) - { - Ident *attr=lfirst(attrl); - found = false; - for (i = 0; i < INDEX_MAX_KEYS && indexStruct->indkey[i] != 0; i++) + /* Make sure this index has the same number of keys -- It obviously + * won't match otherwise. */ + for (i = 0; i < INDEX_MAX_KEYS && indexStruct->indkey[i] != 0; i++); + if (i!=length(fkconstraint->pk_attrs)) + found=false; + else { + /* go through the fkconstraint->pk_attrs list */ + foreach(attrl, fkconstraint->pk_attrs) { - int pkattno = indexStruct->indkey[i]; - if (pkattno>0) + Ident *attr=lfirst(attrl); + found = false; + for (i = 0; i < INDEX_MAX_KEYS && indexStruct->indkey[i] != 0; i++) { - char *name = NameStr(rel_attrs[pkattno-1]->attname); - if (strcmp(name, attr->name)==0) + int pkattno = indexStruct->indkey[i]; + if (pkattno>0) { - found = true; - break; + char *name = NameStr(rel_attrs[pkattno-1]->attname); + if (strcmp(name, attr->name)==0) + { + found = true; + break; + } } } + if (!found) + break; } - if (!found) - break; } } ReleaseSysCache(indexTuple); |