1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-29 10:41:53 +03:00

Fix for SELECT * INTO TABLE for char(), varchar() fields.

This commit is contained in:
Bruce Momjian
1997-05-31 16:52:19 +00:00
parent ad01dd270d
commit c3a960ad8a
3 changed files with 79 additions and 3 deletions

View File

@ -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;
}
}