Re: updated WIP: arrays of composites - Mailing list pgsql-patches
| From | Andrew Dunstan |
|---|---|
| Subject | Re: updated WIP: arrays of composites |
| Date | |
| Msg-id | 46411B44.3040608@dunslane.net Whole thread Raw |
| In response to | updated WIP: arrays of composites (Andrew Dunstan <andrew@dunslane.net>) |
| Responses |
Re: updated WIP: arrays of composites
|
| List | pgsql-patches |
I wrote:
>
> Attached is my rework of David Fetter's array of composites patch. It
> has all the agreed modifications and checks, except altering the name
> mangling.
>
>
Here is the latest with the name mangling piece done - it's got quite
large with the catalog rewrite :-)
It could do with some extra eyeballs - especially the error codes.
I'm not sure if we need to adjust the test in pg_dump.c - maybe we
should look at using the same test as the backend (typlen == -1) to
disambiguate real arrays from subscriptable base types.
cheers
andrew
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
f0 -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
pf 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
-10 _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
f0 -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 - - -
cp 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 - - -
cp 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 - - -
dp 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 - - -
sp 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 - - -
ip 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
f0 -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
pf 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
pf 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
pf 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
pf 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
xf 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
pf 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
-10 _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 - - -
ip 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 - - -
dp 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 - - -
dx 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
f0 -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 - - -
dx 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 - - -
ix 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 - - -
ix 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
bpchartypmodinbpchartypmodout - 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
varchartypmodinvarchartypmodout - 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
xf 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 - - -
dx 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 - - -
ix 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 - - -
dx 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 - - -
ix 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 - - -
ix 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
xf 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 - - -
dx 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 - - -
ix 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 - - -
ix f 0 -1 0 _null_ _null_ ));
! DATA(insert OID = 1042 ( bpchar PGNSP PGUID -1 f b t \054 0 0 bpcharin bpcharout bpcharrecv bpcharsend
bpchartypmodinbpchartypmodout - 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
varchartypmodinvarchartypmodout - 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
pf 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
timetypmodintimetypmodout - 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_sendtimestamptypmodin 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
timestamptypmodintimestamptypmodout - 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
timetypmodintimetypmodout - 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_recvtimestamptz_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
timestamptztypmodintimestamptztypmodout - 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_sendintervaltypmodin 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
intervaltypmodinintervaltypmodout - 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
numerictypmodinnumerictypmodout - 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
timetztypmodintimetztypmodout - 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
timetztypmodintimetztypmodout - 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
bittypmodinbittypmodout - 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
varbittypmodinvarbittypmodout - 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
varbittypmodinvarbittypmodout - 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_sendnumerictypmodin 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
f0 -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
regprocedurerecvregproceduresend - - - 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
regoperatorrecvregoperatorsend - - - 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
f0 -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
pf 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
f0 -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 - - -
dx 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
pf 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 - - -
dp 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
mf 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
mf 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
bpchartypmodinbpchartypmodout - 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
varchartypmodinvarchartypmodout - 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 - - -
dx 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 - - -
ix 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
bpcharsendbpchartypmodin 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
varcharsendvarchartypmodin 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
timetypmodintimetypmodout - 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_recvtimestamp_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
timestamptypmodintimestamptypmodout - 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
timetypmodintimetypmodout - 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_recvtimestamptz_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
timestamptztypmodintimestamptztypmodout - 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_sendintervaltypmodin 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
intervaltypmodinintervaltypmodout - 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
numerictypmodinnumerictypmodout - 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_sendtimetztypmodin 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
timetztypmodintimetztypmodout - 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
bittypmodinbittypmodout - 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
bittypmodinbittypmodout - 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_sendvarbittypmodin 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
varbittypmodinvarbittypmodout - 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_sendnumerictypmodin 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 - - -
ix 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
regprocedurerecvregproceduresend - - - 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
regoperatorrecvregoperatorsend - - - 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
-10 _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
f0 -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
pgsql-patches by date: