From c3a960ad8a1c8c528ab70d561ca8b3c67866b0d0 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sat, 31 May 1997 16:52:19 +0000 Subject: Fix for SELECT * INTO TABLE for char(), varchar() fields. --- src/backend/executor/execUtils.c | 70 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) (limited to 'src/backend/executor/execUtils.c') 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; + } +} -- cgit v1.2.3