aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-01-02 19:29:22 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-01-02 19:29:22 +0000
commit0a02d47a113ae67b35c5fa060bac6114609f6c5b (patch)
tree4e7a7592e9a9226d53ed663e6558c3cad872ba1b /src/backend/commands
parent2f86f146d9039c2ca0e16f333ec8a0d62491d984 (diff)
downloadpostgresql-0a02d47a113ae67b35c5fa060bac6114609f6c5b.tar.gz
postgresql-0a02d47a113ae67b35c5fa060bac6114609f6c5b.zip
Enforces NOT NULL constraints to be applied against new PRIMARY KEY
columns in DefineIndex. So, ALTER TABLE ... PRIMARY KEY will now automatically add the NOT NULL constraint. It appeared the alter_table regression test wanted this to occur, as after the change the regression test better matched in inline 'fails'/'succeeds' comments. Rod Taylor
Diffstat (limited to 'src/backend/commands')
-rw-r--r--src/backend/commands/indexcmds.c50
1 files changed, 48 insertions, 2 deletions
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index d46b7a389a3..df7e358b897 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/indexcmds.c,v 1.95 2002/12/15 16:17:39 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/indexcmds.c,v 1.96 2003/01/02 19:29:22 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -19,11 +19,13 @@
#include "catalog/catalog.h"
#include "catalog/catname.h"
#include "catalog/dependency.h"
+#include "catalog/heap.h"
#include "catalog/index.h"
#include "catalog/namespace.h"
#include "catalog/pg_opclass.h"
#include "catalog/pg_proc.h"
#include "commands/defrem.h"
+#include "commands/tablecmds.h"
#include "executor/executor.h"
#include "miscadmin.h"
#include "optimizer/clauses.h"
@@ -166,6 +168,50 @@ DefineIndex(RangeVar *heapRelation,
}
/*
+ * Check that all of the attributes in a primary key are marked
+ * as not null, otherwise attempt to ALTER TABLE .. SET NOT NULL
+ */
+ if (primary && !IsFuncIndex(attributeList))
+ {
+ List *keys;
+
+ foreach(keys, attributeList)
+ {
+ IndexElem *key = (IndexElem *) lfirst(keys);
+ HeapTuple atttuple;
+
+ /* System attributes are never null, so no problem */
+ if (SystemAttributeByName(key->name, rel->rd_rel->relhasoids))
+ continue;
+
+ atttuple = SearchSysCacheAttName(relationId, key->name);
+ if (HeapTupleIsValid(atttuple))
+ {
+ if (! ((Form_pg_attribute) GETSTRUCT(atttuple))->attnotnull)
+ {
+ /*
+ * Try to make it NOT NULL.
+ *
+ * XXX: Shouldn't the ALTER TABLE .. SET NOT NULL cascade
+ * to child tables? Currently, since the PRIMARY KEY
+ * itself doesn't cascade, we don't cascade the notnull
+ * constraint either; but this is pretty debatable.
+ */
+ AlterTableAlterColumnSetNotNull(relationId, false,
+ key->name);
+ }
+ ReleaseSysCache(atttuple);
+ }
+ else
+ {
+ /* This shouldn't happen if parser did its job ... */
+ elog(ERROR, "DefineIndex: column \"%s\" named in key does not exist",
+ key->name);
+ }
+ }
+ }
+
+ /*
* Prepare arguments for index_create, primarily an IndexInfo
* structure
*/
@@ -296,7 +342,7 @@ FuncIndexArgs(IndexInfo *indexInfo,
tuple = SearchSysCacheAttName(relId, arg);
if (!HeapTupleIsValid(tuple))
- elog(ERROR, "DefineIndex: attribute \"%s\" not found", arg);
+ elog(ERROR, "DefineIndex: column \"%s\" named in key does not exist", arg);
att = (Form_pg_attribute) GETSTRUCT(tuple);
indexInfo->ii_KeyAttrNumbers[nargs] = att->attnum;
argTypes[nargs] = att->atttypid;