Skip site navigation (1) Skip section navigation (2)

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search for
  Advanced Search

Re: Macros for typtype (was Re: Arrays of Complex Types)



On Sat, Mar 31, 2007 at 07:58:34PM -0400, Tom Lane wrote:
> David Fetter <david(at)fetter(dot)org> writes:
> > What say we put one in pre-emptively for TYPTYPE_ARRAY?
> 
> When and if the patch appears, you can add it ;-).  I'm just intending a
> search-and-replace at the moment.

Like this?

Cheers,
D
-- 
David Fetter <david(at)fetter(dot)org> http://fetter.org/
phone: +1 415 235 3778        AIM: dfetter666
                              Skype: davidfetter

Remember to vote!
Consider donating to PostgreSQL: http://www.postgresql.org/about/donate
Index: src/backend/catalog/heap.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/catalog/heap.c,v
retrieving revision 1.317
diff -c -r1.317 heap.c
*** src/backend/catalog/heap.c	14 Feb 2007 01:58:56 -0000	1.317
--- src/backend/catalog/heap.c	1 Apr 2007 00:17:20 -0000
***************
*** 412,418 ****
  				(errcode(ERRCODE_INVALID_TABLE_DEFINITION),
  				 errmsg("column \"%s\" has type \"unknown\"", attname),
  				 errdetail("Proceeding with relation creation anyway.")));
