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?


*** ../src.original/./backend/parser/analyze.c	Sun Jan 17 23:39:14 1999
--- ./backend/parser/analyze.c	Sun Jan 17 23:39:56 1999
***************
*** 716,725 ****
--- 716,729 ----
  				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";
*** ../src.original/./backend/catalog/index.c	Sat Jan 16 09:49:31 1999
--- ./backend/catalog/index.c	Sat Jan 16 09:56:53 1999
***************
*** 82,88 ****
  static void UpdateIndexRelation(Oid indexoid, Oid heapoid,
  					FuncIndexInfo *funcInfo, int natts,
  					AttrNumber *attNums, Oid *classOids, Node *predicate,
! 					List *attributeList, bool islossy, bool unique);
  static void DefaultBuild(Relation heapRelation, Relation indexRelation,
  			 int numberOfAttributes, AttrNumber *attributeNumber,
  			 IndexStrategy indexStrategy, uint16 parameterCount,
--- 82,88 ----
  static void UpdateIndexRelation(Oid indexoid, Oid heapoid,
  					FuncIndexInfo *funcInfo, int natts,
  					AttrNumber *attNums, Oid *classOids, Node *predicate,
! 					List *attributeList, bool islossy, bool unique, bool primary);
  static void DefaultBuild(Relation heapRelation, Relation indexRelation,
  			 int numberOfAttributes, AttrNumber *attributeNumber,
  			 IndexStrategy indexStrategy, uint16 parameterCount,
***************
*** 734,740 ****
  					Node *predicate,
  					List *attributeList,
  					bool islossy,
! 					bool unique)
  {
  	Form_pg_index indexForm;
  	IndexElem  *IndexKey;
--- 734,741 ----
  					Node *predicate,
  					List *attributeList,
  					bool islossy,
! 					bool unique,
!                     bool primary)
  {
  	Form_pg_index indexForm;
  	IndexElem  *IndexKey;
***************
*** 775,780 ****
--- 776,782 ----
  	indexForm->indproc = (PointerIsValid(funcInfo)) ?
  		FIgetProcOid(funcInfo) : InvalidOid;
  	indexForm->indislossy = islossy;
+ 	indexForm->indisprimary = primary;
  	indexForm->indisunique = unique;
  
  	indexForm->indhaskeytype = 0;
***************
*** 1014,1020 ****
  			 Datum *parameter,
  			 Node *predicate,
  			 bool islossy,
! 			 bool unique)
  {
  	Relation	heapRelation;
  	Relation	indexRelation;
--- 1016,1023 ----
  			 Datum *parameter,
  			 Node *predicate,
  			 bool islossy,
! 			 bool unique,
!              bool primary)
  {
  	Relation	heapRelation;
  	Relation	indexRelation;
***************
*** 1126,1132 ****
  	 */
  	UpdateIndexRelation(indexoid, heapoid, funcInfo,
  						numatts, attNums, classObjectId, predicate,
! 						attributeList, islossy, unique);
  
  	predInfo = (PredInfo *) palloc(sizeof(PredInfo));
  	predInfo->pred = predicate;
--- 1129,1135 ----
  	 */
  	UpdateIndexRelation(indexoid, heapoid, funcInfo,
  						numatts, attNums, classObjectId, predicate,
! 						attributeList, islossy, unique, primary);
  
  	predInfo = (PredInfo *) palloc(sizeof(PredInfo));
  	predInfo->pred = predicate;
*** ../src.original/./backend/commands/cluster.c	Sat Jan 16 09:58:59 1999
--- ./backend/commands/cluster.c	Sat Jan 16 09:59:34 1999
***************
*** 321,327 ****
  				 Old_pg_index_Form->indclass,
  				 (uint16) 0, (Datum) NULL, NULL,
  				 Old_pg_index_Form->indislossy,
! 				 Old_pg_index_Form->indisunique);
  
  	heap_close(OldIndex);
  	heap_close(NewHeap);
--- 321,328 ----
  				 Old_pg_index_Form->indclass,
  				 (uint16) 0, (Datum) NULL, NULL,
  				 Old_pg_index_Form->indislossy,
! 				 Old_pg_index_Form->indisunique,
!                  Old_pg_index_Form->indisprimary);
  
  	heap_close(OldIndex);
  	heap_close(NewHeap);
*** ../src.original/./backend/commands/defind.c	Mon Jan 18 08:16:36 1999
--- ./backend/commands/defind.c	Mon Jan 18 08:20:09 1999
***************
*** 71,76 ****
--- 71,77 ----
  			List *attributeList,
  			List *parameterList,
  			bool unique,
