Index: doc/src/sgml/array.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/array.sgml,v
retrieving revision 1.60
diff -c -r1.60 array.sgml
*** doc/src/sgml/array.sgml	6 Apr 2007 19:22:38 -0000	1.60
--- doc/src/sgml/array.sgml	9 May 2007 00:38:12 -0000
***************
*** 11,17 ****
    <productname>PostgreSQL</productname> allows columns of a table to be
    defined as variable-length multidimensional arrays. Arrays of any
    built-in or user-defined base type or enum type can be created.
!   (Arrays of composite types or domains are not yet supported, however.)
   </para>
  
   <sect2>
--- 11,18 ----
    <productname>PostgreSQL</productname> allows columns of a table to be
    defined as variable-length multidimensional arrays. Arrays of any
    built-in or user-defined base type or enum type can be created.
!   Arrays of composite types are now supported.  Arrays of domains are
!   not yet supported.
   </para>
  
   <sect2>
Index: src/backend/catalog/heap.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/catalog/heap.c,v
retrieving revision 1.318
diff -c -r1.318 heap.c
*** src/backend/catalog/heap.c	2 Apr 2007 03:49:37 -0000	1.318
--- src/backend/catalog/heap.c	9 May 2007 00:38:13 -0000
***************
*** 45,50 ****
--- 45,51 ----
  #include "catalog/pg_statistic.h"
  #include "catalog/pg_type.h"
  #include "commands/tablecmds.h"
+ #include "commands/typecmds.h"
  #include "miscadmin.h"
  #include "optimizer/clauses.h"
  #include "optimizer/var.h"
***************
*** 69,75 ****
  static Oid AddNewRelationType(const char *typeName,
  				   Oid typeNamespace,
  				   Oid new_rel_oid,
! 				   char new_rel_kind);
  static void RelationRemoveInheritance(Oid relid);
  static void StoreRelCheck(Relation rel, char *ccname, char *ccbin);
  static void StoreConstraints(Relation rel, TupleDesc tupdesc);
--- 70,78 ----
  static Oid AddNewRelationType(const char *typeName,
  				   Oid typeNamespace,
  				   Oid new_rel_oid,
! 				   char new_rel_kind,
!                    Oid new_array_type
! 	         );
  static void RelationRemoveInheritance(Oid relid);
  static void StoreRelCheck(Relation rel, char *ccname, char *ccbin);
  static void StoreConstraints(Relation rel, TupleDesc tupdesc);
***************
*** 402,417 ****
  	char		att_typtype = get_typtype(atttypid);
  
  	/*
! 	 * Warn user, but don't fail, if column to be created has UNKNOWN type
! 	 * (usually as a result of a 'retrieve into' - jolly)
  	 *
! 	 * Refuse any attempt to create a pseudo-type column.
  	 */
! 	if (atttypid == UNKNOWNOID)
  		ereport(WARNING,
  				(errcode(ERRCODE_INVALID_TABLE_DEFINITION),
  				 errmsg("column \"%s\" has type \"unknown\"", attname),
  				 errdetail("Proceeding with relation creation anyway.")));
  	else if (att_typtype == TYPTYPE_PSEUDO)
  	{
  		/* Special hack for pg_statistic: allow ANYARRAY during initdb */
--- 405,444 ----
  	char		att_typtype = get_typtype(atttypid);
  
  	/*
! 	 * For a composite type, recurse into its attributes. Otherwise, 
  	 *
! 	 * a) warn user, but don't fail, if column to be created has UNKNOWN type
! 	 *    (usually as a result of a 'retrieve into' - jolly)
! 	 *
! 	 * b) Refuse any attempt to create a pseudo-type column, except for 
! 	 *    pg_statistic hack.
  	 */
! 	if (att_typtype == TYPTYPE_COMPOSITE)
! 	{
! 		Relation relation;
! 		TupleDesc tupdesc;
! 		int i;
! 
! 		relation = RelationIdGetRelation(get_typ_typrelid(atttypid));
! 
! 		tupdesc = RelationGetDescr(relation);
! 
! 		for (i = 0; i < tupdesc->natts; i++)
! 		{
! 			if (tupdesc->attrs[i]->attisdropped)
! 				continue;
! 			CheckAttributeType(attname, tupdesc->attrs[i]->atttypid);
! 		}
! 
! 		RelationClose(relation);
! 	}
! 	else if (atttypid == UNKNOWNOID)
! 	{
  		ereport(WARNING,
  				(errcode(ERRCODE_INVALID_TABLE_DEFINITION),
  				 errmsg("column \"%s\" has type \"unknown\"", attname),
  				 errdetail("Proceeding with relation creation anyway.")));
+ 	}
  	else if (att_typtype == TYPTYPE_PSEUDO)
  	{
  		/* Special hack for pg_statistic: allow ANYARRAY during initdb */
***************
*** 710,716 ****
  AddNewRelationType(const char *typeName,
  				   Oid typeNamespace,
  				   Oid new_rel_oid,
! 				   char new_rel_kind)
  {
  	return
  		TypeCreate(typeName,	/* type name */
--- 737,744 ----
  AddNewRelationType(const char *typeName,
  				   Oid typeNamespace,
  				   Oid new_rel_oid,
! 				   char new_rel_kind,
! 	               Oid new_array_type)
  {
  	return
  		TypeCreate(typeName,	/* type name */
***************
*** 736,742 ****
  				   'x',			/* fully TOASTable */
  				   -1,			/* typmod */
  				   0,			/* array dimensions for typBaseType */
! 				   false);		/* Type NOT NULL */
  }
  
  /* --------------------------------
--- 764,773 ----
  				   'x',			/* fully TOASTable */
  				   -1,			/* typmod */
  				   0,			/* array dimensions for typBaseType */
! 				   false,		/* Type NOT NULL */
! 				   new_array_type, /* oid of type we are about to make */
! 				   false           /* no this is not an array type */
! 			);
  }
  
  /* --------------------------------
***************
*** 763,768 ****
--- 794,801 ----
  	Relation	pg_class_desc;
  	Relation	new_rel_desc;
  	Oid			new_type_oid;
+ 	Oid         new_array_oid = InvalidOid;
+ 
  
  	pg_class_desc = heap_open(RelationRelationId, RowExclusiveLock);
  
***************
*** 804,809 ****
--- 837,853 ----
  
  	Assert(relid == RelationGetRelid(new_rel_desc));
  
+ 	/* Get an oid for the array type of necessary */
+ 	if (IsUnderPostmaster && (relkind == RELKIND_RELATION ||
+ 							  relkind == RELKIND_VIEW ||
+ 							  relkind == RELKIND_COMPOSITE_TYPE))
+ 	{
+ 		Relation pg_type = heap_open(TypeRelationId, RowExclusiveLock);	
+ 		new_array_oid = GetNewOid(pg_type);
+ 		heap_close(pg_type, RowExclusiveLock);
+ 	}
+ 
+ 
  	/*
  	 * since defining a relation also defines a complex type, we add a new
  	 * system type corresponding to the new relation.
***************
*** 814,820 ****
  	new_type_oid = AddNewRelationType(relname,
  									  relnamespace,
  									  relid,
! 									  relkind);
  
  	/*
  	 * now create an entry in pg_class for the relation.
--- 858,906 ----
  	new_type_oid = AddNewRelationType(relname,
  									  relnamespace,
  									  relid,
! 									  relkind,
! 		                              new_array_oid);
! 	/*
! 	 * Add in the corresponding array types if appropriate.
! 	 */
! 	if (IsUnderPostmaster && (relkind == RELKIND_RELATION ||
! 							  relkind == RELKIND_VIEW ||
! 							  relkind == RELKIND_COMPOSITE_TYPE))
! 	{
! 		char	   *relarrayname;
! 
! 		relarrayname = makeArrayTypeName(relname, relnamespace);
! 
! 		TypeCreate(relarrayname,		/* Array type name */
! 				   relnamespace,		/* Same namespace as parent */
! 				   InvalidOid,			/* Not composite, no relationOid */
! 				   0,					/* relkind, also N/A here */
! 				   -1,					/* Internal size, unlimited */
! 				   TYPTYPE_BASE,		/* Not composite - typelem is */
! 				   DEFAULT_TYPDELIM,	/* Use the default */
! 				   F_ARRAY_IN,			/* array input proc */
! 				   F_ARRAY_OUT,			/* array output proc */
! 				   F_ARRAY_RECV,		/* array recv (bin) proc */
! 				   F_ARRAY_SEND,		/* array send (bin) proc */
! 				   InvalidOid,			/* No input typmod */
! 				   InvalidOid,			/* No output typmod */
! 				   InvalidOid,			/* Default ANALYZE procedure */
! 				   new_type_oid,		/* The OID just created */
! 				   InvalidOid,			/* No base type--not a DOMAIN */
! 				   NULL,				/* No default type value */
! 				   NULL,				/* Don't send binary */
! 				   false,				/* Never passed by value */
! 				   'd',					/* Type align. Max for safety */
! 				   'x',					/* Always TOASTable */
! 				   -1,					/* No typMod for non-domain */
! 				   0,					/* Array dims of typbasetype */
! 				   false,	            /* Type NOT NULL */
! 				   new_array_oid,       /* oid of this type entry */
! 				   true                 /* yes, this is an array type */
! 			);			
! 
! 		pfree(relarrayname);
! 	}
  
  	/*
  	 * now create an entry in pg_class for the relation.
***************
*** 887,893 ****
  	 */
  	heap_close(new_rel_desc, NoLock);	/* do not unlock till end of xact */
  	heap_close(pg_class_desc, RowExclusiveLock);
! 
  	return relid;
  }
  
--- 973,979 ----
  	 */
  	heap_close(new_rel_desc, NoLock);	/* do not unlock till end of xact */
  	heap_close(pg_class_desc, RowExclusiveLock);
! 	
  	return relid;
  }
  
Index: src/backend/catalog/pg_type.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v
retrieving revision 1.111
diff -c -r1.111 pg_type.c
*** src/backend/catalog/pg_type.c	2 Apr 2007 03:49:37 -0000	1.111
--- src/backend/catalog/pg_type.c	9 May 2007 00:38:14 -0000
***************
*** 90,95 ****
--- 90,96 ----
  	values[i++] = CharGetDatum(DEFAULT_TYPDELIM);		/* typdelim */
  	values[i++] = ObjectIdGetDatum(InvalidOid); /* typrelid */
  	values[i++] = ObjectIdGetDatum(InvalidOid); /* typelem */
+ 	values[i++] = ObjectIdGetDatum(InvalidOid); /* typarray */
  	values[i++] = ObjectIdGetDatum(F_SHELL_IN); /* typinput */
  	values[i++] = ObjectIdGetDatum(F_SHELL_OUT);		/* typoutput */
  	values[i++] = ObjectIdGetDatum(InvalidOid); /* typreceive */
***************
*** 180,186 ****
  		   char storage,
  		   int32 typeMod,
  		   int32 typNDims,		/* Array dimensions for baseType */
! 		   bool typeNotNull)
  {
  	Relation	pg_type_desc;
  	Oid			typeObjectId;
--- 181,190 ----
  		   char storage,
  		   int32 typeMod,
  		   int32 typNDims,		/* Array dimensions for baseType */
! 		   bool typeNotNull,
! 	       Oid arrayType,
! 	       bool is_array_type
! )
  {
  	Relation	pg_type_desc;
  	Oid			typeObjectId;
***************
*** 246,251 ****
--- 250,257 ----
  	values[i++] = ObjectIdGetDatum(typeType == TYPTYPE_COMPOSITE ?
  								   relationOid : InvalidOid); /* typrelid */
  	values[i++] = ObjectIdGetDatum(elementType);		/* typelem */
+ 	values[i++] = ObjectIdGetDatum(is_array_type ? 
+ 								   InvalidOid : arrayType); /* typarray */
  	values[i++] = ObjectIdGetDatum(inputProcedure);		/* typinput */
  	values[i++] = ObjectIdGetDatum(outputProcedure);	/* typoutput */
  	values[i++] = ObjectIdGetDatum(receiveProcedure);	/* typreceive */
***************
*** 331,336 ****
--- 337,347 ----
  							 values,
  							 nulls);
  
+ 		/* should only happen if it's not a shell type */
+ 		if (is_array_type)
+ 			HeapTupleSetOid(tup, arrayType);
+ 
+ 
  		typeObjectId = simple_heap_insert(pg_type_desc, tup);
  	}
  
***************
*** 571,590 ****
  }
  
  /*
   * makeArrayTypeName(typeName);
   *	  - given a base type name, make an array of type name out of it
   *
   * the caller is responsible for pfreeing the result
   */
  char *
! makeArrayTypeName(const char *typeName)
  {
  	char	   *arr;
  
  	if (!typeName)
  		return NULL;
  	arr = palloc(NAMEDATALEN);
! 	snprintf(arr, NAMEDATALEN,
! 			 "_%.*s", NAMEDATALEN - 2, typeName);
  	return arr;
  }
