From c3a960ad8a1c8c528ab70d561ca8b3c67866b0d0 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sat, 31 May 1997 16:52:19 +0000 Subject: [PATCH] Fix for SELECT * INTO TABLE for char(), varchar() fields. --- src/backend/executor/execMain.c | 7 +++- src/backend/executor/execUtils.c | 70 +++++++++++++++++++++++++++++++++++++++- src/include/executor/executor.h | 5 ++- 3 files changed, 79 insertions(+), 3 deletions(-) diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 6d513b6a1d..fd4f5fe684 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -26,7 +26,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.12 1997/04/02 04:04:11 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.13 1997/05/31 16:52:00 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -530,6 +530,9 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate) */ intoName = parseTree->into; archiveMode = 'n'; + + /* fixup to prevent zero-length columns in create */ + setVarAttrLenForCreateTable(tupType, targetList, rangeTable); intoRelationId = heap_create(intoName, intoName, /* not used */ @@ -537,6 +540,8 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate) DEFAULT_SMGR, tupType); + resetVarAttrLenForCreateTable(tupType); + /* ---------------- * XXX rather than having to call setheapoverride(true) * and then back to false, we should change the diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index bd315db65c..ac98553767 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; + } +} diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index 3bf8324c25..c3a58716c5 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: executor.h,v 1.7 1996/12/26 17:53:40 momjian Exp $ + * $Id: executor.h,v 1.8 1997/05/31 16:52:19 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -174,6 +174,9 @@ extern IndexTuple ExecFormIndexTuple(HeapTuple heapTuple, Relation heapRelation, Relation indexRelation, IndexInfo *indexInfo); extern void ExecInsertIndexTuples(TupleTableSlot *slot, ItemPointer tupleid, EState *estate, bool is_update); +extern void resetVarAttrLenForCreateTable(TupleDesc tupType); +extern void setVarAttrLenForCreateTable(TupleDesc tupType, + List *targetList, List *rangeTable); /* ---------------------------------------------------------------- -- 2.11.0