! 	else if (att_typtype == 'p')
  	{
  		/* Special hack for pg_statistic: allow ANYARRAY during initdb */
  		if (atttypid != ANYARRAYOID || IsUnderPostmaster)
--- 412,418 ----
  				(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 */
  		if (atttypid != ANYARRAYOID || IsUnderPostmaster)
Index: src/backend/commands/typecmds.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/commands/typecmds.c,v
retrieving revision 1.100
diff -c -r1.100 typecmds.c
*** src/backend/commands/typecmds.c	14 Feb 2007 01:58:57 -0000	1.100
--- src/backend/commands/typecmds.c	1 Apr 2007 00:17:20 -0000
***************
*** 625,631 ****
  	 * might be made to work in the future, but not today.
  	 */
  	typtype = baseType->typtype;
! 	if (typtype != 'b' && typtype != 'd')
  		ereport(ERROR,
  				(errcode(ERRCODE_DATATYPE_MISMATCH),
  				 errmsg("\"%s\" is not a valid base type for a domain",
--- 625,631 ----
  	 * might be made to work in the future, but not today.
  	 */
  	typtype = baseType->typtype;
! 	if (typtype != TYPTYPE_BASE && typtype != TYPTYPE_DOMAIN)
  		ereport(ERROR,
  				(errcode(ERRCODE_DATATYPE_MISMATCH),
  				 errmsg("\"%s\" is not a valid base type for a domain",
***************
*** 907,913 ****
  	/* Check that this is actually a domain */
  	typtype = ((Form_pg_type) GETSTRUCT(tup))->typtype;
  
! 	if (typtype != 'd')
  		ereport(ERROR,
  				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
  				 errmsg("\"%s\" is not a domain",
--- 907,913 ----
  	/* Check that this is actually a domain */
  	typtype = ((Form_pg_type) GETSTRUCT(tup))->typtype;
  
! 	if (typtype != TYPTYPE_DOMAIN)
  		ereport(ERROR,
  				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
  				 errmsg("\"%s\" is not a domain",
***************
*** 1835,1841 ****
  	Form_pg_type typTup = (Form_pg_type) GETSTRUCT(tup);
  
  	/* Check that this is actually a domain */
! 	if (typTup->typtype != 'd')
  		ereport(ERROR,
  				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
  				 errmsg("\"%s\" is not a domain",
--- 1835,1841 ----
  	Form_pg_type typTup = (Form_pg_type) GETSTRUCT(tup);
  
  	/* Check that this is actually a domain */
! 	if (typTup->typtype != TYPTYPE_DOMAIN)
  		ereport(ERROR,
  				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
  				 errmsg("\"%s\" is not a domain",
***************
*** 2021,2027 ****
  			elog(ERROR, "cache lookup failed for type %u", typeOid);
  		typTup = (Form_pg_type) GETSTRUCT(tup);
  
! 		if (typTup->typtype != 'd')
  		{
  			/* Not a domain, so done */
  			ReleaseSysCache(tup);
--- 2021,2027 ----
  			elog(ERROR, "cache lookup failed for type %u", typeOid);
  		typTup = (Form_pg_type) GETSTRUCT(tup);
  
! 		if (typTup->typtype != TYPTYPE_DOMAIN)
  		{
  			/* Not a domain, so done */
  			ReleaseSysCache(tup);
***************
*** 2148,2154 ****
  	 * free-standing composite type, and not a table's underlying type. We
  	 * want people to use ALTER TABLE not ALTER TYPE for that case.
  	 */
! 	if (typTup->typtype == 'c' &&
  		get_rel_relkind(typTup->typrelid) != RELKIND_COMPOSITE_TYPE)
  		ereport(ERROR,
  				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
--- 2148,2154 ----
  	 * free-standing composite type, and not a table's underlying type. We
  	 * want people to use ALTER TABLE not ALTER TYPE for that case.
  	 */
! 	if (typTup->typtype == TYPTYPE_COMPOUND &&
  		get_rel_relkind(typTup->typrelid) != RELKIND_COMPOSITE_TYPE)
  		ereport(ERROR,
  				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
***************
*** 2325,2335 ****
  
  	/* Detect whether type is a composite type (but not a table rowtype) */
  	isCompositeType =
! 		(typform->typtype == 'c' &&
  		 get_rel_relkind(typform->typrelid) == RELKIND_COMPOSITE_TYPE);
  
  	/* Enforce not-table-type if requested */
! 	if (typform->typtype == 'c' && !isCompositeType && errorOnTableType)
  		ereport(ERROR,
  				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
  				 errmsg("%s is a table's row type",
--- 2325,2335 ----
  
  	/* Detect whether type is a composite type (but not a table rowtype) */
  	isCompositeType =
! 		(typform->typtype == TYPTYPE_COMPOUND &&
  		 get_rel_relkind(typform->typrelid) == RELKIND_COMPOSITE_TYPE);
  
  	/* Enforce not-table-type if requested */
! 	if (typform->typtype == TYPTYPE_COMPOUND && !isCompositeType && errorOnTableType)
  		ereport(ERROR,
  				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
  				 errmsg("%s is a table's row type",
***************
*** 2376,2389 ****
  	else
  	{
  		/* If it's a domain, it might have constraints */
! 		if (typform->typtype == 'd')
  			AlterConstraintNamespaces(typeOid, oldNspOid, nspOid, true);
  
  		/*
  		 * Update dependency on schema, if any --- a table rowtype has not got
  		 * one.
  		 */
! 		if (typform->typtype != 'c')
  			if (changeDependencyFor(TypeRelationId, typeOid,
  								NamespaceRelationId, oldNspOid, nspOid) != 1)
  				elog(ERROR, "failed to change schema dependency for type %s",
--- 2376,2389 ----
  	else
  	{
  		/* If it's a domain, it might have constraints */
! 		if (typform->typtype == TYPTYPE_DOMAIN)
  			AlterConstraintNamespaces(typeOid, oldNspOid, nspOid, true);
  
  		/*
  		 * Update dependency on schema, if any --- a table rowtype has not got
  		 * one.
  		 */
! 		if (typform->typtype != TYPTYPE_COMPOUND)
  			if (changeDependencyFor(TypeRelationId, typeOid,
  								NamespaceRelationId, oldNspOid, nspOid) != 1)
  				elog(ERROR, "failed to change schema dependency for type %s",
Index: src/backend/executor/functions.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/functions.c,v
retrieving revision 1.112
diff -c -r1.112 functions.c
*** src/backend/executor/functions.c	13 Mar 2007 00:33:40 -0000	1.112
--- src/backend/executor/functions.c	1 Apr 2007 00:17:21 -0000
***************
*** 925,931 ****
  
  	fn_typtype = get_typtype(rettype);
  
! 	if (fn_typtype == 'b' || fn_typtype == 'd')
  	{
  		/*
  		 * For base-type returns, the target list should have exactly one
--- 925,931 ----
  
  	fn_typtype = get_typtype(rettype);
  
! 	if (fn_typtype == TYPTYPE_BASE || fn_typtype == TYPTYPE_DOMAIN)
  	{
  		/*
  		 * For base-type returns, the target list should have exactly one
***************
*** 948,954 ****
  					 errdetail("Actual return type is %s.",
  							   format_type_be(restype))));
  	}
! 	else if (fn_typtype == 'c' || rettype == RECORDOID)
  	{
  		/* Returns a rowtype */
  		TupleDesc	tupdesc;
--- 948,954 ----
  					 errdetail("Actual return type is %s.",
  							   format_type_be(restype))));
  	}
! 	else if (fn_typtype == TYPTYPE_COMPOUND || rettype == RECORDOID)
  	{
  		/* Returns a rowtype */
  		TupleDesc	tupdesc;
Index: src/backend/parser/parse_coerce.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/parser/parse_coerce.c,v
retrieving revision 2.152
diff -c -r2.152 parse_coerce.c
*** src/backend/parser/parse_coerce.c	27 Mar 2007 23:21:10 -0000	2.152
--- src/backend/parser/parse_coerce.c	1 Apr 2007 00:17:21 -0000
***************
*** 1813,1819 ****
  	/* Check for a varlena array type (and not a domain) */
  	if (typeForm->typelem != InvalidOid &&
  		typeForm->typlen == -1 &&
! 		typeForm->typtype != 'd')
  	{
  		/* Yes, switch our attention to the element type */
  		typeId = typeForm->typelem;
--- 1813,1819 ----
  	/* Check for a varlena array type (and not a domain) */
  	if (typeForm->typelem != InvalidOid &&
  		typeForm->typlen == -1 &&
! 		typeForm->typtype != TYPTYPE_DOMAIN)
  	{
  		/* Yes, switch our attention to the element type */
  		typeId = typeForm->typelem;
Index: src/backend/utils/adt/format_type.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/format_type.c,v
retrieving revision 1.46
diff -c -r1.46 format_type.c
*** src/backend/utils/adt/format_type.c	5 Jan 2007 22:19:40 -0000	1.46
--- src/backend/utils/adt/format_type.c	1 Apr 2007 00:17:21 -0000
***************
*** 148,154 ****
  
  	if (array_base_type != InvalidOid &&
  		typeform->typstorage != 'p' &&
! 		typeform->typtype != 'd')
  	{
  		/* Switch our attention to the array element type */
  		ReleaseSysCache(tuple);
--- 148,154 ----
  
  	if (array_base_type != InvalidOid &&
  		typeform->typstorage != 'p' &&
! 		typeform->typtype != TYPTYPE_DOMAIN)
  	{
  		/* Switch our attention to the array element type */
  		ReleaseSysCache(tuple);
Index: src/backend/utils/adt/xml.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/xml.c,v
retrieving revision 1.37
diff -c -r1.37 xml.c
*** src/backend/utils/adt/xml.c	22 Mar 2007 20:26:30 -0000	1.37
--- src/backend/utils/adt/xml.c	1 Apr 2007 00:17:22 -0000
***************
*** 2103,2109 ****
  			Form_pg_type typtuple = (Form_pg_type) GETSTRUCT(tuple);
  
  			appendStringInfoString(&result,
! 								   map_multipart_sql_identifier_to_xml_name((typtuple->typtype == 'd') ? "Domain" : "UDT",
  																			get_database_name(MyDatabaseId),
  																			get_namespace_name(typtuple->typnamespace),
  																			NameStr(typtuple->typname)));
--- 2103,2109 ----
  			Form_pg_type typtuple = (Form_pg_type) GETSTRUCT(tuple);
  
  			appendStringInfoString(&result,
! 								   map_multipart_sql_identifier_to_xml_name((typtuple->typtype == TYPTYPE_DOMAIN) ? "Domain" : "UDT",
  																			get_database_name(MyDatabaseId),
  																			get_namespace_name(typtuple->typnamespace),
  																			NameStr(typtuple->typname)));
Index: src/backend/utils/cache/lsyscache.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/cache/lsyscache.c,v
retrieving revision 1.150
diff -c -r1.150 lsyscache.c
*** src/backend/utils/cache/lsyscache.c	19 Mar 2007 16:30:31 -0000	1.150
--- src/backend/utils/cache/lsyscache.c	1 Apr 2007 00:17:22 -0000
***************
*** 1770,1776 ****
  	 * own type OID as parameter.  (As of 8.2, domains must get their own OID
  	 * even if their base type is an array.)
  	 */
! 	if (typeStruct->typtype == 'b' && OidIsValid(typeStruct->typelem))
  		return typeStruct->typelem;
  	else
  		return HeapTupleGetOid(typeTuple);
--- 1770,1776 ----
  	 * own type OID as parameter.  (As of 8.2, domains must get their own OID
  	 * even if their base type is an array.)
  	 */
! 	if (typeStruct->typtype == TYPTYPE_BASE && OidIsValid(typeStruct->typelem))
  		return typeStruct->typelem;
  	else
  		return HeapTupleGetOid(typeTuple);
***************
*** 2022,2028 ****
  		if (!HeapTupleIsValid(tup))
  			elog(ERROR, "cache lookup failed for type %u", typid);
  		typTup = (Form_pg_type) GETSTRUCT(tup);
! 		if (typTup->typtype != 'd')
  		{
  			/* Not a domain, so done */
  			ReleaseSysCache(tup);
--- 2022,2028 ----
  		if (!HeapTupleIsValid(tup))
  			elog(ERROR, "cache lookup failed for type %u", typid);
  		typTup = (Form_pg_type) GETSTRUCT(tup);
! 		if (typTup->typtype != TYPTYPE_DOMAIN)
  		{
  			/* Not a domain, so done */
  			ReleaseSysCache(tup);
Index: src/backend/utils/cache/typcache.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/cache/typcache.c,v
retrieving revision 1.24
diff -c -r1.24 typcache.c
*** src/backend/utils/cache/typcache.c	5 Jan 2007 22:19:43 -0000	1.24
--- src/backend/utils/cache/typcache.c	1 Apr 2007 00:17:22 -0000
***************
*** 275,281 ****
  	 */
  	if ((flags & TYPECACHE_TUPDESC) &&
  		typentry->tupDesc == NULL &&
! 		typentry->typtype == 'c')
  	{
  		Relation	rel;
  
--- 275,281 ----
  	 */
  	if ((flags & TYPECACHE_TUPDESC) &&
  		typentry->tupDesc == NULL &&
! 		typentry->typtype == TYPTYPE_COMPOUND)
  	{
  		Relation	rel;
  
Index: src/bin/pg_dump/pg_dump.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v
retrieving revision 1.465
diff -c -r1.465 pg_dump.c
*** src/bin/pg_dump/pg_dump.c	26 Mar 2007 16:58:39 -0000	1.465
--- src/bin/pg_dump/pg_dump.c	1 Apr 2007 00:17:23 -0000
***************
*** 2085,2091 ****
  		 */
  		tinfo[i].nDomChecks = 0;
  		tinfo[i].domChecks = NULL;
! 		if (tinfo[i].dobj.dump && tinfo[i].typtype == 'd')
  			getDomainConstraints(&(tinfo[i]));
  
  		/*
--- 2085,2091 ----
  		 */
  		tinfo[i].nDomChecks = 0;
  		tinfo[i].domChecks = NULL;
! 		if (tinfo[i].dobj.dump && tinfo[i].typtype == TYPTYPE_DOMAIN)
  			getDomainConstraints(&(tinfo[i]));
  
  		/*
***************
*** 2097,2103 ****
  		 * should copy the base type's catId, but then it might capture the
  		 * pg_depend entries for the type, which we don't want.
  		 */
! 		if (tinfo[i].dobj.dump && tinfo[i].typtype == 'b')
  		{
  			stinfo = (ShellTypeInfo *) malloc(sizeof(ShellTypeInfo));
  			stinfo->dobj.objType = DO_SHELL_TYPE;
--- 2097,2103 ----
  		 * should copy the base type's catId, but then it might capture the
  		 * pg_depend entries for the type, which we don't want.
  		 */
! 		if (tinfo[i].dobj.dump && tinfo[i].typtype == TYPTYPE_BASE)
  		{
  			stinfo = (ShellTypeInfo *) malloc(sizeof(ShellTypeInfo));
  			stinfo->dobj.objType = DO_SHELL_TYPE;
***************
*** 5119,5129 ****
  		return;
  
  	/* Dump out in proper style */
! 	if (tinfo->typtype == 'b')
  		dumpBaseType(fout, tinfo);
! 	else if (tinfo->typtype == 'd')
  		dumpDomain(fout, tinfo);
! 	else if (tinfo->typtype == 'c')
  		dumpCompositeType(fout, tinfo);
  }
  
--- 5119,5129 ----
  		return;
  
  	/* Dump out in proper style */
! 	if (tinfo->typtype == TYPTYPE_BASE)
  		dumpBaseType(fout, tinfo);
! 	else if (tinfo->typtype == TYPTYPE_DOMAIN)
  		dumpDomain(fout, tinfo);
! 	else if (tinfo->typtype == TYPTYPE_COMPOUND)
  		dumpCompositeType(fout, tinfo);
  }
  
Index: src/include/catalog/pg_type.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/catalog/pg_type.h,v
retrieving revision 1.180
diff -c -r1.180 pg_type.h
*** src/include/catalog/pg_type.h	28 Jan 2007 16:16:54 -0000	1.180
--- src/include/catalog/pg_type.h	1 Apr 2007 00:17:24 -0000
***************
*** 566,571 ****
--- 566,578 ----
  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_ ));
  
+ #define		TYPTYPE_ARRAY		'a'		/* Generic array */
+ #define		TYPTYPE_BASE		'b'		/* Base type */
+ #define		TYPTYPE_COMPOUND	'c'		/* Compound type */
+ #define		TYPTYPE_DOMAIN		'd'		/* Domain */
+ #define		TYPTYPE_ENUM		'e'		/* Enum */
+ #define		TYPTYPE_PSEUDO		'p'		/* Pseudo (as in ROW and RECORD) */
+ 
  /*
   * prototypes for functions in pg_type.c
   */
Index: src/pl/plperl/plperl.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/pl/plperl/plperl.c,v
retrieving revision 1.127
diff -c -r1.127 plperl.c
*** src/pl/plperl/plperl.c	9 Feb 2007 03:35:34 -0000	1.127
--- src/pl/plperl/plperl.c	1 Apr 2007 00:17:24 -0000
***************
*** 843,849 ****
  
  	/* Disallow pseudotype result */
  	/* except for TRIGGER, RECORD, or VOID */
! 	if (functyptype == 'p')
  	{
  		/* we assume OPAQUE with no arguments means a trigger */
  		if (proc->prorettype == TRIGGEROID ||
--- 843,849 ----
  
  	/* Disallow pseudotype result */
  	/* except for TRIGGER, RECORD, or VOID */
! 	if (functyptype == TYPTYPE_PSEUDO)
  	{
  		/* we assume OPAQUE with no arguments means a trigger */
  		if (proc->prorettype == TRIGGEROID ||
***************
*** 1525,1531 ****
  			typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
  
  			/* Disallow pseudotype result, except VOID or RECORD */
! 			if (typeStruct->typtype == 'p')
  			{
  				if (procStruct->prorettype == VOIDOID ||
  					procStruct->prorettype == RECORDOID)
--- 1525,1531 ----
  			typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
  
  			/* Disallow pseudotype result, except VOID or RECORD */
! 			if (typeStruct->typtype == TYPTYPE_PSEUDO)
  			{
  				if (procStruct->prorettype == VOIDOID ||
  					procStruct->prorettype == RECORDOID)
***************
*** 1552,1558 ****
  
  			prodesc->result_oid = procStruct->prorettype;
  			prodesc->fn_retisset = procStruct->proretset;
! 			prodesc->fn_retistuple = (typeStruct->typtype == 'c' ||
  									  procStruct->prorettype == RECORDOID);
  
  			prodesc->fn_retisarray =
--- 1552,1558 ----
  
  			prodesc->result_oid = procStruct->prorettype;
  			prodesc->fn_retisset = procStruct->proretset;
! 			prodesc->fn_retistuple = (typeStruct->typtype == TYPTYPE_COMPOUND ||
  									  procStruct->prorettype == RECORDOID);
  
  			prodesc->fn_retisarray =
***************
*** 1586,1592 ****
  				typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
  
  				/* Disallow pseudotype argument */
! 				if (typeStruct->typtype == 'p')
  				{
  					free(prodesc->proname);
  					free(prodesc);
--- 1586,1592 ----
  				typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
  
  				/* Disallow pseudotype argument */
! 				if (typeStruct->typtype == TYPTYPE_PSEUDO)
  				{
  					free(prodesc->proname);
  					free(prodesc);
***************
*** 1596,1602 ****
  						format_type_be(procStruct->proargtypes.values[i]))));
  				}
  
! 				if (typeStruct->typtype == 'c')
  					prodesc->arg_is_rowtype[i] = true;
  				else
  				{
--- 1596,1602 ----
  						format_type_be(procStruct->proargtypes.values[i]))));
  				}
  
! 				if (typeStruct->typtype == TYPTYPE_COMPOUND)
  					prodesc->arg_is_rowtype[i] = true;
  				else
  				{
Index: src/pl/plpgsql/src/pl_comp.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/pl/plpgsql/src/pl_comp.c,v
retrieving revision 1.113
diff -c -r1.113 pl_comp.c
*** src/pl/plpgsql/src/pl_comp.c	9 Feb 2007 03:35:34 -0000	1.113
--- src/pl/plpgsql/src/pl_comp.c	1 Apr 2007 00:17:24 -0000
***************
*** 513,519 ****
  
  			/* Disallow pseudotype result, except VOID or RECORD */
  			/* (note we already replaced ANYARRAY/ANYELEMENT) */
! 			if (typeStruct->typtype == 'p')
  			{
  				if (rettypeid == VOIDOID ||
  					rettypeid == RECORDOID)
--- 513,519 ----
  
  			/* Disallow pseudotype result, except VOID or RECORD */
  			/* (note we already replaced ANYARRAY/ANYELEMENT) */
! 			if (typeStruct->typtype == TYPTYPE_PSEUDO)
  			{
  				if (rettypeid == VOIDOID ||
  					rettypeid == RECORDOID)
Index: src/pl/plpgsql/src/pl_handler.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/pl/plpgsql/src/pl_handler.c,v
retrieving revision 1.36
diff -c -r1.36 pl_handler.c
*** src/pl/plpgsql/src/pl_handler.c	30 Jan 2007 22:05:13 -0000	1.36
--- src/pl/plpgsql/src/pl_handler.c	1 Apr 2007 00:17:24 -0000
***************
*** 148,154 ****
  
  	/* Disallow pseudotype result */
  	/* except for TRIGGER, RECORD, VOID, ANYARRAY, or ANYELEMENT */
! 	if (functyptype == 'p')
  	{
  		/* we assume OPAQUE with no arguments means a trigger */
  		if (proc->prorettype == TRIGGEROID ||
--- 148,154 ----
  
  	/* Disallow pseudotype result */
  	/* except for TRIGGER, RECORD, VOID, ANYARRAY, or ANYELEMENT */
! 	if (functyptype == TYPTYPE_PSEUDO)
  	{
  		/* we assume OPAQUE with no arguments means a trigger */
  		if (proc->prorettype == TRIGGEROID ||
Index: src/pl/plpython/plpython.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/pl/plpython/plpython.c,v
retrieving revision 1.96
diff -c -r1.96 plpython.c
*** src/pl/plpython/plpython.c	21 Feb 2007 03:27:32 -0000	1.96
--- src/pl/plpython/plpython.c	1 Apr 2007 00:17:25 -0000
***************
*** 1185,1191 ****
  			rvTypeStruct = (Form_pg_type) GETSTRUCT(rvTypeTup);
  
  			/* Disallow pseudotype result, except for void */
! 			if (rvTypeStruct->typtype == 'p' &&
  				procStruct->prorettype != VOIDOID)
  			{
  				if (procStruct->prorettype == TRIGGEROID)
--- 1185,1191 ----
  			rvTypeStruct = (Form_pg_type) GETSTRUCT(rvTypeTup);
  
  			/* Disallow pseudotype result, except for void */
! 			if (rvTypeStruct->typtype == TYPTYPE_PSEUDO &&
  				procStruct->prorettype != VOIDOID)
  			{
  				if (procStruct->prorettype == TRIGGEROID)
***************
*** 1199,1205 ****
  								  format_type_be(procStruct->prorettype))));
  			}
  
! 			if (rvTypeStruct->typtype == 'c')
  			{
  				/*
  				 * Tuple: set up later, during first call to
--- 1199,1205 ----
  								  format_type_be(procStruct->prorettype))));
  			}
  
! 			if (rvTypeStruct->typtype == TYPTYPE_COMPOUND)
  			{
  				/*
  				 * Tuple: set up later, during first call to
***************
*** 1258,1270 ****
  			argTypeStruct = (Form_pg_type) GETSTRUCT(argTypeTup);
  
  			/* Disallow pseudotype argument */
! 			if (argTypeStruct->typtype == 'p')
  				ereport(ERROR,
  						(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  						 errmsg("plpython functions cannot take type %s",
  						format_type_be(procStruct->proargtypes.values[i]))));
  
! 			if (argTypeStruct->typtype != 'c')
  				PLy_input_datum_func(&(proc->args[i]),
  									 procStruct->proargtypes.values[i],
  									 argTypeTup);
--- 1258,1270 ----
  			argTypeStruct = (Form_pg_type) GETSTRUCT(argTypeTup);
  
  			/* Disallow pseudotype argument */
! 			if (argTypeStruct->typtype == TYPTYPE_PSEUDO)
  				ereport(ERROR,
  						(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  						 errmsg("plpython functions cannot take type %s",
  						format_type_be(procStruct->proargtypes.values[i]))));
  
! 			if (argTypeStruct->typtype != TYPTYPE_COMPOUND)
  				PLy_input_datum_func(&(proc->args[i]),
  									 procStruct->proargtypes.values[i],
  									 argTypeTup);
***************
*** 2338,2344 ****
  
  					plan->types[i] = typeId;
  					typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
! 					if (typeStruct->typtype != 'c')
  						PLy_output_datum_func(&plan->args[i], typeTup);
  					else
  						elog(ERROR, "tuples not handled in plpy.prepare, yet.");
--- 2338,2344 ----
  
  					plan->types[i] = typeId;
  					typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
! 					if (typeStruct->typtype != TYPTYPE_COMPOUND)
  						PLy_output_datum_func(&plan->args[i], typeTup);
  					else
  						elog(ERROR, "tuples not handled in plpy.prepare, yet.");
Index: src/pl/tcl/pltcl.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/pl/tcl/pltcl.c,v
retrieving revision 1.111
diff -c -r1.111 pltcl.c
*** src/pl/tcl/pltcl.c	21 Feb 2007 03:27:32 -0000	1.111
--- src/pl/tcl/pltcl.c	1 Apr 2007 00:17:25 -0000
***************
*** 1051,1057 ****
  			typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
  
  			/* Disallow pseudotype result, except VOID */
! 			if (typeStruct->typtype == 'p')
  			{
  				if (procStruct->prorettype == VOIDOID)
  					 /* okay */ ;
--- 1051,1057 ----
  			typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
  
  			/* Disallow pseudotype result, except VOID */
! 			if (typeStruct->typtype == TYPTYPE_PSEUDO)
  			{
  				if (procStruct->prorettype == VOIDOID)
  					 /* okay */ ;
***************
*** 1074,1080 ****
  				}
  			}
  
! 			if (typeStruct->typtype == 'c')
  			{
  				free(prodesc->proname);
  				free(prodesc);
--- 1074,1080 ----
  				}
  			}
  
! 			if (typeStruct->typtype == TYPTYPE_COMPOUND)
  			{
  				free(prodesc->proname);
  				free(prodesc);
***************
*** 1112,1118 ****
  				typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
  
  				/* Disallow pseudotype argument */
! 				if (typeStruct->typtype == 'p')
  				{
  					free(prodesc->proname);
  					free(prodesc);
--- 1112,1118 ----
  				typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
  
  				/* Disallow pseudotype argument */
! 				if (typeStruct->typtype == TYPTYPE_PSEUDO)
  				{
  					free(prodesc->proname);
  					free(prodesc);
***************
*** 1122,1128 ****
  						format_type_be(procStruct->proargtypes.values[i]))));
  				}
  
! 				if (typeStruct->typtype == 'c')
  				{
  					prodesc->arg_is_rowtype[i] = true;
  					snprintf(buf, sizeof(buf), "__PLTcl_Tup_%d", i + 1);
--- 1122,1128 ----
  						format_type_be(procStruct->proargtypes.values[i]))));
  				}
  
! 				if (typeStruct->typtype == TYPTYPE_COMPOUND)
  				{
  					prodesc->arg_is_rowtype[i] = true;
  					snprintf(buf, sizeof(buf), "__PLTcl_Tup_%d", i + 1);


Home | Main Index | Thread Index

Privacy Policy | PostgreSQL Archives hosted by Command Prompt, Inc. | Designed by tinysofa
Copyright © 1996 – 2008 PostgreSQL Global Development Group