--- 582,660 ----
  }
  
  /*
+  * find the mb-safe substring length that is not greater than max
+  */
+ static int 
+ mb_substr_len(char * str, int max)
+ {
+ 	int result = 0;
+ 	char * crsr = str;
+ 	int len = strlen(str);
+ 
+ 	if (max > len)
+ 		max = len;
+ 
+ 	if (pg_database_encoding_max_length() == 1)
+ 		return max;
+ 	if (crsr == NULL)
+ 		return 0;
+ 	while (*crsr)
+ 	{
+ 		len = pg_mblen(crsr);
+ 		if (result + len > max)
+ 			break;
+ 		result += len;
+ 		crsr += len;
+ 	}
+ 	return result;
+ }
+ 
+ 
+ 
+ /*
   * makeArrayTypeName(typeName);
   *	  - given a base type name, make an array of type name out of it
   *
   * the caller is responsible for pfreeing the result
   */
  char *
! makeArrayTypeName(const char *typeName, Oid typeNamespace)
  {
  	char	   *arr;
+ 	int        i, safelen;
+ 	bool       found = false;
+ 	Relation	pg_type_desc;
+ 
+ 	pg_type_desc = heap_open(TypeRelationId, RowExclusiveLock);
+ 
  
  	if (!typeName)
  		return NULL;
+ 
  	arr = palloc(NAMEDATALEN);
! 
! 	for (i = 1; i < NAMEDATALEN / 2; i++)
! 	{
! 		arr[i - 1] = '_';
! 		safelen = mb_substr_len(typeName, NAMEDATALEN - (i + 1));
! 		snprintf(arr+i, NAMEDATALEN - 1, "%.*s",  safelen, typeName);
! 		if (SearchSysCacheExists(TYPENAMENSP,
! 							 CStringGetDatum(arr),
! 							 ObjectIdGetDatum(typeNamespace),
! 							 0, 0))
! 			continue;
! 		found = true;
! 		break;
! 	}
! 	
! 	heap_close(pg_type_desc, RowExclusiveLock);
! 
! 	if (! found)
! 		ereport(ERROR,
! 				(errcode(ERRCODE_DUPLICATE_OBJECT),
! 				 errmsg("could not form array type name for type \"%s\"", 
! 						typeName)));
! 
! 
  	return arr;
  }
Index: src/backend/commands/tablecmds.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v
retrieving revision 1.219
diff -c -r1.219 tablecmds.c
*** src/backend/commands/tablecmds.c	8 Apr 2007 01:26:32 -0000	1.219
--- src/backend/commands/tablecmds.c	9 May 2007 00:38:18 -0000
***************
*** 287,298 ****
  	Datum		reloptions;
  	ListCell   *listptr;
  	AttrNumber	attnum;
  
  	/*
! 	 * Truncate relname to appropriate length (probably a waste of time, as
! 	 * parser should have done this already).
  	 */
! 	StrNCpy(relname, stmt->relation->relname, NAMEDATALEN);
  
  	/*
  	 * Check consistency of arguments
--- 287,309 ----
  	Datum		reloptions;
  	ListCell   *listptr;
  	AttrNumber	attnum;
+ 	char	   *relarrayname;
  
  	/*
! 	 * Truncate relname to appropriate length (probably a waste of time, as *
! 	 * parser should have done this already).  Because tables and views now get
! 	 * an array type, this depends on the relkind.
  	 */
! 	if (relkind == RELKIND_RELATION ||
! 		relkind == RELKIND_VIEW ||
! 		relkind == RELKIND_COMPOSITE_TYPE)
! 	{
! 		StrNCpy(relname, stmt->relation->relname, NAMEDATALEN-2);
! 	}
! 	else
! 	{
! 		StrNCpy(relname, stmt->relation->relname, NAMEDATALEN);
! 	}
  
  	/*
  	 * Check consistency of arguments
***************
*** 6461,6468 ****
  
  	AlterRelationNamespaceInternal(classRel, relid, oldNspOid, nspOid, true);
  
! 	/* Fix the table's rowtype too */
  	AlterTypeNamespaceInternal(rel->rd_rel->reltype, nspOid, false);
  
  	/* Fix other dependent stuff */
  	if (rel->rd_rel->relkind == RELKIND_RELATION)
--- 6472,6480 ----
  
  	AlterRelationNamespaceInternal(classRel, relid, oldNspOid, nspOid, true);
  
! 	/* Fix the table's types too */
  	AlterTypeNamespaceInternal(rel->rd_rel->reltype, nspOid, false);
+ 	AlterTypeNamespaceInternal(get_array_type(rel->rd_rel->reltype), nspOid, false);
  
  	/* Fix other dependent stuff */
  	if (rel->rd_rel->relkind == RELKIND_RELATION)
Index: src/backend/commands/typecmds.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/typecmds.c,v
retrieving revision 1.101
diff -c -r1.101 typecmds.c
*** src/backend/commands/typecmds.c	2 Apr 2007 03:49:38 -0000	1.101
--- src/backend/commands/typecmds.c	9 May 2007 00:38:20 -0000
***************
*** 34,39 ****
--- 34,40 ----
  #include "access/genam.h"
  #include "access/heapam.h"
  #include "access/xact.h"
+ #include "catalog/catalog.h"
  #include "catalog/dependency.h"
  #include "catalog/heap.h"
  #include "catalog/indexing.h"
***************
*** 119,127 ****
--- 120,130 ----
  	Oid			typmodoutOid = InvalidOid;
  	Oid			analyzeOid = InvalidOid;
  	char	   *shadow_type;
+ 	Oid         shadow_oid;
  	ListCell   *pl;
  	Oid			typoid;
  	Oid			resulttype;
+ 	Relation    pg_type;
  
  	/* Convert list of names to a name and namespace */
  	typeNamespace = QualifiedNameGetCreationNamespace(names, &typeName);
***************
*** 396,401 ****
--- 399,408 ----
  		aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PROC,
  					   NameListToString(analyzeName));
  
+ 	pg_type = heap_open(TypeRelationId, RowExclusiveLock);	
+ 	shadow_oid = GetNewOid(pg_type);
+ 	heap_close(pg_type, RowExclusiveLock);
+ 
  	/*
  	 * now have TypeCreate do all the real work.
  	 */
***************
*** 423,465 ****
  				   storage,		/* TOAST strategy */
  				   -1,			/* typMod (Domains only) */
  				   0,			/* Array Dimensions of typbasetype */
! 				   false);		/* Type NOT NULL */
  
  	/*
  	 * When we create a base type (as opposed to a complex type) we need to
  	 * have an array entry for it in pg_type as well.
  	 */
! 	shadow_type = makeArrayTypeName(typeName);
  
  	/* alignment must be 'i' or 'd' for arrays */
  	alignment = (alignment == 'd') ? 'd' : 'i';
  
! 	TypeCreate(shadow_type,		/* type name */
! 			   typeNamespace,	/* namespace */
! 			   InvalidOid,		/* relation oid (n/a here) */
! 			   0,				/* relation kind (ditto) */
! 			   -1,				/* internal size */
! 			   TYPTYPE_BASE,	/* type-type (base type) */
! 			   DEFAULT_TYPDELIM,	/* array element delimiter */
! 			   F_ARRAY_IN,		/* input procedure */
! 			   F_ARRAY_OUT,		/* output procedure */
! 			   F_ARRAY_RECV,	/* receive procedure */
! 			   F_ARRAY_SEND,	/* send procedure */
! 			   typmodinOid,		/* typmodin procedure */
! 			   typmodoutOid,	/* typmodout procedure */
! 			   InvalidOid,		/* analyze procedure - default */
! 			   typoid,			/* element type ID */
! 			   InvalidOid,		/* base type ID */
! 			   NULL,			/* never a default type value */
! 			   NULL,			/* binary default isn't sent either */
! 			   false,			/* never passed by value */
! 			   alignment,		/* see above */
! 			   'x',				/* ARRAY is always toastable */
! 			   -1,				/* typMod (Domains only) */
! 			   0,				/* Array dimensions of typbasetype */
! 			   false);			/* Type NOT NULL */
  
  	pfree(shadow_type);
  }
  
  
--- 430,479 ----
  				   storage,		/* TOAST strategy */
  				   -1,			/* typMod (Domains only) */
  				   0,			/* Array Dimensions of typbasetype */
! 				   false,		/* Type NOT NULL */
! 				   shadow_oid,  /* array type we are about to create */
! 				   false        /* this is not an array type */
! 			);
  
  	/*
  	 * When we create a base type (as opposed to a complex type) we need to
  	 * have an array entry for it in pg_type as well.
  	 */
! 	shadow_type = makeArrayTypeName(typeName, typeNamespace);
  
  	/* alignment must be 'i' or 'd' for arrays */
  	alignment = (alignment == 'd') ? 'd' : 'i';
  
!    TypeCreate(shadow_type,		/* type name */
! 			  typeNamespace,	/* namespace */
! 			  InvalidOid,		/* relation oid (n/a here) */
! 			  0,				/* relation kind (ditto) */
! 			  -1,				/* internal size */
! 			  TYPTYPE_BASE,	/* type-type (base type) */
! 			  DEFAULT_TYPDELIM,	/* array element delimiter */
! 			  F_ARRAY_IN,		/* input procedure */
! 			  F_ARRAY_OUT,		/* output procedure */
! 			  F_ARRAY_RECV,	/* receive procedure */
! 			  F_ARRAY_SEND,	/* send procedure */
! 			  typmodinOid,		/* typmodin procedure */
! 			  typmodoutOid,	/* typmodout procedure */
! 			  InvalidOid,		/* analyze procedure - default */
! 			  typoid,			/* element type ID */
! 			  InvalidOid,		/* base type ID */
! 			  NULL,			/* never a default type value */
! 			  NULL,			/* binary default isn't sent either */
! 			  false,			/* never passed by value */
! 			  alignment,		/* see above */
! 			  'x',				/* ARRAY is always toastable */
! 			  -1,				/* typMod (Domains only) */
! 			  0,				/* Array dimensions of typbasetype */
! 			  false,			/* Type NOT NULL */
! 			  shadow_oid,       /* oid for this entry */
! 			  true              /* yes this is an array type */
! 	   );
  
  	pfree(shadow_type);
+ 
  }
  
  
***************
*** 474,479 ****
--- 488,494 ----
  	Oid			typeoid;
  	HeapTuple	tup;
  	ObjectAddress object;
+ 	Form_pg_type typ;
  
  	/* Make a TypeName so we can use standard type lookup machinery */
  	typename = makeTypeNameFromNameList(names);
***************
*** 505,513 ****
  	if (!HeapTupleIsValid(tup))
  		elog(ERROR, "cache lookup failed for type %u", typeoid);
  
  	/* Permission check: must own type or its namespace */
  	if (!pg_type_ownercheck(typeoid, GetUserId()) &&
! 	  !pg_namespace_ownercheck(((Form_pg_type) GETSTRUCT(tup))->typnamespace,
  							   GetUserId()))
  		aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_TYPE,
  					   TypeNameToString(typename));
--- 520,538 ----
  	if (!HeapTupleIsValid(tup))
  		elog(ERROR, "cache lookup failed for type %u", typeoid);
  
+ 	typ = (Form_pg_type) GETSTRUCT(tup);
+ 
+ 	/* don't alow direct deletion of array types */
+ 	if (typ->typelem != 0 && typ->typlen == -1)
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
+ 					 errmsg("cannot delete array type \"%s\" ",
+ 							TypeNameToString(typename))));
+ 
+ 
  	/* Permission check: must own type or its namespace */
  	if (!pg_type_ownercheck(typeoid, GetUserId()) &&
! 	  !pg_namespace_ownercheck(typ->typnamespace,
  							   GetUserId()))
  		aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_TYPE,
  					   TypeNameToString(typename));
***************
*** 545,551 ****
  	simple_heap_delete(relation, &tup->t_self);
  
  	/*
! 	 * If it is an enum, delete the pg_enum entries too; we don't bother
  	 * with making dependency entries for those, so it has to be done
  	 * "by hand" here.
  	 */
--- 570,576 ----
  	simple_heap_delete(relation, &tup->t_self);
  
  	/*
! 	 * If it is an enum delete the pg_enum entries too; we don't bother
  	 * with making dependency entries for those, so it has to be done
  	 * "by hand" here.
  	 */
***************
*** 828,835 ****
  				   storage,		/* TOAST strategy */
  				   basetypeMod, /* typeMod value */
  				   typNDims,	/* Array dimensions for base type */
! 				   typNotNull); /* Type NOT NULL */
! 
  	/*
  	 * Process constraints which refer to the domain ID returned by TypeCreate
  	 */
--- 853,862 ----
  				   storage,		/* TOAST strategy */
  				   basetypeMod, /* typeMod value */
  				   typNDims,	/* Array dimensions for base type */
! 				   typNotNull, /* Type NOT NULL */
! 				   InvalidOid, /* no arrays for domains */
! 				   false       /* this isn't an array */
! 			);
  	/*
  	 * Process constraints which refer to the domain ID returned by TypeCreate
  	 */
***************
*** 949,954 ****
--- 976,983 ----
  	Oid		enumNamespace;
  	Oid		enumTypeOid;
  	AclResult	aclresult;
+ 	Oid     enumArrayOid;
+ 	Relation pg_type;
  
  	/* Convert list of names to a name and namespace */
  	enumNamespace = QualifiedNameGetCreationNamespace(stmt->typename,
***************
*** 970,975 ****
--- 999,1009 ----
  				 errmsg("type names must be %d characters or less",
  						NAMEDATALEN - 2)));
  
+ 
+ 	pg_type = heap_open(TypeRelationId, RowExclusiveLock);	
+ 	enumArrayOid = GetNewOid(pg_type);
+ 	heap_close(pg_type, RowExclusiveLock);
+ 
  	/* Create the pg_type entry */
  	enumTypeOid = 
  		TypeCreate(enumName,		/* type name */
***************
*** 995,1007 ****
  				   'p',				/* TOAST strategy always plain */
  				   -1,				/* typMod (Domains only) */
  				   0,				/* Array dimensions of typbasetype */
! 				   false);			/* Type NOT NULL */
  
  	/* Enter the enum's values into pg_enum */
  	EnumValuesCreate(enumTypeOid, stmt->vals);
  
  	/* Create array type for enum */
! 	enumArrayName = makeArrayTypeName(enumName);
  
  	TypeCreate(enumArrayName,   /* type name */
  			   enumNamespace,   /* namespace */
--- 1029,1044 ----
  				   'p',				/* TOAST strategy always plain */
  				   -1,				/* typMod (Domains only) */
  				   0,				/* Array dimensions of typbasetype */
! 				   false,			/* Type NOT NULL */
! 				   enumArrayOid,    /* oid of entry we are about to create */
! 				   false            /* this is not an array */
! 			);
  
  	/* Enter the enum's values into pg_enum */
  	EnumValuesCreate(enumTypeOid, stmt->vals);
  
  	/* Create array type for enum */
! 	enumArrayName = makeArrayTypeName(enumName, enumNamespace);
  
  	TypeCreate(enumArrayName,   /* type name */
  			   enumNamespace,   /* namespace */
***************
*** 1026,1032 ****
  			   'x',             /* ARRAY is always toastable */
  			   -1,              /* typMod (Domains only) */
                 0,               /* Array dimensions of typbasetype */
! 			   false);          /* Type NOT NULL */
  
  	pfree(enumArrayName);
  }
--- 1063,1072 ----
  			   'x',             /* ARRAY is always toastable */
  			   -1,              /* typMod (Domains only) */
                 0,               /* Array dimensions of typbasetype */
! 			   false,           /* Type NOT NULL */
! 			   enumArrayOid,    /* oid to use for this entry */
! 			   true             /* this is an array */
! 		);
  
  	pfree(enumArrayName);
  }
***************
*** 2249,2254 ****
--- 2289,2302 ----
  		elog(ERROR, "cache lookup failed for type %u", typeOid);
  	typTup = (Form_pg_type) GETSTRUCT(tup);
  
+ 	/* don't allow direct alteration of array types */
+ 	if (typTup->typelem != 0 && typTup->typlen == -1)
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
+ 					 errmsg("cannot alter array type \"%s\" ",
+ 							TypeNameToString(typename))));
+ 
+ 
  	/*
  	 * If it's a composite type, we need to check that it really is a
  	 * free-standing composite type, and not a table's underlying type. We
***************
*** 2352,2357 ****
--- 2400,2408 ----
  	TypeName   *typename;
  	Oid			typeOid;
  	Oid			nspOid;
+ 	Relation	rel;
+ 	HeapTuple	tup;
+ 	Form_pg_type typ;
  
  	/* Make a TypeName so we can use standard type lookup machinery */
  	typename = makeTypeNameFromNameList(names);
***************
*** 2365,2372 ****
--- 2416,2449 ----
  	/* get schema OID and check its permissions */
  	nspOid = LookupCreationNamespace(newschema);
  
+ 	/* don't allow direct alteration of array types */
+ 
+ 	rel = heap_open(TypeRelationId, RowExclusiveLock);
+ 
+ 	tup = SearchSysCacheCopy(TYPEOID,
+ 							 ObjectIdGetDatum(typeOid),
+ 							 0, 0, 0);
+ 	if (!HeapTupleIsValid(tup))
+ 		elog(ERROR, "cache lookup failed for type %u", typeOid);
+ 
+ 	typ = (Form_pg_type) GETSTRUCT(tup);
+ 
+ 	if (typ->typelem != 0 && typ->typlen == -1)
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
+ 					 errmsg("cannot alter array type \"%s\" ",
+ 							TypeNameToString(typename))));
+ 
+ 
+ 	heap_freetuple(tup);
+ 
+ 	heap_close(rel, RowExclusiveLock);
+ 
  	/* and do the work */
  	AlterTypeNamespaceInternal(typeOid, nspOid, true);
+ 	typeOid = get_array_type(typeOid);
+ 	if (typeOid != InvalidOid)
+ 		AlterTypeNamespaceInternal(typeOid, nspOid, true);
  }
  
  /*
***************
*** 2431,2442 ****
  
  	/* Detect whether type is a composite type (but not a table rowtype) */
  	isCompositeType =
