From 9e9584cc99ff63d6e14d2e9e8fe07f2b67d15647 Mon Sep 17 00:00:00 2001 From: "Vadim B. Mikheev" Date: Fri, 22 Aug 1997 02:58:51 +0000 Subject: [PATCH] Store attr DEFAULT info in heap_create --- src/backend/catalog/heap.c | 119 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 117 insertions(+), 2 deletions(-) diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 989114be8d..5f3be132c5 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.20 1997/08/21 03:01:21 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.21 1997/08/22 02:58:51 vadim Exp $ * * INTERFACE ROUTINES * heap_creatr() - Create an uncataloged heap relation @@ -39,10 +39,13 @@ #include #include #include +#include +#include #include #include #include #include +#include #include #include #include @@ -64,6 +67,9 @@ static void RelationRemoveIndexes(Relation relation); static void RelationRemoveInheritance(Relation relation); static void RemoveFromTempRelList(Relation r); static void addNewRelationType(char *typeName, Oid new_rel_oid); +static void StoreConstraints (Relation rel); +static void StoreAttrDefault (Relation rel, AttrDefault *attrdef); +static void StoreRelCheck (Relation rel, ConstrCheck *check); /* ---------------------------------------------------------------- @@ -272,7 +278,7 @@ heap_creatr(char *name, /* ---------- create a new tuple descriptor from the one passed in */ - rdesc->rd_att = CreateTupleDescCopy(tupDesc); + rdesc->rd_att = CreateTupleDescCopyConstr(tupDesc); /* ---------------- * initialize the fields of our new relation descriptor @@ -298,6 +304,8 @@ heap_creatr(char *name, rdesc->rd_rel->relkind = RELKIND_UNCATALOGED; rdesc->rd_rel->relnatts = natts; rdesc->rd_rel->relsmgr = smgr; + if ( tupDesc->constr ) + rdesc->rd_rel->relchecks = tupDesc->constr->num_check; for (i = 0; i < natts; i++) { rdesc->rd_att->attrs[i]->attrelid = relid; @@ -814,6 +822,8 @@ heap_create(char relname[], arch, natts); + StoreConstraints (new_rel_desc); + /* ---------------- * ok, the relation has been cataloged, so close our relations * and return the oid of the newly created relation. @@ -1458,3 +1468,108 @@ DestroyTempRels(void) tempRels = NULL; } +static void +StoreConstraints (Relation rel) +{ + TupleConstr *constr = rel->rd_att->constr; + int i; + + if ( !constr ) + return; + + if ( constr->num_defval > 0 ) + { + for (i = 0; i < constr->num_defval; i++) + StoreAttrDefault (rel, &(constr->defval[i])); + } + + if ( constr->num_check > 0 ) + { + for (i = 0; i < constr->num_check; i++) + StoreRelCheck (rel, &(constr->check[i])); + } + + return; +} + +extern List *flatten_tlist(List *tlist); +extern List *pg_plan(char *query_string, Oid *typev, int nargs, + QueryTreeList **queryListP, CommandDest dest); + +static void +StoreAttrDefault (Relation rel, AttrDefault *attrdef) +{ + char str[MAX_PARSE_BUFFER]; + char cast[2*NAMEDATALEN] = {0}; + AttributeTupleForm atp = rel->rd_att->attrs[attrdef->adnum - 1]; + QueryTreeList *queryTree_list; + Query *query; + List *planTree_list; + TargetEntry *te; + Resdom *resdom; + Node *expr; + char *adbin; + MemoryContext oldcxt; + Relation adrel; + Relation idescs[Num_pg_attrdef_indices]; + HeapTuple tuple; + Datum values[4]; + char nulls[4] = {' ', ' ', ' ', ' '}; + extern GlobalMemory CacheCxt; + +start:; + sprintf (str, "select %s%s from %.*s", attrdef->adsrc, cast, + NAMEDATALEN, rel->rd_rel->relname.data); + planTree_list = (List*) pg_plan (str, NULL, 0, &queryTree_list, None); + query = (Query*) (queryTree_list->qtrees[0]); + + if ( length (query->rtable) > 1 || + flatten_tlist (query->targetList) != NIL ) + elog (WARN, "AttributeDefault: cannot use attribute(s)"); + te = (TargetEntry *) lfirst (query->targetList); + resdom = te->resdom; + expr = te->expr; + + if ( IsA (expr, Const) ) + { + if ( ((Const*)expr)->consttype != atp->atttypid ) + { + if ( *cast != 0 ) + elog (WARN, "AttributeDefault: casting failed - const type mismatched"); + sprintf (cast, ":: %s", get_id_typname (atp->atttypid)); + goto start; + } + } + else if ( exprType (expr) != atp->atttypid ) + elog (WARN, "AttributeDefault: type mismatched"); + + adbin = nodeToString (expr); + oldcxt = MemoryContextSwitchTo ((MemoryContext) CacheCxt); + attrdef->adbin = (char*) palloc (strlen (adbin) + 1); + strcpy (attrdef->adbin, adbin); + (void) MemoryContextSwitchTo (oldcxt); + pfree (adbin); + + values[Anum_pg_attrdef_adrelid - 1] = rel->rd_id; + values[Anum_pg_attrdef_adnum - 1] = attrdef->adnum; + values[Anum_pg_attrdef_adbin - 1] = PointerGetDatum (textin (attrdef->adbin)); + values[Anum_pg_attrdef_adsrc - 1] = PointerGetDatum (textin (attrdef->adsrc)); + adrel = heap_openr (AttrDefaultRelationName); + tuple = heap_formtuple (adrel->rd_att, values, nulls); + CatalogOpenIndices (Num_pg_attrdef_indices, Name_pg_attrdef_indices, idescs); + heap_insert (adrel, tuple); + CatalogIndexInsert (idescs, Num_pg_attrdef_indices, adrel, tuple); + CatalogCloseIndices (Num_pg_attrdef_indices, idescs); + + pfree (DatumGetPointer(values[Anum_pg_attrdef_adbin - 1])); + pfree (DatumGetPointer(values[Anum_pg_attrdef_adsrc - 1])); + pfree (tuple); + +} + +static void +StoreRelCheck (Relation rel, ConstrCheck *check) +{ + + return; +} -- 2.11.0