diff options
author | Bruce Momjian <bruce@momjian.us> | 1997-05-31 16:52:19 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 1997-05-31 16:52:19 +0000 |
commit | c3a960ad8a1c8c528ab70d561ca8b3c67866b0d0 (patch) | |
tree | 1c8aa06a84324f6601a64323219334ea14969e42 /src/backend/executor/execUtils.c | |
parent | ad01dd270df1c1011b16e79a4b510e8b4670fb58 (diff) | |
download | postgresql-c3a960ad8a1c8c528ab70d561ca8b3c67866b0d0.tar.gz postgresql-c3a960ad8a1c8c528ab70d561ca8b3c67866b0d0.zip |
Fix for SELECT * INTO TABLE for char(), varchar() fields.
Diffstat (limited to 'src/backend/executor/execUtils.c')
-rw-r--r-- | src/backend/executor/execUtils.c | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index bd315db65cd..ac985537678 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.7 1997/01/10 09:58:53 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.8 1997/05/31 16:52:02 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -55,6 +55,8 @@ #include "catalog/index.h" #include "catalog/catname.h" #include "catalog/pg_proc.h" +#include "catalog/pg_type.h" +#include "parser/parsetree.h" /* ---------------------------------------------------------------- * global counters for number of tuples processed, retrieved, @@ -1122,3 +1124,69 @@ ExecInsertIndexTuples(TupleTableSlot *slot, } if (econtext != NULL) pfree(econtext); } + +/* ---------------------------------------------------------------- + * setVarAttrLenForCreateTable - + * called when we do a SELECT * INTO TABLE tab + * needed for attributes that have a defined length, like bpchar and + * varchar + * ---------------------------------------------------------------- + */ +void +setVarAttrLenForCreateTable(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 (tupType->attrs[varno]->atttypid == BPCHAROID || + tupType->attrs[varno]->atttypid == VARCHAROID) { + expr = tle->expr; + if (expr && IsA(expr,Var)) { + Var *var; + RangeTblEntry *rtentry; + Relation rd; + + var = (Var *)expr; + rtentry = rt_fetch(var->varno, rangeTable); + rd = heap_open(rtentry->relid); + /* set length to that defined in relation */ + tupType->attrs[varno]->attlen = + (*rd->rd_att->attrs[var->varattno-1]).attlen; + heap_close(rd); + } + else + elog(WARN, "setVarAttrLenForCreateTable: can't get length for variable-length field"); + } + tl = lnext(tl); + } +} + + +/* ---------------------------------------------------------------- + * resetVarAttrLenForCreateTable - + * called when we do a SELECT * INTO TABLE tab + * needed for attributes that have a defined length, like bpchar and + * varchar + * resets length to -1 for those types + * ---------------------------------------------------------------- + */ +void +resetVarAttrLenForCreateTable(TupleDesc tupType) +{ + int varno; + + for (varno = 0; varno < tupType->natts; varno++) { + if (tupType->attrs[varno]->atttypid == BPCHAROID || + tupType->attrs[varno]->atttypid == VARCHAROID) + /* set length to original -1 */ + tupType->attrs[varno]->attlen = -1; + } +} |