! 		(typform->typtype == TYPTYPE_COMPOSITE &&
  		 get_rel_relkind(typform->typrelid) == RELKIND_COMPOSITE_TYPE);
  
  	/* Enforce not-table-type if requested */
  	if (typform->typtype == TYPTYPE_COMPOSITE && !isCompositeType &&
! 		errorOnTableType)
  		ereport(ERROR,
  				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
  				 errmsg("%s is a table's row type",
--- 2508,2519 ----
  
  	/* Detect whether type is a composite type (but not a table rowtype) */
  	isCompositeType =
! 		(typform->typtype == TYPTYPE_COMPOSITE && typform->typrelid != InvalidOid &&
  		 get_rel_relkind(typform->typrelid) == RELKIND_COMPOSITE_TYPE);
  
  	/* Enforce not-table-type if requested */
  	if (typform->typtype == TYPTYPE_COMPOSITE && !isCompositeType &&
! 		typform->typrelid != InvalidOid && errorOnTableType)
  		ereport(ERROR,
  				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
  				 errmsg("%s is a table's row type",
***************
*** 2457,2463 ****
  	 * We need to modify the pg_class tuple as well to reflect the change of
  	 * schema.
  	 */
! 	if (isCompositeType)
  	{
  		Relation	classRel;
  
--- 2534,2540 ----
  	 * We need to modify the pg_class tuple as well to reflect the change of
  	 * schema.
  	 */
! 	if (isCompositeType && typform->typrelid != InvalidOid)
  	{
  		Relation	classRel;
  
***************
*** 2490,2496 ****
  		 * Update dependency on schema, if any --- a table rowtype has not got
  		 * one.
  		 */
! 		if (typform->typtype != TYPTYPE_COMPOSITE)
  			if (changeDependencyFor(TypeRelationId, typeOid,
  								NamespaceRelationId, oldNspOid, nspOid) != 1)
  				elog(ERROR, "failed to change schema dependency for type %s",
--- 2567,2573 ----
  		 * Update dependency on schema, if any --- a table rowtype has not got
  		 * one.
  		 */
! 		if (typform->typtype != TYPTYPE_COMPOSITE || typform->typrelid == InvalidOid)
  			if (changeDependencyFor(TypeRelationId, typeOid,
  								NamespaceRelationId, oldNspOid, nspOid) != 1)
  				elog(ERROR, "failed to change schema dependency for type %s",
Index: src/backend/parser/parse_type.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/parser/parse_type.c,v
retrieving revision 1.89
diff -c -r1.89 parse_type.c
*** src/backend/parser/parse_type.c	27 Apr 2007 22:05:48 -0000	1.89
--- src/backend/parser/parse_type.c	9 May 2007 00:38:20 -0000
***************
*** 116,125 ****
  		/* deconstruct the name list */
  		DeconstructQualifiedName(typename->names, &schemaname, &typname);
  
- 		/* If an array reference, look up the array type instead */
- 		if (typename->arrayBounds != NIL)
- 			typname = makeArrayTypeName(typname);
- 
  		if (schemaname)
  		{
  			/* Look in specific schema only */
--- 116,121 ----
***************
*** 136,141 ****
--- 132,142 ----
  			/* Unqualified type name, so search the search path */
  			restype = TypenameGetTypid(typname);
  		}
+ 
+ 		/* If an array reference, return the array type instead */
+ 		if (typename->arrayBounds != NIL)
+ 			restype = get_array_type(restype);
+ 
  	}
  
  	return restype;
Index: src/backend/utils/cache/lsyscache.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/cache/lsyscache.c,v
retrieving revision 1.151
diff -c -r1.151 lsyscache.c
*** src/backend/utils/cache/lsyscache.c	2 Apr 2007 03:49:39 -0000	1.151
--- src/backend/utils/cache/lsyscache.c	9 May 2007 00:38:23 -0000
***************
*** 2206,2252 ****
   *		Given the type OID, get the corresponding array type.
   *		Returns InvalidOid if no array type can be found.
   *
-  * NB: this only considers varlena arrays to be true arrays.
   */
  Oid
  get_array_type(Oid typid)
  {
  	HeapTuple	tp;
  
  	tp = SearchSysCache(TYPEOID,
  						ObjectIdGetDatum(typid),
  						0, 0, 0);
  	if (HeapTupleIsValid(tp))
  	{
! 		Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
! 		char	   *array_typename;
! 		Oid			namespaceId;
! 
! 		array_typename = makeArrayTypeName(NameStr(typtup->typname));
! 		namespaceId = typtup->typnamespace;
  		ReleaseSysCache(tp);
- 
- 		tp = SearchSysCache(TYPENAMENSP,
- 							PointerGetDatum(array_typename),
- 							ObjectIdGetDatum(namespaceId),
- 							0, 0);
- 
- 		pfree(array_typename);
- 
- 		if (HeapTupleIsValid(tp))
- 		{
- 			Oid			result;
- 
- 			typtup = (Form_pg_type) GETSTRUCT(tp);
- 			if (typtup->typlen == -1 && typtup->typelem == typid)
- 				result = HeapTupleGetOid(tp);
- 			else
- 				result = InvalidOid;
- 			ReleaseSysCache(tp);
- 			return result;
- 		}
  	}
! 	return InvalidOid;
  }
  
  /*
--- 2206,2227 ----
   *		Given the type OID, get the corresponding array type.
   *		Returns InvalidOid if no array type can be found.
   *
   */
  Oid
  get_array_type(Oid typid)
  {
  	HeapTuple	tp;
+ 	Oid result = InvalidOid;
  
  	tp = SearchSysCache(TYPEOID,
  						ObjectIdGetDatum(typid),
  						0, 0, 0);
  	if (HeapTupleIsValid(tp))
  	{
! 		result = ((Form_pg_type) GETSTRUCT(tp))->typarray;
  		ReleaseSysCache(tp);
  	}
! 	return result;
  }
  
  /*
Index: src/include/catalog/catversion.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/catalog/catversion.h,v
retrieving revision 1.404
diff -c -r1.404 catversion.h
*** src/include/catalog/catversion.h	15 Apr 2007 10:56:27 -0000	1.404
--- src/include/catalog/catversion.h	9 May 2007 00:38:23 -0000
***************
*** 53,58 ****
   */
  
  /*							yyyymmddN */
! #define CATALOG_VERSION_NO	200704151
  
  #endif
--- 53,58 ----
   */
  
  /*							yyyymmddN */
! #define CATALOG_VERSION_NO	200705061
  
  #endif
Index: src/include/catalog/pg_attribute.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/catalog/pg_attribute.h,v
retrieving revision 1.130
diff -c -r1.130 pg_attribute.h
*** src/include/catalog/pg_attribute.h	22 Jan 2007 01:35:21 -0000	1.130
--- src/include/catalog/pg_attribute.h	9 May 2007 00:38:23 -0000
***************
*** 232,252 ****
  { 1247, {"typdelim"},	   18, -1,	1,	8, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0 }, \
  { 1247, {"typrelid"},	   26, -1,	4,	9, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
  { 1247, {"typelem"},	   26, -1,	4, 10, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typinput"},	   24, -1,	4, 11, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typoutput"},	   24, -1,	4, 12, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typreceive"},    24, -1,	4, 13, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typsend"},	   24, -1,	4, 14, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typmodin"},	   24, -1,	4, 15, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typmodout"},	   24, -1,	4, 16, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typanalyze"},    24, -1,	4, 17, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typalign"},	   18, -1,	1, 18, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0 }, \
! { 1247, {"typstorage"},    18, -1,	1, 19, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0 }, \
! { 1247, {"typnotnull"},    16, -1,	1, 20, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0 }, \
! { 1247, {"typbasetype"},   26, -1,	4, 21, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typtypmod"},	   23, -1,	4, 22, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typndims"},	   23, -1,	4, 23, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typdefaultbin"}, 25, -1, -1, 24, 0, -1, -1, false, 'x', 'i', false, false, false, true, 0 }, \
! { 1247, {"typdefault"},    25, -1, -1, 25, 0, -1, -1, false, 'x', 'i', false, false, false, true, 0 }
  
  DATA(insert ( 1247 typname			19 -1 NAMEDATALEN	1 0 -1 -1 f p i t f f t 0));
  DATA(insert ( 1247 typnamespace		26 -1 4   2 0 -1 -1 t p i t f f t 0));
--- 232,253 ----
  { 1247, {"typdelim"},	   18, -1,	1,	8, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0 }, \
  { 1247, {"typrelid"},	   26, -1,	4,	9, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
  { 1247, {"typelem"},	   26, -1,	4, 10, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typarray"},	   26, -1,	4, 11, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typinput"},	   24, -1,	4, 12, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typoutput"},	   24, -1,	4, 13, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typreceive"},    24, -1,	4, 14, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typsend"},	   24, -1,	4, 15, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typmodin"},	   24, -1,	4, 16, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typmodout"},	   24, -1,	4, 17, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typanalyze"},    24, -1,	4, 18, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typalign"},	   18, -1,	1, 19, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0 }, \
! { 1247, {"typstorage"},    18, -1,	1, 20, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0 }, \
! { 1247, {"typnotnull"},    16, -1,	1, 21, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0 }, \
! { 1247, {"typbasetype"},   26, -1,	4, 22, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typtypmod"},	   23, -1,	4, 23, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typndims"},	   23, -1,	4, 24, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \
! { 1247, {"typdefaultbin"}, 25, -1, -1, 25, 0, -1, -1, false, 'x', 'i', false, false, false, true, 0 }, \
! { 1247, {"typdefault"},    25, -1, -1, 26, 0, -1, -1, false, 'x', 'i', false, false, false, true, 0 }
  
  DATA(insert ( 1247 typname			19 -1 NAMEDATALEN	1 0 -1 -1 f p i t f f t 0));
  DATA(insert ( 1247 typnamespace		26 -1 4   2 0 -1 -1 t p i t f f t 0));
***************
*** 258,278 ****
  DATA(insert ( 1247 typdelim			18 -1 1   8 0 -1 -1 t p c t f f t 0));
  DATA(insert ( 1247 typrelid			26 -1 4   9 0 -1 -1 t p i t f f t 0));
  DATA(insert ( 1247 typelem			26 -1 4  10 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typinput			24 -1 4  11 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typoutput		24 -1 4  12 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typreceive		24 -1 4  13 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typsend			24 -1 4  14 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typmodin			24 -1 4  15 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typmodout		24 -1 4  16 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typanalyze		24 -1 4  17 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typalign			18 -1 1  18 0 -1 -1 t p c t f f t 0));
! DATA(insert ( 1247 typstorage		18 -1 1  19 0 -1 -1 t p c t f f t 0));
! DATA(insert ( 1247 typnotnull		16 -1 1  20 0 -1 -1 t p c t f f t 0));
! DATA(insert ( 1247 typbasetype		26 -1 4  21 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typtypmod		23 -1 4  22 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typndims			23 -1 4  23 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typdefaultbin	25 -1 -1 24 0 -1 -1 f x i f f f t 0));
! DATA(insert ( 1247 typdefault		25 -1 -1 25 0 -1 -1 f x i f f f t 0));
  DATA(insert ( 1247 ctid				27 0  6  -1 0 -1 -1 f p s t f f t 0));
  DATA(insert ( 1247 oid				26 0  4  -2 0 -1 -1 t p i t f f t 0));
  DATA(insert ( 1247 xmin				28 0  4  -3 0 -1 -1 t p i t f f t 0));
--- 259,280 ----
  DATA(insert ( 1247 typdelim			18 -1 1   8 0 -1 -1 t p c t f f t 0));
  DATA(insert ( 1247 typrelid			26 -1 4   9 0 -1 -1 t p i t f f t 0));
  DATA(insert ( 1247 typelem			26 -1 4  10 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typarray			26 -1 4  11 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typinput			24 -1 4  12 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typoutput		24 -1 4  13 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typreceive		24 -1 4  14 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typsend			24 -1 4  15 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typmodin			24 -1 4  16 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typmodout		24 -1 4  17 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typanalyze		24 -1 4  18 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typalign			18 -1 1  19 0 -1 -1 t p c t f f t 0));
! DATA(insert ( 1247 typstorage		18 -1 1  20 0 -1 -1 t p c t f f t 0));
! DATA(insert ( 1247 typnotnull		16 -1 1  21 0 -1 -1 t p c t f f t 0));
! DATA(insert ( 1247 typbasetype		26 -1 4  22 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typtypmod		23 -1 4  23 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typndims			23 -1 4  24 0 -1 -1 t p i t f f t 0));
! DATA(insert ( 1247 typdefaultbin	25 -1 -1 25 0 -1 -1 f x i f f f t 0));
! DATA(insert ( 1247 typdefault		25 -1 -1 26 0 -1 -1 f x i f f f t 0));
  DATA(insert ( 1247 ctid				27 0  6  -1 0 -1 -1 f p s t f f t 0));
  DATA(insert ( 1247 oid				26 0  4  -2 0 -1 -1 t p i t f f t 0));
  DATA(insert ( 1247 xmin				28 0  4  -3 0 -1 -1 t p i t f f t 0));
Index: src/include/catalog/pg_class.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/catalog/pg_class.h,v
retrieving revision 1.100
diff -c -r1.100 pg_class.h
*** src/include/catalog/pg_class.h	22 Jan 2007 01:35:22 -0000	1.100
--- src/include/catalog/pg_class.h	9 May 2007 00:38:24 -0000
***************
*** 132,138 ****
   */
  
  /* Note: "3" in the relfrozenxid column stands for FirstNormalTransactionId */
! DATA(insert OID = 1247 (  pg_type		PGNSP 71 PGUID 0 1247 0 0 0 0 0 f f r 25 0 0 0 0 0 t f f f 3   _null_ _null_ ));
  DESCR("");
  DATA(insert OID = 1249 (  pg_attribute	PGNSP 75 PGUID 0 1249 0 0 0 0 0 f f r 17 0 0 0 0 0 f f f f 3 _null_ _null_ ));
  DESCR("");
--- 132,138 ----
   */
  
  /* Note: "3" in the relfrozenxid column stands for FirstNormalTransactionId */
! DATA(insert OID = 1247 (  pg_type		PGNSP 71 PGUID 0 1247 0 0 0 0 0 f f r 26 0 0 0 0 0 t f f f 3   _null_ _null_ ));
  DESCR("");
  DATA(insert OID = 1249 (  pg_attribute	PGNSP 75 PGUID 0 1249 0 0 0 0 0 f f r 17 0 0 0 0 0 f f f f 3 _null_ _null_ ));
  DESCR("");
Index: src/include/catalog/pg_type.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/catalog/pg_type.h,v
retrieving revision 1.182
diff -c -r1.182 pg_type.h
*** src/include/catalog/pg_type.h	6 Apr 2007 04:21:43 -0000	1.182
--- src/include/catalog/pg_type.h	9 May 2007 00:38:24 -0000
***************
*** 97,102 ****
--- 97,105 ----
  	 */
  	Oid			typelem;
  
+ 	/* Oid of array type, or 0 if it does not exist */
+ 	Oid         typarray;
+ 
  	/*
  	 * I/O conversion procedures for the datatype.
  	 */
***************
*** 214,220 ****
   *		compiler constants for pg_type
   * ----------------
   */
! #define Natts_pg_type					25
  #define Anum_pg_type_typname			1
  #define Anum_pg_type_typnamespace		2
  #define Anum_pg_type_typowner			3
--- 217,223 ----
   *		compiler constants for pg_type
   * ----------------
   */
! #define Natts_pg_type					26
  #define Anum_pg_type_typname			1
  #define Anum_pg_type_typnamespace		2
  #define Anum_pg_type_typowner			3
***************
*** 225,245 ****
  #define Anum_pg_type_typdelim			8
  #define Anum_pg_type_typrelid			9
  #define Anum_pg_type_typelem			10
! #define Anum_pg_type_typinput			11
! #define Anum_pg_type_typoutput			12
! #define Anum_pg_type_typreceive			13
! #define Anum_pg_type_typsend			14
! #define Anum_pg_type_typmodin			15
! #define Anum_pg_type_typmodout			16
! #define Anum_pg_type_typanalyze			17
! #define Anum_pg_type_typalign			18
! #define Anum_pg_type_typstorage			19
! #define Anum_pg_type_typnotnull			20
! #define Anum_pg_type_typbasetype		21
! #define Anum_pg_type_typtypmod			22
! #define Anum_pg_type_typndims			23
! #define Anum_pg_type_typdefaultbin		24
! #define Anum_pg_type_typdefault			25
  
  
  /* ----------------
--- 228,249 ----
  #define Anum_pg_type_typdelim			8
  #define Anum_pg_type_typrelid			9
  #define Anum_pg_type_typelem			10
! #define Anum_pg_type_typarray			11
! #define Anum_pg_type_typinput			12
! #define Anum_pg_type_typoutput			13
! #define Anum_pg_type_typreceive			14
! #define Anum_pg_type_typsend			15
! #define Anum_pg_type_typmodin			16
! #define Anum_pg_type_typmodout			17
! #define Anum_pg_type_typanalyze			18
! #define Anum_pg_type_typalign			19
! #define Anum_pg_type_typstorage			20
! #define Anum_pg_type_typnotnull			21
! #define Anum_pg_type_typbasetype		22
! #define Anum_pg_type_typtypmod			23
! #define Anum_pg_type_typndims			24
! #define Anum_pg_type_typdefaultbin		25
! #define Anum_pg_type_typdefault			26
  
  
  /* ----------------
***************
*** 255,340 ****
  */
  
  /* OIDS 1 - 99 */
! DATA(insert OID = 16 (	bool	   PGNSP PGUID	1 t b t \054 0	 0 boolin boolout boolrecv boolsend - - - c p f 0 -1 0 _null_ _null_ ));
  DESCR("boolean, 'true'/'false'");
  #define BOOLOID			16
  
! DATA(insert OID = 17 (	bytea	   PGNSP PGUID -1 f b t \054 0	0 byteain byteaout bytearecv byteasend - - - i x f 0 -1 0 _null_ _null_ ));
  DESCR("variable-length string, binary values escaped");
  #define BYTEAOID		17
  
! DATA(insert OID = 18 (	char	   PGNSP PGUID	1 t b t \054 0	 0 charin charout charrecv charsend - - - c p f 0 -1 0 _null_ _null_ ));
  DESCR("single character");
  #define CHAROID			18
  
! DATA(insert OID = 19 (	name	   PGNSP PGUID NAMEDATALEN f b t \054 0 18 namein nameout namerecv namesend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("63-character type for storing system identifiers");
  #define NAMEOID			19
  
! DATA(insert OID = 20 (	int8	   PGNSP PGUID	8 f b t \054 0	 0 int8in int8out int8recv int8send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("~18 digit integer, 8-byte storage");
  #define INT8OID			20
  
! DATA(insert OID = 21 (	int2	   PGNSP PGUID	2 t b t \054 0	 0 int2in int2out int2recv int2send - - - s p f 0 -1 0 _null_ _null_ ));
  DESCR("-32 thousand to 32 thousand, 2-byte storage");
  #define INT2OID			21
  
! DATA(insert OID = 22 (	int2vector PGNSP PGUID -1 f b t \054 0	21 int2vectorin int2vectorout int2vectorrecv int2vectorsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("array of int2, used in system tables");
  #define INT2VECTOROID	22
  
! DATA(insert OID = 23 (	int4	   PGNSP PGUID	4 t b t \054 0	 0 int4in int4out int4recv int4send - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("-2 billion to 2 billion integer, 4-byte storage");
  #define INT4OID			23
  
! DATA(insert OID = 24 (	regproc    PGNSP PGUID	4 t b t \054 0	 0 regprocin regprocout regprocrecv regprocsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("registered procedure");
  #define REGPROCOID		24
  
! DATA(insert OID = 25 (	text	   PGNSP PGUID -1 f b t \054 0	0 textin textout textrecv textsend - - - i x f 0 -1 0 _null_ _null_ ));
  DESCR("variable-length string, no limit specified");
  #define TEXTOID			25
  
! DATA(insert OID = 26 (	oid		   PGNSP PGUID	4 t b t \054 0	 0 oidin oidout oidrecv oidsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("object identifier(oid), maximum 4 billion");
  #define OIDOID			26
  
! DATA(insert OID = 27 (	tid		   PGNSP PGUID	6 f b t \054 0	 0 tidin tidout tidrecv tidsend - - - s p f 0 -1 0 _null_ _null_ ));
  DESCR("(Block, offset), physical location of tuple");
  #define TIDOID		27
  
! DATA(insert OID = 28 (	xid		   PGNSP PGUID	4 t b t \054 0	 0 xidin xidout xidrecv xidsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("transaction id");
  #define XIDOID 28
  
! DATA(insert OID = 29 (	cid		   PGNSP PGUID	4 t b t \054 0	 0 cidin cidout cidrecv cidsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("command identifier type, sequence in transaction id");
  #define CIDOID 29
  
! DATA(insert OID = 30 (	oidvector  PGNSP PGUID -1 f b t \054 0	26 oidvectorin oidvectorout oidvectorrecv oidvectorsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("array of oids, used in system tables");
  #define OIDVECTOROID	30
  
  /* hand-built rowtype entries for bootstrapped catalogs: */
  
! DATA(insert OID = 71 (	pg_type			PGNSP PGUID -1 f c t \054 1247 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 _null_ _null_ ));
  #define PG_TYPE_RELTYPE_OID 71
! DATA(insert OID = 75 (	pg_attribute	PGNSP PGUID -1 f c t \054 1249 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 _null_ _null_ ));
  #define PG_ATTRIBUTE_RELTYPE_OID 75
! DATA(insert OID = 81 (	pg_proc			PGNSP PGUID -1 f c t \054 1255 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 _null_ _null_ ));
  #define PG_PROC_RELTYPE_OID 81
! DATA(insert OID = 83 (	pg_class		PGNSP PGUID -1 f c t \054 1259 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 _null_ _null_ ));
  #define PG_CLASS_RELTYPE_OID 83
  
  /* OIDS 100 - 199 */
! DATA(insert OID = 142 ( xml		   PGNSP PGUID -1 f b t \054 0 0 xml_in xml_out xml_recv xml_send - - - i x f 0 -1 0 _null_ _null_ ));
  DESCR("XML content");
  #define XMLOID 142
! DATA(insert OID = 143 ( _xml	   PGNSP PGUID -1 f b t \054 0 142 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
  
  /* OIDS 200 - 299 */
  
! DATA(insert OID = 210 (  smgr	   PGNSP PGUID 2 t b t \054 0 0 smgrin smgrout - - - - - s p f 0 -1 0 _null_ _null_ ));
  DESCR("storage manager");
  
  /* OIDS 300 - 399 */
--- 259,344 ----
  */
  
  /* OIDS 1 - 99 */
! DATA(insert OID = 16 (	bool	   PGNSP PGUID	1 t b t \054 0	 0 1000 boolin boolout boolrecv boolsend - - - c p f 0 -1 0 _null_ _null_ ));
  DESCR("boolean, 'true'/'false'");
  #define BOOLOID			16
  
! DATA(insert OID = 17 (	bytea	   PGNSP PGUID -1 f b t \054 0	0 1001 byteain byteaout bytearecv byteasend - - - i x f 0 -1 0 _null_ _null_ ));
  DESCR("variable-length string, binary values escaped");
  #define BYTEAOID		17
  
! DATA(insert OID = 18 (	char	   PGNSP PGUID	1 t b t \054 0	 0 1002 charin charout charrecv charsend - - - c p f 0 -1 0 _null_ _null_ ));
  DESCR("single character");
  #define CHAROID			18
  
! DATA(insert OID = 19 (	name	   PGNSP PGUID NAMEDATALEN f b t \054 0 18 1003 namein nameout namerecv namesend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("63-character type for storing system identifiers");
  #define NAMEOID			19
  
! DATA(insert OID = 20 (	int8	   PGNSP PGUID	8 f b t \054 0	 0 1016 int8in int8out int8recv int8send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("~18 digit integer, 8-byte storage");
  #define INT8OID			20
  
! DATA(insert OID = 21 (	int2	   PGNSP PGUID	2 t b t \054 0	 0 1005 int2in int2out int2recv int2send - - - s p f 0 -1 0 _null_ _null_ ));
  DESCR("-32 thousand to 32 thousand, 2-byte storage");
  #define INT2OID			21
  
! DATA(insert OID = 22 (	int2vector PGNSP PGUID -1 f b t \054 0	21 1006 int2vectorin int2vectorout int2vectorrecv int2vectorsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("array of int2, used in system tables");
  #define INT2VECTOROID	22
  
! DATA(insert OID = 23 (	int4	   PGNSP PGUID	4 t b t \054 0	 0 1007 int4in int4out int4recv int4send - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("-2 billion to 2 billion integer, 4-byte storage");
  #define INT4OID			23
  
! DATA(insert OID = 24 (	regproc    PGNSP PGUID	4 t b t \054 0	 0 1008 regprocin regprocout regprocrecv regprocsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("registered procedure");
  #define REGPROCOID		24
  
! DATA(insert OID = 25 (	text	   PGNSP PGUID -1 f b t \054 0	0 1009 textin textout textrecv textsend - - - i x f 0 -1 0 _null_ _null_ ));
  DESCR("variable-length string, no limit specified");
  #define TEXTOID			25
  
! DATA(insert OID = 26 (	oid		   PGNSP PGUID	4 t b t \054 0	 0 1028 oidin oidout oidrecv oidsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("object identifier(oid), maximum 4 billion");
  #define OIDOID			26
  
! DATA(insert OID = 27 (	tid		   PGNSP PGUID	6 f b t \054 0	 0 1010 tidin tidout tidrecv tidsend - - - s p f 0 -1 0 _null_ _null_ ));
  DESCR("(Block, offset), physical location of tuple");
  #define TIDOID		27
  
! DATA(insert OID = 28 (	xid		   PGNSP PGUID	4 t b t \054 0	 0 1011 xidin xidout xidrecv xidsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("transaction id");
  #define XIDOID 28
  
! DATA(insert OID = 29 (	cid		   PGNSP PGUID	4 t b t \054 0	 0 1012 cidin cidout cidrecv cidsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("command identifier type, sequence in transaction id");
  #define CIDOID 29
  
! DATA(insert OID = 30 (	oidvector  PGNSP PGUID -1 f b t \054 0	26 1013 oidvectorin oidvectorout oidvectorrecv oidvectorsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("array of oids, used in system tables");
  #define OIDVECTOROID	30
  
  /* hand-built rowtype entries for bootstrapped catalogs: */
  
! DATA(insert OID = 71 (	pg_type			PGNSP PGUID -1 f c t \054 1247 0 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 _null_ _null_ ));
  #define PG_TYPE_RELTYPE_OID 71
! DATA(insert OID = 75 (	pg_attribute	PGNSP PGUID -1 f c t \054 1249 0 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 _null_ _null_ ));
  #define PG_ATTRIBUTE_RELTYPE_OID 75
! DATA(insert OID = 81 (	pg_proc			PGNSP PGUID -1 f c t \054 1255 0 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 _null_ _null_ ));
  #define PG_PROC_RELTYPE_OID 81
! DATA(insert OID = 83 (	pg_class		PGNSP PGUID -1 f c t \054 1259 0 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 _null_ _null_ ));
  #define PG_CLASS_RELTYPE_OID 83
  
  /* OIDS 100 - 199 */
! DATA(insert OID = 142 ( xml		   PGNSP PGUID -1 f b t \054 0 0 143 xml_in xml_out xml_recv xml_send - - - i x f 0 -1 0 _null_ _null_ ));
  DESCR("XML content");
  #define XMLOID 142
! DATA(insert OID = 143 ( _xml	   PGNSP PGUID -1 f b t \054 0 142 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
  
  /* OIDS 200 - 299 */
  
! DATA(insert OID = 210 (  smgr	   PGNSP PGUID 2 t b t \054 0 0 0 smgrin smgrout - - - - - s p f 0 -1 0 _null_ _null_ ));
  DESCR("storage manager");
  
  /* OIDS 300 - 399 */
***************
*** 344,543 ****
  /* OIDS 500 - 599 */
  
  /* OIDS 600 - 699 */
! DATA(insert OID = 600 (  point	   PGNSP PGUID 16 f b t \054 0 701 point_in point_out point_recv point_send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("geometric point '(x, y)'");
  #define POINTOID		600
! DATA(insert OID = 601 (  lseg	   PGNSP PGUID 32 f b t \054 0 600 lseg_in lseg_out lseg_recv lseg_send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("geometric line segment '(pt1,pt2)'");
  #define LSEGOID			601
! DATA(insert OID = 602 (  path	   PGNSP PGUID -1 f b t \054 0 0 path_in path_out path_recv path_send - - - d x f 0 -1 0 _null_ _null_ ));
  DESCR("geometric path '(pt1,...)'");
  #define PATHOID			602
! DATA(insert OID = 603 (  box	   PGNSP PGUID 32 f b t \073 0 600 box_in box_out box_recv box_send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("geometric box '(lower left,upper right)'");
  #define BOXOID			603
! DATA(insert OID = 604 (  polygon   PGNSP PGUID -1 f b t \054 0	 0 poly_in poly_out poly_recv poly_send - - - d x f 0 -1 0 _null_ _null_ ));
  DESCR("geometric polygon '(pt1,...)'");
  #define POLYGONOID		604
  
! DATA(insert OID = 628 (  line	   PGNSP PGUID 32 f b t \054 0 701 line_in line_out line_recv line_send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("geometric line (not implemented)'");
  #define LINEOID			628
! DATA(insert OID = 629 (  _line	   PGNSP PGUID	-1 f b t \054 0 628 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
  DESCR("");
  
  /* OIDS 700 - 799 */
  
! DATA(insert OID = 700 (  float4    PGNSP PGUID	4 f b t \054 0	 0 float4in float4out float4recv float4send - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("single-precision floating point number, 4-byte storage");
  #define FLOAT4OID 700
! DATA(insert OID = 701 (  float8    PGNSP PGUID	8 f b t \054 0	 0 float8in float8out float8recv float8send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("double-precision floating point number, 8-byte storage");
  #define FLOAT8OID 701
! DATA(insert OID = 702 (  abstime   PGNSP PGUID	4 t b t \054 0	 0 abstimein abstimeout abstimerecv abstimesend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("absolute, limited-range date and time (Unix system time)");
  #define ABSTIMEOID		702
! DATA(insert OID = 703 (  reltime   PGNSP PGUID	4 t b t \054 0	 0 reltimein reltimeout reltimerecv reltimesend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("relative, limited-range time interval (Unix delta time)");
  #define RELTIMEOID		703
! DATA(insert OID = 704 (  tinterval PGNSP PGUID 12 f b t \054 0	 0 tintervalin tintervalout tintervalrecv tintervalsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("(abstime,abstime), time interval");
  #define TINTERVALOID	704
! DATA(insert OID = 705 (  unknown   PGNSP PGUID -2 f b t \054 0	 0 unknownin unknownout unknownrecv unknownsend - - - c p f 0 -1 0 _null_ _null_ ));
  DESCR("");
  #define UNKNOWNOID		705
  
! DATA(insert OID = 718 (  circle    PGNSP PGUID	24 f b t \054 0 0 circle_in circle_out circle_recv circle_send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("geometric circle '(center,radius)'");
  #define CIRCLEOID		718
! DATA(insert OID = 719 (  _circle   PGNSP PGUID	-1 f b t \054 0  718 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 790 (  money	   PGNSP PGUID	 8 f b t \054 0 0 cash_in cash_out cash_recv cash_send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("monetary amounts, $d,ddd.cc");
  #define CASHOID 790
! DATA(insert OID = 791 (  _money    PGNSP PGUID	-1 f b t \054 0  790 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
  
  /* OIDS 800 - 899 */
! DATA(insert OID = 829 ( macaddr    PGNSP PGUID	6 f b t \054 0 0 macaddr_in macaddr_out macaddr_recv macaddr_send - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("XX:XX:XX:XX:XX:XX, MAC address");
  #define MACADDROID 829
! DATA(insert OID = 869 ( inet	   PGNSP PGUID	-1 f b t \054 0 0 inet_in inet_out inet_recv inet_send - - - i m f 0 -1 0 _null_ _null_ ));
  DESCR("IP address/netmask, host address, netmask optional");
  #define INETOID 869
! DATA(insert OID = 650 ( cidr	   PGNSP PGUID	-1 f b t \054 0 0 cidr_in cidr_out cidr_recv cidr_send - - - i m f 0 -1 0 _null_ _null_ ));
  DESCR("network IP address/netmask, network address");
  #define CIDROID 650
  
  /* OIDS 900 - 999 */
  
  /* OIDS 1000 - 1099 */
! DATA(insert OID = 1000 (  _bool		 PGNSP PGUID -1 f b t \054 0	16 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1001 (  _bytea	 PGNSP PGUID -1 f b t \054 0	17 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1002 (  _char		 PGNSP PGUID -1 f b t \054 0	18 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1003 (  _name		 PGNSP PGUID -1 f b t \054 0	19 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1005 (  _int2		 PGNSP PGUID -1 f b t \054 0	21 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1006 (  _int2vector PGNSP PGUID -1 f b t \054 0	22 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1007 (  _int4		 PGNSP PGUID -1 f b t \054 0	23 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
  #define INT4ARRAYOID		1007
! DATA(insert OID = 1008 (  _regproc	 PGNSP PGUID -1 f b t \054 0	24 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1009 (  _text		 PGNSP PGUID -1 f b t \054 0	25 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1028 (  _oid		 PGNSP PGUID -1 f b t \054 0	26 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1010 (  _tid		 PGNSP PGUID -1 f b t \054 0	27 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1011 (  _xid		 PGNSP PGUID -1 f b t \054 0	28 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1012 (  _cid		 PGNSP PGUID -1 f b t \054 0	29 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1013 (  _oidvector PGNSP PGUID -1 f b t \054 0	30 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1014 (  _bpchar	 PGNSP PGUID -1 f b t \054 0 1042 array_in array_out array_recv array_send bpchartypmodin bpchartypmodout - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1015 (  _varchar	 PGNSP PGUID -1 f b t \054 0 1043 array_in array_out array_recv array_send varchartypmodin varchartypmodout - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1016 (  _int8		 PGNSP PGUID -1 f b t \054 0	20 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1017 (  _point	 PGNSP PGUID -1 f b t \054 0 600 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1018 (  _lseg		 PGNSP PGUID -1 f b t \054 0 601 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1019 (  _path		 PGNSP PGUID -1 f b t \054 0 602 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1020 (  _box		 PGNSP PGUID -1 f b t \073 0 603 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1021 (  _float4	 PGNSP PGUID -1 f b t \054 0 700 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
  #define FLOAT4ARRAYOID 1021
! DATA(insert OID = 1022 (  _float8	 PGNSP PGUID -1 f b t \054 0 701 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1023 (  _abstime	 PGNSP PGUID -1 f b t \054 0 702 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1024 (  _reltime	 PGNSP PGUID -1 f b t \054 0 703 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1025 (  _tinterval PGNSP PGUID -1 f b t \054 0 704 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1027 (  _polygon	 PGNSP PGUID -1 f b t \054 0 604 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1033 (  aclitem	 PGNSP PGUID 12 f b t \054 0 0 aclitemin aclitemout - - - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("access control list");
  #define ACLITEMOID		1033
! DATA(insert OID = 1034 (  _aclitem	 PGNSP PGUID -1 f b t \054 0 1033 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1040 (  _macaddr	 PGNSP PGUID -1 f b t \054 0  829 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1041 (  _inet    PGNSP PGUID -1 f b t \054 0	869 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 651  (  _cidr    PGNSP PGUID -1 f b t \054 0	650 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1042 ( bpchar		 PGNSP PGUID -1 f b t \054 0	0 bpcharin bpcharout bpcharrecv bpcharsend bpchartypmodin bpchartypmodout - i x f 0 -1 0 _null_ _null_ ));
  DESCR("char(length), blank-padded string, fixed storage length");
  #define BPCHAROID		1042
! DATA(insert OID = 1043 ( varchar	 PGNSP PGUID -1 f b t \054 0	0 varcharin varcharout varcharrecv varcharsend varchartypmodin varchartypmodout - i x f 0 -1 0 _null_ _null_ ));
  DESCR("varchar(length), non-blank-padded string, variable storage length");
  #define VARCHAROID		1043
  
! DATA(insert OID = 1082 ( date		 PGNSP PGUID	4 t b t \054 0	0 date_in date_out date_recv date_send - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("ANSI SQL date");
  #define DATEOID			1082
! DATA(insert OID = 1083 ( time		 PGNSP PGUID	8 f b t \054 0	0 time_in time_out time_recv time_send timetypmodin timetypmodout - d p f 0 -1 0 _null_ _null_ ));
  DESCR("hh:mm:ss, ANSI SQL time");
  #define TIMEOID			1083
  
  /* OIDS 1100 - 1199 */
! DATA(insert OID = 1114 ( timestamp	 PGNSP PGUID	8 f b t \054 0	0 timestamp_in timestamp_out timestamp_recv timestamp_send timestamptypmodin timestamptypmodout - d p f 0 -1 0 _null_ _null_ ));
  DESCR("date and time");
  #define TIMESTAMPOID	1114
! DATA(insert OID = 1115 ( _timestamp  PGNSP PGUID	-1 f b t \054 0 1114 array_in array_out array_recv array_send timestamptypmodin timestamptypmodout - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1182 ( _date		 PGNSP PGUID	-1 f b t \054 0 1082 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1183 ( _time		 PGNSP PGUID	-1 f b t \054 0 1083 array_in array_out array_recv array_send timetypmodin timetypmodout - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1184 ( timestamptz PGNSP PGUID	8 f b t \054 0	0 timestamptz_in timestamptz_out timestamptz_recv timestamptz_send timestamptztypmodin timestamptztypmodout - d p f 0 -1 0 _null_ _null_ ));
  DESCR("date and time with time zone");
  #define TIMESTAMPTZOID	1184
! DATA(insert OID = 1185 ( _timestamptz PGNSP PGUID -1 f b t \054 0	1184 array_in array_out array_recv array_send timestamptztypmodin timestamptztypmodout - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1186 ( interval	 PGNSP PGUID 16 f b t \054 0	0 interval_in interval_out interval_recv interval_send intervaltypmodin intervaltypmodout - d p f 0 -1 0 _null_ _null_ ));
  DESCR("@ <number> <units>, time interval");
  #define INTERVALOID		1186
! DATA(insert OID = 1187 ( _interval	 PGNSP PGUID	-1 f b t \054 0 1186 array_in array_out array_recv array_send intervaltypmodin intervaltypmodout - d x f 0 -1 0 _null_ _null_ ));
  
  /* OIDS 1200 - 1299 */
! DATA(insert OID = 1231 (  _numeric	 PGNSP PGUID -1 f b t \054 0	1700 array_in array_out array_recv array_send numerictypmodin numerictypmodout - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1266 ( timetz		 PGNSP PGUID 12 f b t \054 0	0 timetz_in timetz_out timetz_recv timetz_send timetztypmodin timetztypmodout - d p f 0 -1 0 _null_ _null_ ));
  DESCR("hh:mm:ss, ANSI SQL time");
  #define TIMETZOID		1266
! DATA(insert OID = 1270 ( _timetz	 PGNSP PGUID -1 f b t \054 0	1266 array_in array_out array_recv array_send timetztypmodin timetztypmodout - d x f 0 -1 0 _null_ _null_ ));
  
  /* OIDS 1500 - 1599 */
! DATA(insert OID = 1560 ( bit		 PGNSP PGUID -1 f b t \054 0	0 bit_in bit_out bit_recv bit_send bittypmodin bittypmodout - i x f 0 -1 0 _null_ _null_ ));
  DESCR("fixed-length bit string");
  #define BITOID	 1560
! DATA(insert OID = 1561 ( _bit		 PGNSP PGUID -1 f b t \054 0	1560 array_in array_out array_recv array_send bittypmodin bittypmodout - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1562 ( varbit		 PGNSP PGUID -1 f b t \054 0	0 varbit_in varbit_out varbit_recv varbit_send varbittypmodin varbittypmodout - i x f 0 -1 0 _null_ _null_ ));
  DESCR("variable-length bit string");
  #define VARBITOID	  1562
! DATA(insert OID = 1563 ( _varbit	 PGNSP PGUID -1 f b t \054 0	1562 array_in array_out array_recv array_send varbittypmodin varbittypmodout - i x f 0 -1 0 _null_ _null_ ));
  
  /* OIDS 1600 - 1699 */
  
  /* OIDS 1700 - 1799 */
! DATA(insert OID = 1700 ( numeric	   PGNSP PGUID -1 f b t \054 0	0 numeric_in numeric_out numeric_recv numeric_send numerictypmodin numerictypmodout - i m f 0 -1 0 _null_ _null_ ));
  DESCR("numeric(precision, decimal), arbitrary precision number");
  #define NUMERICOID		1700
  
! DATA(insert OID = 1790 ( refcursor	   PGNSP PGUID -1 f b t \054 0	0 textin textout textrecv textsend - - - i x f 0 -1 0 _null_ _null_ ));
  DESCR("reference cursor (portal name)");
  #define REFCURSOROID	1790
  
  /* OIDS 2200 - 2299 */
! DATA(insert OID = 2201 ( _refcursor    PGNSP PGUID -1 f b t \054 0 1790 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
  
! DATA(insert OID = 2202 ( regprocedure  PGNSP PGUID	4 t b t \054 0	 0 regprocedurein regprocedureout regprocedurerecv regproceduresend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("registered procedure (with args)");
  #define REGPROCEDUREOID 2202
  
! DATA(insert OID = 2203 ( regoper	   PGNSP PGUID	4 t b t \054 0	 0 regoperin regoperout regoperrecv regopersend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("registered operator");
  #define REGOPEROID		2203
  
! DATA(insert OID = 2204 ( regoperator   PGNSP PGUID	4 t b t \054 0	 0 regoperatorin regoperatorout regoperatorrecv regoperatorsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("registered operator (with args)");
  #define REGOPERATOROID	2204
  
! DATA(insert OID = 2205 ( regclass	   PGNSP PGUID	4 t b t \054 0	 0 regclassin regclassout regclassrecv regclasssend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("registered class");
  #define REGCLASSOID		2205
  
! DATA(insert OID = 2206 ( regtype	   PGNSP PGUID	4 t b t \054 0	 0 regtypein regtypeout regtyperecv regtypesend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("registered type");
  #define REGTYPEOID		2206
  
! DATA(insert OID = 2207 ( _regprocedure PGNSP PGUID -1 f b t \054 0 2202 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 2208 ( _regoper	   PGNSP PGUID -1 f b t \054 0 2203 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 2209 ( _regoperator  PGNSP PGUID -1 f b t \054 0 2204 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 2210 ( _regclass	   PGNSP PGUID -1 f b t \054 0 2205 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 2211 ( _regtype	   PGNSP PGUID -1 f b t \054 0 2206 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
  #define REGTYPEARRAYOID 2211
  
  /* uuid */ 
! DATA(insert OID = 2950 ( uuid			PGNSP PGUID 16 f b t \054 0 0 uuid_in uuid_out uuid_recv uuid_send - - - c p f 0 -1 0 _null_ _null_ ));
  DESCR("UUID datatype");
! DATA(insert OID = 2951 ( _uuid			PGNSP PGUID -1 f b t \054 0 2950 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
  
  /*
   * pseudo-types
--- 348,547 ----
  /* OIDS 500 - 599 */
  
  /* OIDS 600 - 699 */
! DATA(insert OID = 600 (  point	   PGNSP PGUID 16 f b t \054 0 701 1017 point_in point_out point_recv point_send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("geometric point '(x, y)'");
  #define POINTOID		600
! DATA(insert OID = 601 (  lseg	   PGNSP PGUID 32 f b t \054 0 600 1018 lseg_in lseg_out lseg_recv lseg_send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("geometric line segment '(pt1,pt2)'");
  #define LSEGOID			601
! DATA(insert OID = 602 (  path	   PGNSP PGUID -1 f b t \054 0 0 1019 path_in path_out path_recv path_send - - - d x f 0 -1 0 _null_ _null_ ));
  DESCR("geometric path '(pt1,...)'");
  #define PATHOID			602
! DATA(insert OID = 603 (  box	   PGNSP PGUID 32 f b t \073 0 600 1020 box_in box_out box_recv box_send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("geometric box '(lower left,upper right)'");
  #define BOXOID			603
! DATA(insert OID = 604 (  polygon   PGNSP PGUID -1 f b t \054 0	 0 1027 poly_in poly_out poly_recv poly_send - - - d x f 0 -1 0 _null_ _null_ ));
  DESCR("geometric polygon '(pt1,...)'");
  #define POLYGONOID		604
  
! DATA(insert OID = 628 (  line	   PGNSP PGUID 32 f b t \054 0 701 629 line_in line_out line_recv line_send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("geometric line (not implemented)'");
  #define LINEOID			628
! DATA(insert OID = 629 (  _line	   PGNSP PGUID	-1 f b t \054 0 628 0 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
  DESCR("");
  
  /* OIDS 700 - 799 */
  
! DATA(insert OID = 700 (  float4    PGNSP PGUID	4 f b t \054 0	 0 1021 float4in float4out float4recv float4send - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("single-precision floating point number, 4-byte storage");
  #define FLOAT4OID 700
! DATA(insert OID = 701 (  float8    PGNSP PGUID	8 f b t \054 0	 0 1022 float8in float8out float8recv float8send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("double-precision floating point number, 8-byte storage");
  #define FLOAT8OID 701
! DATA(insert OID = 702 (  abstime   PGNSP PGUID	4 t b t \054 0	 0 1023 abstimein abstimeout abstimerecv abstimesend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("absolute, limited-range date and time (Unix system time)");
  #define ABSTIMEOID		702
! DATA(insert OID = 703 (  reltime   PGNSP PGUID	4 t b t \054 0	 0 1024 reltimein reltimeout reltimerecv reltimesend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("relative, limited-range time interval (Unix delta time)");
  #define RELTIMEOID		703
! DATA(insert OID = 704 (  tinterval PGNSP PGUID 12 f b t \054 0	 0 1025 tintervalin tintervalout tintervalrecv tintervalsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("(abstime,abstime), time interval");
  #define TINTERVALOID	704
! DATA(insert OID = 705 (  unknown   PGNSP PGUID -2 f b t \054 0	 0 0 unknownin unknownout unknownrecv unknownsend - - - c p f 0 -1 0 _null_ _null_ ));
  DESCR("");
  #define UNKNOWNOID		705
  
! DATA(insert OID = 718 (  circle    PGNSP PGUID	24 f b t \054 0 0 719 circle_in circle_out circle_recv circle_send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("geometric circle '(center,radius)'");
  #define CIRCLEOID		718
! DATA(insert OID = 719 (  _circle   PGNSP PGUID	-1 f b t \054 0  718 0 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 790 (  money	   PGNSP PGUID	 8 f b t \054 0 0 791 cash_in cash_out cash_recv cash_send - - - d p f 0 -1 0 _null_ _null_ ));
  DESCR("monetary amounts, $d,ddd.cc");
  #define CASHOID 790
! DATA(insert OID = 791 (  _money    PGNSP PGUID	-1 f b t \054 0  790 0 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
  
  /* OIDS 800 - 899 */
! DATA(insert OID = 829 ( macaddr    PGNSP PGUID	6 f b t \054 0 0 1040 macaddr_in macaddr_out macaddr_recv macaddr_send - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("XX:XX:XX:XX:XX:XX, MAC address");
  #define MACADDROID 829
! DATA(insert OID = 869 ( inet	   PGNSP PGUID	-1 f b t \054 0 0 1041 inet_in inet_out inet_recv inet_send - - - i m f 0 -1 0 _null_ _null_ ));
  DESCR("IP address/netmask, host address, netmask optional");
  #define INETOID 869
! DATA(insert OID = 650 ( cidr	   PGNSP PGUID	-1 f b t \054 0 0 651 cidr_in cidr_out cidr_recv cidr_send - - - i m f 0 -1 0 _null_ _null_ ));
  DESCR("network IP address/netmask, network address");
  #define CIDROID 650
  
  /* OIDS 900 - 999 */
  
  /* OIDS 1000 - 1099 */
! DATA(insert OID = 1000 (  _bool		 PGNSP PGUID -1 f b t \054 0	16 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1001 (  _bytea	 PGNSP PGUID -1 f b t \054 0	17 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1002 (  _char		 PGNSP PGUID -1 f b t \054 0	18 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1003 (  _name		 PGNSP PGUID -1 f b t \054 0	19 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1005 (  _int2		 PGNSP PGUID -1 f b t \054 0	21 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1006 (  _int2vector PGNSP PGUID -1 f b t \054 0	22 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1007 (  _int4		 PGNSP PGUID -1 f b t \054 0	23 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
  #define INT4ARRAYOID		1007
! DATA(insert OID = 1008 (  _regproc	 PGNSP PGUID -1 f b t \054 0	24 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1009 (  _text		 PGNSP PGUID -1 f b t \054 0	25 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1028 (  _oid		 PGNSP PGUID -1 f b t \054 0	26 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1010 (  _tid		 PGNSP PGUID -1 f b t \054 0	27 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1011 (  _xid		 PGNSP PGUID -1 f b t \054 0	28 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1012 (  _cid		 PGNSP PGUID -1 f b t \054 0	29 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1013 (  _oidvector PGNSP PGUID -1 f b t \054 0	30 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1014 (  _bpchar	 PGNSP PGUID -1 f b t \054 0 1042 0 array_in array_out array_recv array_send bpchartypmodin bpchartypmodout - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1015 (  _varchar	 PGNSP PGUID -1 f b t \054 0 1043 0 array_in array_out array_recv array_send varchartypmodin varchartypmodout - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1016 (  _int8		 PGNSP PGUID -1 f b t \054 0	20 0 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1017 (  _point	 PGNSP PGUID -1 f b t \054 0 600 0 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1018 (  _lseg		 PGNSP PGUID -1 f b t \054 0 601 0 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1019 (  _path		 PGNSP PGUID -1 f b t \054 0 602 0 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1020 (  _box		 PGNSP PGUID -1 f b t \073 0 603 0 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1021 (  _float4	 PGNSP PGUID -1 f b t \054 0 700 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
  #define FLOAT4ARRAYOID 1021
! DATA(insert OID = 1022 (  _float8	 PGNSP PGUID -1 f b t \054 0 701 0 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1023 (  _abstime	 PGNSP PGUID -1 f b t \054 0 702 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1024 (  _reltime	 PGNSP PGUID -1 f b t \054 0 703 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1025 (  _tinterval PGNSP PGUID -1 f b t \054 0 704 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1027 (  _polygon	 PGNSP PGUID -1 f b t \054 0 604 0 array_in array_out array_recv array_send - - - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1033 (  aclitem	 PGNSP PGUID 12 f b t \054 0 0 1034 aclitemin aclitemout - - - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("access control list");
  #define ACLITEMOID		1033
! DATA(insert OID = 1034 (  _aclitem	 PGNSP PGUID -1 f b t \054 0 1033 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1040 (  _macaddr	 PGNSP PGUID -1 f b t \054 0  829 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1041 (  _inet    PGNSP PGUID -1 f b t \054 0	869 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 651  (  _cidr    PGNSP PGUID -1 f b t \054 0	650 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1042 ( bpchar		 PGNSP PGUID -1 f b t \054 0	0 1014 bpcharin bpcharout bpcharrecv bpcharsend bpchartypmodin bpchartypmodout - i x f 0 -1 0 _null_ _null_ ));
  DESCR("char(length), blank-padded string, fixed storage length");
  #define BPCHAROID		1042
! DATA(insert OID = 1043 ( varchar	 PGNSP PGUID -1 f b t \054 0	0 1015 varcharin varcharout varcharrecv varcharsend varchartypmodin varchartypmodout - i x f 0 -1 0 _null_ _null_ ));
  DESCR("varchar(length), non-blank-padded string, variable storage length");
  #define VARCHAROID		1043
  
! DATA(insert OID = 1082 ( date		 PGNSP PGUID	4 t b t \054 0	0 1182 date_in date_out date_recv date_send - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("ANSI SQL date");
  #define DATEOID			1082
! DATA(insert OID = 1083 ( time		 PGNSP PGUID	8 f b t \054 0	0 1183 time_in time_out time_recv time_send timetypmodin timetypmodout - d p f 0 -1 0 _null_ _null_ ));
  DESCR("hh:mm:ss, ANSI SQL time");
  #define TIMEOID			1083
  
  /* OIDS 1100 - 1199 */
! DATA(insert OID = 1114 ( timestamp	 PGNSP PGUID	8 f b t \054 0	0 1115 timestamp_in timestamp_out timestamp_recv timestamp_send timestamptypmodin timestamptypmodout - d p f 0 -1 0 _null_ _null_ ));
  DESCR("date and time");
  #define TIMESTAMPOID	1114
! DATA(insert OID = 1115 ( _timestamp  PGNSP PGUID	-1 f b t \054 0 1114 0 array_in array_out array_recv array_send timestamptypmodin timestamptypmodout - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1182 ( _date		 PGNSP PGUID	-1 f b t \054 0 1082 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1183 ( _time		 PGNSP PGUID	-1 f b t \054 0 1083 0 array_in array_out array_recv array_send timetypmodin timetypmodout - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1184 ( timestamptz PGNSP PGUID	8 f b t \054 0	0 1185 timestamptz_in timestamptz_out timestamptz_recv timestamptz_send timestamptztypmodin timestamptztypmodout - d p f 0 -1 0 _null_ _null_ ));
  DESCR("date and time with time zone");
  #define TIMESTAMPTZOID	1184
! DATA(insert OID = 1185 ( _timestamptz PGNSP PGUID -1 f b t \054 0	1184 0 array_in array_out array_recv array_send timestamptztypmodin timestamptztypmodout - d x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1186 ( interval	 PGNSP PGUID 16 f b t \054 0	0 1187 interval_in interval_out interval_recv interval_send intervaltypmodin intervaltypmodout - d p f 0 -1 0 _null_ _null_ ));
  DESCR("@ <number> <units>, time interval");
  #define INTERVALOID		1186
! DATA(insert OID = 1187 ( _interval	 PGNSP PGUID	-1 f b t \054 0 1186 0 array_in array_out array_recv array_send intervaltypmodin intervaltypmodout - d x f 0 -1 0 _null_ _null_ ));
  
  /* OIDS 1200 - 1299 */
! DATA(insert OID = 1231 (  _numeric	 PGNSP PGUID -1 f b t \054 0	1700 0 array_in array_out array_recv array_send numerictypmodin numerictypmodout - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1266 ( timetz		 PGNSP PGUID 12 f b t \054 0	0 1270 timetz_in timetz_out timetz_recv timetz_send timetztypmodin timetztypmodout - d p f 0 -1 0 _null_ _null_ ));
  DESCR("hh:mm:ss, ANSI SQL time");
  #define TIMETZOID		1266
! DATA(insert OID = 1270 ( _timetz	 PGNSP PGUID -1 f b t \054 0	1266 0 array_in array_out array_recv array_send timetztypmodin timetztypmodout - d x f 0 -1 0 _null_ _null_ ));
  
  /* OIDS 1500 - 1599 */
! DATA(insert OID = 1560 ( bit		 PGNSP PGUID -1 f b t \054 0	0 1561 bit_in bit_out bit_recv bit_send bittypmodin bittypmodout - i x f 0 -1 0 _null_ _null_ ));
  DESCR("fixed-length bit string");
  #define BITOID	 1560
! DATA(insert OID = 1561 ( _bit		 PGNSP PGUID -1 f b t \054 0	1560 0 array_in array_out array_recv array_send bittypmodin bittypmodout - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1562 ( varbit		 PGNSP PGUID -1 f b t \054 0	0 1563 varbit_in varbit_out varbit_recv varbit_send varbittypmodin varbittypmodout - i x f 0 -1 0 _null_ _null_ ));
  DESCR("variable-length bit string");
  #define VARBITOID	  1562
! DATA(insert OID = 1563 ( _varbit	 PGNSP PGUID -1 f b t \054 0	1562 0 array_in array_out array_recv array_send varbittypmodin varbittypmodout - i x f 0 -1 0 _null_ _null_ ));
  
  /* OIDS 1600 - 1699 */
  
  /* OIDS 1700 - 1799 */
! DATA(insert OID = 1700 ( numeric	   PGNSP PGUID -1 f b t \054 0	0 1231 numeric_in numeric_out numeric_recv numeric_send numerictypmodin numerictypmodout - i m f 0 -1 0 _null_ _null_ ));
  DESCR("numeric(precision, decimal), arbitrary precision number");
  #define NUMERICOID		1700
  
! DATA(insert OID = 1790 ( refcursor	   PGNSP PGUID -1 f b t \054 0	0 2201 textin textout textrecv textsend - - - i x f 0 -1 0 _null_ _null_ ));
  DESCR("reference cursor (portal name)");
  #define REFCURSOROID	1790
  
  /* OIDS 2200 - 2299 */
! DATA(insert OID = 2201 ( _refcursor    PGNSP PGUID -1 f b t \054 0 1790 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
  
! DATA(insert OID = 2202 ( regprocedure  PGNSP PGUID	4 t b t \054 0	 0 2207 regprocedurein regprocedureout regprocedurerecv regproceduresend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("registered procedure (with args)");
  #define REGPROCEDUREOID 2202
  
! DATA(insert OID = 2203 ( regoper	   PGNSP PGUID	4 t b t \054 0	 0 2208 regoperin regoperout regoperrecv regopersend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("registered operator");
  #define REGOPEROID		2203
  
! DATA(insert OID = 2204 ( regoperator   PGNSP PGUID	4 t b t \054 0	 0 2209 regoperatorin regoperatorout regoperatorrecv regoperatorsend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("registered operator (with args)");
  #define REGOPERATOROID	2204
  
! DATA(insert OID = 2205 ( regclass	   PGNSP PGUID	4 t b t \054 0	 0 2210 regclassin regclassout regclassrecv regclasssend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("registered class");
  #define REGCLASSOID		2205
  
! DATA(insert OID = 2206 ( regtype	   PGNSP PGUID	4 t b t \054 0	 0 2211 regtypein regtypeout regtyperecv regtypesend - - - i p f 0 -1 0 _null_ _null_ ));
  DESCR("registered type");
  #define REGTYPEOID		2206
  
! DATA(insert OID = 2207 ( _regprocedure PGNSP PGUID -1 f b t \054 0 2202 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 2208 ( _regoper	   PGNSP PGUID -1 f b t \054 0 2203 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 2209 ( _regoperator  PGNSP PGUID -1 f b t \054 0 2204 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 2210 ( _regclass	   PGNSP PGUID -1 f b t \054 0 2205 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 2211 ( _regtype	   PGNSP PGUID -1 f b t \054 0 2206 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
  #define REGTYPEARRAYOID 2211
  
  /* uuid */ 
! DATA(insert OID = 2950 ( uuid			PGNSP PGUID 16 f b t \054 0 0 2951 uuid_in uuid_out uuid_recv uuid_send - - - c p f 0 -1 0 _null_ _null_ ));
  DESCR("UUID datatype");
! DATA(insert OID = 2951 ( _uuid			PGNSP PGUID -1 f b t \054 0 2950 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
  
  /*
   * pseudo-types
***************
*** 548,574 ****
   * argument and result types (if supported by the function's implementation
   * language).
   */
! DATA(insert OID = 2249 ( record			PGNSP PGUID -1 f p t \054 0 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 _null_ _null_ ));
  #define RECORDOID		2249
! DATA(insert OID = 2275 ( cstring		PGNSP PGUID -2 f p t \054 0 0 cstring_in cstring_out cstring_recv cstring_send - - - c p f 0 -1 0 _null_ _null_ ));
  #define CSTRINGOID		2275
! DATA(insert OID = 2276 ( any			PGNSP PGUID  4 t p t \054 0 0 any_in any_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define ANYOID			2276
! DATA(insert OID = 2277 ( anyarray		PGNSP PGUID -1 f p t \054 0 0 anyarray_in anyarray_out anyarray_recv anyarray_send - - - d x f 0 -1 0 _null_ _null_ ));
  #define ANYARRAYOID		2277
! DATA(insert OID = 2278 ( void			PGNSP PGUID  4 t p t \054 0 0 void_in void_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define VOIDOID			2278
! DATA(insert OID = 2279 ( trigger		PGNSP PGUID  4 t p t \054 0 0 trigger_in trigger_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define TRIGGEROID		2279
! DATA(insert OID = 2280 ( language_handler	PGNSP PGUID  4 t p t \054 0 0 language_handler_in language_handler_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define LANGUAGE_HANDLEROID		2280
! DATA(insert OID = 2281 ( internal		PGNSP PGUID  4 t p t \054 0 0 internal_in internal_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define INTERNALOID		2281
! DATA(insert OID = 2282 ( opaque			PGNSP PGUID  4 t p t \054 0 0 opaque_in opaque_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define OPAQUEOID		2282
! DATA(insert OID = 2283 ( anyelement		PGNSP PGUID  4 t p t \054 0 0 anyelement_in anyelement_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define ANYELEMENTOID	2283
! DATA(insert OID = 3500 ( anyenum		PGNSP PGUID  4 t p t \054 0 0 anyenum_in anyenum_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define ANYENUMOID		3500
  
  
--- 552,578 ----
   * argument and result types (if supported by the function's implementation
   * language).
   */
! DATA(insert OID = 2249 ( record			PGNSP PGUID -1 f p t \054 0 0 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 _null_ _null_ ));
  #define RECORDOID		2249
! DATA(insert OID = 2275 ( cstring		PGNSP PGUID -2 f p t \054 0 0 0 cstring_in cstring_out cstring_recv cstring_send - - - c p f 0 -1 0 _null_ _null_ ));
  #define CSTRINGOID		2275
! DATA(insert OID = 2276 ( any			PGNSP PGUID  4 t p t \054 0 0 0 any_in any_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define ANYOID			2276
! DATA(insert OID = 2277 ( anyarray		PGNSP PGUID -1 f p t \054 0 0 0 anyarray_in anyarray_out anyarray_recv anyarray_send - - - d x f 0 -1 0 _null_ _null_ ));
  #define ANYARRAYOID		2277
! DATA(insert OID = 2278 ( void			PGNSP PGUID  4 t p t \054 0 0 0 void_in void_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define VOIDOID			2278
! DATA(insert OID = 2279 ( trigger		PGNSP PGUID  4 t p t \054 0 0 0 trigger_in trigger_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define TRIGGEROID		2279
! DATA(insert OID = 2280 ( language_handler	PGNSP PGUID  4 t p t \054 0 0 0 language_handler_in language_handler_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define LANGUAGE_HANDLEROID		2280
! DATA(insert OID = 2281 ( internal		PGNSP PGUID  4 t p t \054 0 0 0 internal_in internal_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define INTERNALOID		2281
! DATA(insert OID = 2282 ( opaque			PGNSP PGUID  4 t p t \054 0 0 0 opaque_in opaque_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define OPAQUEOID		2282
! DATA(insert OID = 2283 ( anyelement		PGNSP PGUID  4 t p t \054 0 0 0 anyelement_in anyelement_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define ANYELEMENTOID	2283
! DATA(insert OID = 3500 ( anyenum		PGNSP PGUID  4 t p t \054 0 0 0 anyenum_in anyenum_out - - - - - i p f 0 -1 0 _null_ _null_ ));
  #define ANYENUMOID		3500
  
  
***************
*** 592,621 ****
   */
  extern Oid	TypeShellMake(const char *typeName, Oid typeNamespace);
  
! extern Oid TypeCreate(const char *typeName,
! 		   Oid typeNamespace,
! 		   Oid relationOid,
! 		   char relationKind,
! 		   int16 internalSize,
! 		   char typeType,
! 		   char typDelim,
! 		   Oid inputProcedure,
! 		   Oid outputProcedure,
! 		   Oid receiveProcedure,
! 		   Oid sendProcedure,
! 		   Oid typmodinProcedure,
! 		   Oid typmodoutProcedure,
! 		   Oid analyzeProcedure,
! 		   Oid elementType,
! 		   Oid baseType,
! 		   const char *defaultTypeValue,
! 		   char *defaultTypeBin,
! 		   bool passedByValue,
! 		   char alignment,
! 		   char storage,
! 		   int32 typeMod,
! 		   int32 typNDims,
! 		   bool typeNotNull);
  
  extern void GenerateTypeDependencies(Oid typeNamespace,
  						 Oid typeObjectId,
--- 596,629 ----
   */
  extern Oid	TypeShellMake(const char *typeName, Oid typeNamespace);
  
! extern Oid TypeCreate(
! 	const char *typeName,
! 	Oid typeNamespace,
! 	Oid relationOid,
! 	char relationKind,
! 	int16 internalSize,
! 	char typeType,
! 	char typDelim,
! 	Oid inputProcedure,
! 	Oid outputProcedure,
! 	Oid receiveProcedure,
! 	Oid sendProcedure,
! 	Oid typmodinProcedure,
! 	Oid typmodoutProcedure,
! 	Oid analyzeProcedure,
! 	Oid elementType,
! 	Oid baseType,
! 	const char *defaultTypeValue,
! 	char *defaultTypeBin,
! 	bool passedByValue,
! 	char alignment,
! 	char storage,
! 	int32 typeMod,
! 	int32 typNDims,
! 	bool typeNotNull,
! 	Oid arrayType,
! 	bool is_array_type
! );
  
  extern void GenerateTypeDependencies(Oid typeNamespace,
  						 Oid typeObjectId,
***************
*** 637,642 ****
  extern void TypeRename(const char *oldTypeName, Oid typeNamespace,
  		   const char *newTypeName);
  
! extern char *makeArrayTypeName(const char *typeName);
  
  #endif   /* PG_TYPE_H */
--- 645,650 ----
  extern void TypeRename(const char *oldTypeName, Oid typeNamespace,
  		   const char *newTypeName);
  
! extern char *makeArrayTypeName(const char *typeName, Oid typeNamespace);
  
  #endif   /* PG_TYPE_H */
Index: src/test/regress/expected/alter_table.out
===================================================================
RCS file: /cvsroot/pgsql/src/test/regress/expected/alter_table.out,v
retrieving revision 1.101
diff -c -r1.101 alter_table.out
*** src/test/regress/expected/alter_table.out	14 Feb 2007 01:58:58 -0000	1.101
--- src/test/regress/expected/alter_table.out	9 May 2007 00:38:27 -0000
***************
*** 1456,1468 ****
--- 1456,1471 ----
  
  -- clean up
  drop schema alter2 cascade;
+ NOTICE:  drop cascades to type alter2.ctype[]
  NOTICE:  drop cascades to composite type alter2.ctype
  NOTICE:  drop cascades to type alter2.ctype
  NOTICE:  drop cascades to type alter2.posint
  NOTICE:  drop cascades to function alter2.plus1(integer)
+ NOTICE:  drop cascades to type alter2.v1[]
  NOTICE:  drop cascades to view alter2.v1
  NOTICE:  drop cascades to rule _RETURN on view alter2.v1
  NOTICE:  drop cascades to sequence alter2.t1_f1_seq
  NOTICE:  drop cascades to default for table alter2.t1 column f1
+ NOTICE:  drop cascades to type alter2.t1[]
  NOTICE:  drop cascades to table alter2.t1
  NOTICE:  drop cascades to constraint t1_f2_check on table alter2.t1
Index: src/test/regress/expected/type_sanity.out
===================================================================
RCS file: /cvsroot/pgsql/src/test/regress/expected/type_sanity.out,v
retrieving revision 1.29
diff -c -r1.29 type_sanity.out
*** src/test/regress/expected/type_sanity.out	2 Apr 2007 03:49:42 -0000	1.29
--- src/test/regress/expected/type_sanity.out	9 May 2007 00:38:28 -0000
***************
*** 49,55 ****
  -- or basic types that do.
  SELECT p1.oid, p1.typname
  FROM pg_type as p1
! WHERE (p1.typtype = 'c' AND p1.typrelid = 0) OR
      (p1.typtype != 'c' AND p1.typrelid != 0);
   oid | typname 
  -----+---------
--- 49,55 ----
  -- or basic types that do.
  SELECT p1.oid, p1.typname
  FROM pg_type as p1
! WHERE (p1.typtype = 'c' AND p1.typrelid = 0 AND p1.typname !~ '^_') OR
      (p1.typtype != 'c' AND p1.typrelid != 0);
   oid | typname 
  -----+---------
***************
*** 69,74 ****
--- 69,84 ----
   705 | unknown
  (2 rows)
  
+ -- Make sure typarray points to a varlena array type of our own base
+ SELECT p1.oid, p1.typname as basetype, p2.typname as arraytype, 
+        p2.typelem, p2.typlen
+ FROM   pg_type p1 left join pg_type p2 on (p1.typarray = p2.oid)
+ WHERE  p1.typarray <> 0 AND
+        (p2.oid IS NULL OR p2.typelem <> p1.oid OR p2.typlen <> -1);
+  oid | basetype | arraytype | typelem | typlen 
+ -----+----------+-----------+---------+--------
+ (0 rows)
+ 
  -- Text conversion routines must be provided.
  SELECT p1.oid, p1.typname
  FROM pg_type as p1
Index: src/test/regress/sql/type_sanity.sql
===================================================================
RCS file: /cvsroot/pgsql/src/test/regress/sql/type_sanity.sql,v
retrieving revision 1.29
diff -c -r1.29 type_sanity.sql
*** src/test/regress/sql/type_sanity.sql	2 Apr 2007 03:49:42 -0000	1.29
--- src/test/regress/sql/type_sanity.sql	9 May 2007 00:38:28 -0000
***************
*** 46,52 ****
  
  SELECT p1.oid, p1.typname
  FROM pg_type as p1
! WHERE (p1.typtype = 'c' AND p1.typrelid = 0) OR
      (p1.typtype != 'c' AND p1.typrelid != 0);
  
  -- Look for basic or enum types that don't have an array type.
--- 46,52 ----
  
  SELECT p1.oid, p1.typname
  FROM pg_type as p1
! WHERE (p1.typtype = 'c' AND p1.typrelid = 0 AND p1.typname !~ '^_') OR
      (p1.typtype != 'c' AND p1.typrelid != 0);
  
  -- Look for basic or enum types that don't have an array type.
***************
*** 59,64 ****
--- 59,71 ----
       WHERE p2.typname = ('_' || p1.typname)::name AND
             p2.typelem = p1.oid);
  
+ -- Make sure typarray points to a varlena array type of our own base
+ SELECT p1.oid, p1.typname as basetype, p2.typname as arraytype, 
+        p2.typelem, p2.typlen
+ FROM   pg_type p1 left join pg_type p2 on (p1.typarray = p2.oid)
+ WHERE  p1.typarray <> 0 AND
+        (p2.oid IS NULL OR p2.typelem <> p1.oid OR p2.typlen <> -1);
+ 
  -- Text conversion routines must be provided.
  
  SELECT p1.oid, p1.typname
