diff options
author | Thomas G. Lockhart <lockhart@fourpalms.org> | 1999-08-15 06:46:49 +0000 |
---|---|---|
committer | Thomas G. Lockhart <lockhart@fourpalms.org> | 1999-08-15 06:46:49 +0000 |
commit | 3cfd56fcf68ee795b9386c2f23ef83ff532ba897 (patch) | |
tree | 261afe4cb7ebc325315eae37014bfccda0b42f33 /src | |
parent | 288373f5a48f6d4e7af723f068a97222d13aaaa8 (diff) | |
download | postgresql-3cfd56fcf68ee795b9386c2f23ef83ff532ba897.tar.gz postgresql-3cfd56fcf68ee795b9386c2f23ef83ff532ba897.zip |
Repair the check for redundant UNIQUE and PRIMARY KEY indices.
Also, improve it so that it checks for multi-column constraints.
Thanks to Mark Dalphin <mdalphin@amgen.com> for reporting the problem.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/parser/analyze.c | 46 |
1 files changed, 33 insertions, 13 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index d4a1ef57ef8..e3c9feb677c 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -5,7 +5,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: analyze.c,v 1.116 1999/07/19 00:26:18 tgl Exp $ + * $Id: analyze.c,v 1.117 1999/08/15 06:46:49 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -579,6 +579,9 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt) columns = NIL; dlist = NIL; + /* + * Run through each primary element in the table creation clause + */ while (elements != NIL) { element = lfirst(elements); @@ -588,6 +591,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt) column = (ColumnDef *) element; columns = lappend(columns, column); + /* Special case SERIAL type? */ if (column->is_sequence) { char *sname; @@ -625,6 +629,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt) blist = lcons(sequence, NIL); } + /* Check for column constraints, if any... */ if (column->constraints != NIL) { clist = column->constraints; @@ -815,28 +820,43 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt) * or if a SERIAL column was defined along with a table PRIMARY KEY constraint. * - thomas 1999-05-11 */ - if ((pkey != NULL) && (length(lfirst(pkey->indexParams)) == 1)) + if (pkey != NULL) { dlist = ilist; ilist = NIL; while (dlist != NIL) { - int keep = TRUE; + List *pcols, *icols; + int plen, ilen; + int keep = TRUE; index = lfirst(dlist); + pcols = pkey->indexParams; + icols = index->indexParams; - /* - * has a single column argument, so might be a conflicting - * index... - */ - if ((index != pkey) - && (length(index->indexParams) == 1)) + plen = length(pcols); + ilen = length(icols); + + /* Not the same as the primary key? Then we should look... */ + if ((index != pkey) && (ilen == plen)) { - char *pname = ((IndexElem *) lfirst(index->indexParams))->name; - char *iname = ((IndexElem *) lfirst(index->indexParams))->name; + keep = FALSE; + while ((pcols != NIL) && (icols != NIL)) + { + IndexElem *pcol = lfirst(pcols); + IndexElem *icol = lfirst(icols); + char *pname = pcol->name; + char *iname = icol->name; - /* same names? then don't keep... */ - keep = (strcmp(iname, pname) != 0); + /* different names? then no match... */ + if (strcmp(iname, pname) != 0) + { + keep = TRUE; + break; + } + pcols = lnext(pcols); + icols = lnext(icols); + } } if (keep) |