diff options
Diffstat (limited to 'src/backend/access/common/tupdesc.c')
-rw-r--r-- | src/backend/access/common/tupdesc.c | 118 |
1 files changed, 11 insertions, 107 deletions
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c index 81f996b8a03..605ffb1bed7 100644 --- a/src/backend/access/common/tupdesc.c +++ b/src/backend/access/common/tupdesc.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.77 2002/02/27 19:34:11 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.78 2002/03/29 19:05:59 tgl Exp $ * * NOTES * some of the executor utility code such as "ExecTypeFromTL" should be @@ -322,7 +322,7 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2) * a preallocated tuple descriptor. * ---------------------------------------------------------------- */ -bool +void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, char *attributeName, @@ -377,39 +377,11 @@ TupleDescInitEntry(TupleDesc desc, att->attnotnull = false; att->atthasdef = false; - /* ---------------- - * search the system cache for the type tuple of the attribute - * we are creating so that we can get the typeid and some other - * stuff. - * - * Note: in the special case of - * - * create EMP (name = text, manager = EMP) - * - * RelationNameCreateHeapRelation() calls BuildDesc() which - * calls this routine and since EMP does not exist yet, the - * system cache lookup below fails. That's fine, but rather - * then doing a elog(ERROR) we just leave that information - * uninitialized, return false, then fix things up later. - * -cim 6/14/90 - * ---------------- - */ tuple = SearchSysCache(TYPEOID, ObjectIdGetDatum(oidtypeid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - { - /* - * here type info does not exist yet so we just fill the attribute - * with dummy information and return false. - */ - att->atttypid = InvalidOid; - att->attlen = (int16) 0; - att->attbyval = (bool) 0; - att->attalign = 'i'; - att->attstorage = 'p'; - return false; - } + elog(ERROR, "Unable to look up type id %u", oidtypeid); /* * type info exists so we initialize our attribute information from @@ -477,56 +449,16 @@ TupleDescInitEntry(TupleDesc desc, } ReleaseSysCache(tuple); - - return true; } -/* ---------------------------------------------------------------- - * TupleDescMakeSelfReference +/* + * BuildDescForRelation * - * This function initializes a "self-referential" attribute like - * manager in "create EMP (name=text, manager = EMP)". - * It calls TypeShellMake() which inserts a "shell" type - * tuple into pg_type. A self-reference is one kind of set, so - * its size and byval are the same as for a set. See the comments - * above in TupleDescInitEntry. - * ---------------------------------------------------------------- - */ -static void -TupleDescMakeSelfReference(TupleDesc desc, - AttrNumber attnum, - char *relname) -{ - Form_pg_attribute att; - - att = desc->attrs[attnum - 1]; - att->atttypid = TypeShellMake(relname); - att->attlen = sizeof(Oid); - att->attbyval = true; - att->attalign = 'i'; - att->attstorage = 'p'; - att->attndims = 0; -} - -/* ---------------------------------------------------------------- - * BuildDescForRelation - * - * This is a general purpose function identical to BuildDesc - * but is used by the DefineRelation() code to catch the - * special case where you - * - * create FOO ( ..., x = FOO ) - * - * here, the initial type lookup for "x = FOO" will fail - * because FOO isn't in the catalogs yet. But since we - * are creating FOO, instead of doing an elog() we add - * a shell type tuple to pg_type and fix things later - * in amcreate(). - * ---------------------------------------------------------------- + * Given a relation schema (list of ColumnDef nodes), build a TupleDesc. */ TupleDesc -BuildDescForRelation(List *schema, char *relname) +BuildDescForRelation(List *schema) { int natts; AttrNumber attnum; @@ -535,7 +467,6 @@ BuildDescForRelation(List *schema, char *relname) AttrDefault *attrdef = NULL; TupleConstr *constr = (TupleConstr *) palloc(sizeof(TupleConstr)); char *attname; - char typename[NAMEDATALEN]; int32 atttypmod; int attdim; int ndef = 0; @@ -553,7 +484,6 @@ BuildDescForRelation(List *schema, char *relname) foreach(p, schema) { ColumnDef *entry = lfirst(p); - List *arry; /* * for each entry in the list, get the name and type information @@ -563,39 +493,13 @@ BuildDescForRelation(List *schema, char *relname) attnum++; attname = entry->colname; - arry = entry->typename->arrayBounds; attisset = entry->typename->setof; atttypmod = entry->typename->typmod; + attdim = length(entry->typename->arrayBounds); - if (arry != NIL) - { - /* array of XXX is _XXX */ - snprintf(typename, NAMEDATALEN, - "_%.*s", NAMEDATALEN - 2, entry->typename->name); - attdim = length(arry); - } - else - { - StrNCpy(typename, entry->typename->name, NAMEDATALEN); - attdim = 0; - } - - if (!TupleDescInitEntry(desc, attnum, attname, - typenameTypeId(typename), - atttypmod, attdim, attisset)) - { - /* - * if TupleDescInitEntry() fails, it means there is no type in - * the system catalogs. So now we check if the type name - * equals the relation name. If so we have a self reference, - * otherwise it's an error. - */ - if (strcmp(typename, relname) == 0) - TupleDescMakeSelfReference(desc, attnum, relname); - else - elog(ERROR, "DefineRelation: no such type %s", - typename); - } + TupleDescInitEntry(desc, attnum, attname, + typenameTypeId(entry->typename), + atttypmod, attdim, attisset); /* This is for constraints */ if (entry->is_not_null) |