+ 			bool primary,
  			Expr *predicate,
  			List *rangetable)
  {
***************
*** 189,195 ****
  					 &fInfo, NULL, accessMethodId,
  					 numberOfAttributes, attributeNumberA,
  			 classObjectId, parameterCount, parameterA, (Node *) cnfPred,
! 					 lossy, unique);
  	}
  	else
  	{
--- 190,196 ----
  					 &fInfo, NULL, accessMethodId,
  					 numberOfAttributes, attributeNumberA,
  			 classObjectId, parameterCount, parameterA, (Node *) cnfPred,
! 					 lossy, unique, primary);
  	}
  	else
  	{
***************
*** 206,212 ****
  					 attributeList,
  					 accessMethodId, numberOfAttributes, attributeNumberA,
  			 classObjectId, parameterCount, parameterA, (Node *) cnfPred,
! 					 lossy, unique);
  	}
  }
  
--- 207,213 ----
  					 attributeList,
  					 accessMethodId, numberOfAttributes, attributeNumberA,
  			 classObjectId, parameterCount, parameterA, (Node *) cnfPred,
! 					 lossy, unique, primary);
  	}
  }
  
*** ../src.original/./backend/storage/large_object/inv_api.c	Sat Jan 16 10:03:19 1999
--- ./backend/storage/large_object/inv_api.c	Sat Jan 16 10:04:19 1999
***************
*** 178,184 ****
  	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);
  
  	/* make the index visible in this transaction */
  	CommandCounterIncrement();
--- 178,184 ----
  	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, FALSE);
  
  	/* make the index visible in this transaction */
  	CommandCounterIncrement();
*** ../src.original/./backend/bootstrap/bootparse.y	Sat Jan 16 10:05:39 1999
--- ./backend/bootstrap/bootparse.y	Sun Jan 17 23:33:13 1999
***************
*** 225,231 ****
  					DefineIndex(LexIDStr($5),
  								LexIDStr($3),
  								LexIDStr($7),
! 								$9, NIL, 0, 0, NIL);
  					DO_END;
  				}
  		;
--- 225,231 ----
  					DefineIndex(LexIDStr($5),
  								LexIDStr($3),
  								LexIDStr($7),
! 								$9, NIL, 0, 0, 0, NIL);
  					DO_END;
  				}
  		;
*** ../src.original/./backend/tcop/utility.c	Sun Jan 17 01:18:44 1999
--- ./backend/tcop/utility.c	Mon Jan 18 08:21:12 1999
***************
*** 404,409 ****
--- 404,410 ----
  							stmt->indexParams,	/* parameters */
  							stmt->withClause,
  							stmt->unique,
+ 							0,		/* CREATE INDEX can't be primary */
  							(Expr *) stmt->whereClause,
  							stmt->rangetable);
  			}
*** ../src.original/./include/nodes/parsenodes.h	Sun Jan 17 23:40:37 1999
--- ./include/nodes/parsenodes.h	Sun Jan 17 23:41:05 1999
***************
*** 332,337 ****
--- 332,338 ----
  								 * transformStmt() */
  	bool	   *lossy;			/* is index lossy? */
  	bool		unique;			/* is index unique? */
+ 	bool		primary;		/* is index on primary key? */
  } IndexStmt;
  
  /* ----------------------
*** ../src.original/./include/catalog/index.h	Sat Jan 16 09:57:09 1999
--- ./include/catalog/index.h	Sat Jan 16 10:04:30 1999
***************
*** 38,44 ****
  			 Datum *parameter,
  			 Node *predicate,
  			 bool islossy,
! 			 bool unique);
  
  extern void index_destroy(Oid indexId);
  
--- 38,45 ----
  			 Datum *parameter,
  			 Node *predicate,
  			 bool islossy,
! 			 bool unique,
!              bool primary);
  
  extern void index_destroy(Oid indexId);
  
*** ../src.original/./include/commands/defrem.h	Sat Jan 16 10:02:21 1999
--- ./include/commands/defrem.h	Mon Jan 18 08:12:52 1999
***************
*** 25,30 ****
--- 25,31 ----
  			List *attributeList,
  			List *parameterList,
  			bool unique,
+ 			bool primary,
  			Expr *predicate,
  			List *rangetable);
  extern void ExtendIndex(char *indexRelationName,

-- 
D'Arcy J.M. Cain <darcy@{druid|vex}.net>   |  Democracy is three wolves
http://www.druid.net/darcy/                |  and a sheep voting on
+1 416 424 2871     (DoD#0082)    (eNTP)   |  what's for dinner.


Tue, 19 Jan 1999 09:51:07 -0500 (EST)
"D'Arcy" "J.M." Cain <darcy@druid.net>
Primary key support