diff options
Diffstat (limited to 'src/backend/executor/execUtils.c')
-rw-r--r-- | src/backend/executor/execUtils.c | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index 8d93ecf9cc0..9b02eb7f0e2 100644 --- a/src/backend/executor/execUtils.c +++ b/src/backend/executor/execUtils.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.24 1998/01/16 23:19:52 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.25 1998/01/19 02:37:33 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -1177,3 +1177,50 @@ ExecInsertIndexTuples(TupleTableSlot *slot, if (econtext != NULL) pfree(econtext); } + +/* ---------------------------------------------------------------- + * setAtttyplenForCreateTable - + * called when we do a SELECT * INTO TABLE tab + * needed for attributes that have atttypmod like bpchar and + * varchar + * ---------------------------------------------------------------- + */ +void +setAtttypmodForCreateTable(TupleDesc tupType, List *targetList, + List *rangeTable) +{ + List *tl; + TargetEntry *tle; + Node *expr; + int varno; + + tl = targetList; + + for (varno = 0; varno < tupType->natts; varno++) + { + tle = lfirst(tl); + + if (USE_ATTTYPMOD(tupType->attrs[varno]->atttypid)) + { + expr = tle->expr; + if (expr && IsA(expr, Var)) + { + Var *var; + RangeTblEntry *rtentry; + Relation rd; + + var = (Var *) expr; + rtentry = rt_fetch(var->varnoold, rangeTable); + rd = heap_open(rtentry->relid); + /* set length to that defined in relation */ + tupType->attrs[varno]->atttypmod = + (*rd->rd_att->attrs[var->varoattno - 1]).atttypmod; + heap_close(rd); + } + else + elog(ERROR, "setAtttypmodForCreateTable: can't get atttypmod for field (for length, etc.)"); + } + tl = lnext(tl); + } +} + |