mirror of
https://github.com/postgres/postgres.git
synced 2025-05-01 01:04:50 +03:00
Move BuildDescForRelation() from tupdesc.c to tablecmds.c
BuildDescForRelation() main job is to convert ColumnDef lists to pg_attribute/tuple descriptor arrays, which is really mostly an internal subroutine of DefineRelation() and some related functions, which is more the remit of tablecmds.c and doesn't have much to do with the basic tuple descriptor interfaces in tupdesc.c. This is also supported by observing the header includes we can remove in tupdesc.c. By moving it over, we can also (in the future) make BuildDescForRelation() use more internals of tablecmds.c that are not sensible to be exposed in tupdesc.c. Discussion: https://www.postgresql.org/message-id/flat/52a125e4-ff9a-95f5-9f61-b87cf447e4da@eisentraut.org
This commit is contained in:
parent
6d341407a6
commit
04e485273b
@ -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)
|
||||||
|
@ -1277,6 +1277,108 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
|
|||||||
return address;
|
return address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Emit the right error or warning message for a "DROP" command issued on a
|
* Emit the right error or warning message for a "DROP" command issued on a
|
||||||
* non-existent relation
|
* non-existent relation
|
||||||
|
@ -147,8 +147,6 @@ extern void TupleDescInitEntryCollation(TupleDesc desc,
|
|||||||
AttrNumber attributeNumber,
|
AttrNumber attributeNumber,
|
||||||
Oid collationid);
|
Oid collationid);
|
||||||
|
|
||||||
extern TupleDesc BuildDescForRelation(const List *columns);
|
|
||||||
|
|
||||||
extern TupleDesc BuildDescFromLists(const List *names, const List *types, const List *typmods, const List *collations);
|
extern TupleDesc BuildDescFromLists(const List *names, const List *types, const List *typmods, const List *collations);
|
||||||
|
|
||||||
extern Node *TupleDescGetDefault(TupleDesc tupdesc, AttrNumber attnum);
|
extern Node *TupleDescGetDefault(TupleDesc tupdesc, AttrNumber attnum);
|
||||||
|
@ -27,6 +27,8 @@ struct AlterTableUtilityContext; /* avoid including tcop/utility.h here */
|
|||||||
extern ObjectAddress DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
|
extern ObjectAddress DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
|
||||||
ObjectAddress *typaddress, const char *queryString);
|
ObjectAddress *typaddress, const char *queryString);
|
||||||
|
|
||||||
|
extern TupleDesc BuildDescForRelation(const List *columns);
|
||||||
|
|
||||||
extern void RemoveRelations(DropStmt *drop);
|
extern void RemoveRelations(DropStmt *drop);
|
||||||
|
|
||||||
extern Oid AlterTableLookupRelation(AlterTableStmt *stmt, LOCKMODE lockmode);
|
extern Oid AlterTableLookupRelation(AlterTableStmt *stmt, LOCKMODE lockmode);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user