Prohibit a column from appearing twice in a PRIMARY KEY or UNIQUE
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 4 Jul 2001 17:36:54 +0000 (17:36 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 4 Jul 2001 17:36:54 +0000 (17:36 +0000)
constraint.  This case (a) is useless, (b) violates SQL92, and
(c) is certain to cause a failure downstream when we try to create
an index with duplicated column names.  So give an appropriate error
message instead of letting the index failure occur.  Per report from
Colin Strickland.  NOTE: currently, CREATE INDEX fooi ON foo(f1,f1)
still fails with 'cannot insert duplicate key' error.  Should we
change that too?  What about functional indexes?

src/backend/parser/analyze.c

index fc03173ce3df53a6148aa5214650ccefe3fd444b..9d6dfeb69a7266ea5d30076c3b4f10b664bf45b5 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *     $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.191 2001/06/25 21:11:44 tgl Exp $
+ *     $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.192 2001/07/04 17:36:54 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -954,8 +954,8 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
 
                index = makeNode(IndexStmt);
 
-               index->unique = TRUE;
-               index->primary = (constraint->contype == CONSTR_PRIMARY ? TRUE : FALSE);
+               index->unique = true;
+               index->primary = (constraint->contype == CONSTR_PRIMARY);
                if (index->primary)
                {
                        if (pkey != NULL)
@@ -1057,6 +1057,17 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
                                elog(ERROR, "CREATE TABLE: column \"%s\" named in key does not exist",
                                         key->name);
 
+                       /* Check for PRIMARY KEY(foo, foo) */
+                       foreach(columns, index->indexParams)
+                       {
+                               iparam = (IndexElem *) lfirst(columns);
+                               if (strcmp(key->name, iparam->name) == 0)
+                                       elog(ERROR, "CREATE TABLE: column \"%s\" appears twice in %s constraint",
+                                                key->name,
+                                                index->primary ? "PRIMARY KEY" : "UNIQUE");
+                       }
+
+                       /* OK, add it to the index definition */
                        iparam = makeNode(IndexElem);
                        iparam->name = pstrdup(key->name);
                        iparam->args = NIL;