aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/indexcmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/indexcmds.c')
-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;