@ -25,9 +25,6 @@
# include "catalog/pg_collation.h"
# include "catalog/pg_collation.h"
# include "catalog/pg_type.h"
# include "catalog/pg_type.h"
# include "common/hashfn.h"
# include "common/hashfn.h"
# include "miscadmin.h"
# include "parser/parse_type.h"
# include "utils/acl.h"
# include "utils/builtins.h"
# include "utils/builtins.h"
# include "utils/datum.h"
# include "utils/datum.h"
# include "utils/resowner_private.h"
# include "utils/resowner_private.h"
@ -778,109 +775,6 @@ TupleDescInitEntryCollation(TupleDesc desc,
TupleDescAttr ( desc , attributeNumber - 1 ) - > attcollation = collationid ;
TupleDescAttr ( desc , attributeNumber - 1 ) - > attcollation = collationid ;
}
}
/*
* BuildDescForRelation
*
* Given a list of ColumnDef nodes , build a TupleDesc .
*
* Note : tdtypeid will need to be filled in later on .
*/
TupleDesc
BuildDescForRelation ( const List * columns )
{
int natts ;
AttrNumber attnum ;
ListCell * l ;
TupleDesc desc ;
bool has_not_null ;
char * attname ;
Oid atttypid ;
int32 atttypmod ;
Oid attcollation ;
int attdim ;
/*
* allocate a new tuple descriptor
*/
natts = list_length ( columns ) ;
desc = CreateTemplateTupleDesc ( natts ) ;
has_not_null = false ;
attnum = 0 ;
foreach ( l , columns )
{
ColumnDef * entry = lfirst ( l ) ;
AclResult aclresult ;
Form_pg_attribute att ;
/*
* for each entry in the list , get the name and type information from
* the list and have TupleDescInitEntry fill in the attribute
* information we need .
*/
attnum + + ;
attname = entry - > colname ;
typenameTypeIdAndMod ( NULL , entry - > typeName , & atttypid , & atttypmod ) ;
aclresult = object_aclcheck ( TypeRelationId , atttypid , GetUserId ( ) , ACL_USAGE ) ;
if ( aclresult ! = ACLCHECK_OK )
aclcheck_error_type ( aclresult , atttypid ) ;
attcollation = GetColumnDefCollation ( NULL , entry , atttypid ) ;
attdim = list_length ( entry - > typeName - > arrayBounds ) ;
if ( attdim > PG_INT16_MAX )
ereport ( ERROR ,
errcode ( ERRCODE_PROGRAM_LIMIT_EXCEEDED ) ,
errmsg ( " too many array dimensions " ) ) ;
if ( entry - > typeName - > setof )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TABLE_DEFINITION ) ,
errmsg ( " column \" %s \" cannot be declared SETOF " ,
attname ) ) ) ;
TupleDescInitEntry ( desc , attnum , attname ,
atttypid , atttypmod , attdim ) ;
att = TupleDescAttr ( desc , attnum - 1 ) ;
/* Override TupleDescInitEntry's settings as requested */
TupleDescInitEntryCollation ( desc , attnum , attcollation ) ;
if ( entry - > storage )
att - > attstorage = entry - > storage ;
/* Fill in additional stuff not handled by TupleDescInitEntry */
att - > attnotnull = entry - > is_not_null ;
has_not_null | = entry - > is_not_null ;
att - > attislocal = entry - > is_local ;
att - > attinhcount = entry - > inhcount ;
att - > attidentity = entry - > identity ;
att - > attgenerated = entry - > generated ;
}
if ( has_not_null )
{
TupleConstr * constr = ( TupleConstr * ) palloc0 ( sizeof ( TupleConstr ) ) ;
constr - > has_not_null = true ;
constr - > has_generated_stored = false ;
constr - > defval = NULL ;
constr - > missing = NULL ;
constr - > num_defval = 0 ;
constr - > check = NULL ;
constr - > num_check = 0 ;
desc - > constr = constr ;
}
else
{
desc - > constr = NULL ;
}
return desc ;
}
/*
/*
* BuildDescFromLists
* BuildDescFromLists
*
*
@ -889,8 +783,7 @@ BuildDescForRelation(const List *columns)
*
*
* No constraints are generated .
* No constraints are generated .
*
*
* This is essentially a cut - down version of BuildDescForRelation for use
* This is for use with functions returning RECORD .
* with functions returning RECORD .
*/
*/
TupleDesc
TupleDesc
BuildDescFromLists ( const List * names , const List * types , const List * typmods , const List * collations )
BuildDescFromLists ( const List * names , const List * types , const List * typmods , const List * collations )