diff options
author | Bruce Momjian <bruce@momjian.us> | 1999-01-21 22:48:20 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 1999-01-21 22:48:20 +0000 |
commit | c91dbcc5c7b64aecfc0a246d0f8f2d60145e6326 (patch) | |
tree | 302cd1a2f305a40d4cfa001d3e74b5db9cf9f68c /src | |
parent | 7311da9ec48d6ed918cdede7be3c67817107301b (diff) | |
download | postgresql-c91dbcc5c7b64aecfc0a246d0f8f2d60145e6326.tar.gz postgresql-c91dbcc5c7b64aecfc0a246d0f8f2d60145e6326.zip |
The following patch finishes primary key support. Previously, when
a field was labelled as a primary key, the system automatically
created a unique index on the field. This patch extends it so
that the index has the indisprimary field set. You can pull a list
of primary keys with the followiing select.
SELECT pg_class.relname, pg_attribute.attname
FROM pg_class, pg_attribute, pg_index
WHERE pg_class.oid = pg_attribute.attrelid AND
pg_class.oid = pg_index.indrelid AND
pg_index.indkey[0] = pg_attribute.attnum AND
pg_index.indisunique = 't';
There is nothing in this patch that modifies the template database to
set the indisprimary attribute for system tables. Should they be
changed or should we only be concerned with user tables?
D'Arcy
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/bootstrap/bootparse.y | 4 | ||||
-rw-r--r-- | src/backend/catalog/index.c | 13 | ||||
-rw-r--r-- | src/backend/commands/cluster.c | 5 | ||||
-rw-r--r-- | src/backend/commands/defind.c | 7 | ||||
-rw-r--r-- | src/backend/parser/analyze.c | 6 | ||||
-rw-r--r-- | src/backend/storage/large_object/inv_api.c | 4 | ||||
-rw-r--r-- | src/backend/tcop/utility.c | 3 | ||||
-rw-r--r-- | src/include/catalog/index.h | 5 | ||||
-rw-r--r-- | src/include/commands/defrem.h | 3 | ||||
-rw-r--r-- | src/include/nodes/parsenodes.h | 3 |
10 files changed, 33 insertions, 20 deletions
diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y index 162ca00e78d..5a2a6e09fd4 100644 --- a/src/backend/bootstrap/bootparse.y +++ b/src/backend/bootstrap/bootparse.y @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootparse.y,v 1.21 1998/08/24 01:13:36 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootparse.y,v 1.22 1999/01/21 22:48:04 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -225,7 +225,7 @@ Boot_DeclareIndexStmt: DefineIndex(LexIDStr($5), LexIDStr($3), LexIDStr($7), - $9, NIL, 0, 0, NIL); + $9, NIL, 0, 0, 0, NIL); DO_END; } ; diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 29565ba285e..ce9d7343c84 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.66 1998/12/15 12:45:43 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.67 1999/01/21 22:48:05 momjian Exp $ * * * INTERFACE ROUTINES @@ -82,7 +82,7 @@ static void static void UpdateIndexRelation(Oid indexoid, Oid heapoid, FuncIndexInfo *funcInfo, int natts, AttrNumber *attNums, Oid *classOids, Node *predicate, - List *attributeList, bool islossy, bool unique); + List *attributeList, bool islossy, bool unique, bool primary); static void DefaultBuild(Relation heapRelation, Relation indexRelation, int numberOfAttributes, AttrNumber *attributeNumber, IndexStrategy indexStrategy, uint16 parameterCount, @@ -734,7 +734,8 @@ UpdateIndexRelation(Oid indexoid, Node *predicate, List *attributeList, bool islossy, - bool unique) + bool unique, + bool primary) { Form_pg_index indexForm; IndexElem *IndexKey; @@ -775,6 +776,7 @@ UpdateIndexRelation(Oid indexoid, indexForm->indproc = (PointerIsValid(funcInfo)) ? FIgetProcOid(funcInfo) : InvalidOid; indexForm->indislossy = islossy; + indexForm->indisprimary = primary; indexForm->indisunique = unique; indexForm->indhaskeytype = 0; @@ -1014,7 +1016,8 @@ index_create(char *heapRelationName, Datum *parameter, Node *predicate, bool islossy, - bool unique) + bool unique, + bool primary) { Relation heapRelation; Relation indexRelation; @@ -1126,7 +1129,7 @@ index_create(char *heapRelationName, */ UpdateIndexRelation(indexoid, heapoid, funcInfo, numatts, attNums, classObjectId, predicate, - attributeList, islossy, unique); + attributeList, islossy, unique, primary); predInfo = (PredInfo *) palloc(sizeof(PredInfo)); predInfo->pred = predicate; diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 9d9324e8ff5..a8103912063 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -14,7 +14,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.34 1998/12/14 05:18:39 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.35 1999/01/21 22:48:06 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -321,7 +321,8 @@ copy_index(Oid OIDOldIndex, Oid OIDNewHeap) Old_pg_index_Form->indclass, (uint16) 0, (Datum) NULL, NULL, Old_pg_index_Form->indislossy, - Old_pg_index_Form->indisunique); + Old_pg_index_Form->indisunique, + Old_pg_index_Form->indisprimary); heap_close(OldIndex); heap_close(NewHeap); diff --git a/src/backend/commands/defind.c b/src/backend/commands/defind.c index 33d069e6517..692e1782368 100644 --- a/src/backend/commands/defind.c +++ b/src/backend/commands/defind.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.29 1998/12/15 12:45:56 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.30 1999/01/21 22:48:06 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -71,6 +71,7 @@ DefineIndex(char *heapRelationName, List *attributeList, List *parameterList, bool unique, + bool primary, Expr *predicate, List *rangetable) { @@ -189,7 +190,7 @@ DefineIndex(char *heapRelationName, &fInfo, NULL, accessMethodId, numberOfAttributes, attributeNumberA, classObjectId, parameterCount, parameterA, (Node *) cnfPred, - lossy, unique); + lossy, unique, primary); } else { @@ -206,7 +207,7 @@ DefineIndex(char *heapRelationName, attributeList, accessMethodId, numberOfAttributes, attributeNumberA, classObjectId, parameterCount, parameterA, (Node *) cnfPred, - lossy, unique); + lossy, unique, primary); } } diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index af94800d2ed..9f61e83b35d 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.93 1999/01/21 16:08:38 vadim Exp $ + * $Id: analyze.c,v 1.94 1999/01/21 22:48:07 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -721,10 +721,14 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt) elog(ERROR, "CREATE TABLE/PRIMARY KEY multiple keys for table %s are not legal", stmt->relname); have_pkey = TRUE; + index->primary = TRUE; index->idxname = makeTableName(stmt->relname, "pkey", NULL); } else + { + index->primary = FALSE; index->idxname = NULL; + } index->relname = stmt->relname; index->accessMethod = "btree"; diff --git a/src/backend/storage/large_object/inv_api.c b/src/backend/storage/large_object/inv_api.c index 40460404197..255b05c7c15 100644 --- a/src/backend/storage/large_object/inv_api.c +++ b/src/backend/storage/large_object/inv_api.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.44 1998/12/15 12:46:26 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.45 1999/01/21 22:48:09 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -178,7 +178,7 @@ inv_create(int flags) classObjectId[0] = INT4_OPS_OID; index_create(objname, indname, NULL, NULL, BTREE_AM_OID, 1, &attNums[0], &classObjectId[0], - 0, (Datum) NULL, NULL, FALSE, FALSE); + 0, (Datum) NULL, NULL, FALSE, FALSE, FALSE); /* make the index visible in this transaction */ CommandCounterIncrement(); diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 7d9e11ba5bd..22f915c5920 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.52 1999/01/17 06:18:44 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.53 1999/01/21 22:48:11 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -404,6 +404,7 @@ ProcessUtility(Node *parsetree, stmt->indexParams, /* parameters */ stmt->withClause, stmt->unique, + 0, /* CREATE INDEX can't be primary */ (Expr *) stmt->whereClause, stmt->rangetable); } diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index d377832241b..b08d72e7d17 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: index.h,v 1.13 1998/09/01 04:34:43 momjian Exp $ + * $Id: index.h,v 1.14 1999/01/21 22:48:14 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -38,7 +38,8 @@ extern void index_create(char *heapRelationName, Datum *parameter, Node *predicate, bool islossy, - bool unique); + bool unique, + bool primary); extern void index_destroy(Oid indexId); diff --git a/src/include/commands/defrem.h b/src/include/commands/defrem.h index 37b287d9fac..f5867bd3fa4 100644 --- a/src/include/commands/defrem.h +++ b/src/include/commands/defrem.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: defrem.h,v 1.13 1998/09/01 04:35:30 momjian Exp $ + * $Id: defrem.h,v 1.14 1999/01/21 22:48:16 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -25,6 +25,7 @@ extern void DefineIndex(char *heapRelationName, List *attributeList, List *parameterList, bool unique, + bool primary, Expr *predicate, List *rangetable); extern void ExtendIndex(char *indexRelationName, diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 0e6c8e5068b..32fd65c69ee 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: parsenodes.h,v 1.67 1999/01/21 16:08:55 vadim Exp $ + * $Id: parsenodes.h,v 1.68 1999/01/21 22:48:20 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -333,6 +333,7 @@ typedef struct IndexStmt * transformStmt() */ bool *lossy; /* is index lossy? */ bool unique; /* is index unique? */ + bool primary; /* is index on primary key? */ } IndexStmt; /* ---------------------- |