mirror of
https://github.com/postgres/postgres.git
synced 2025-06-06 00:02:36 -04:00
Fix for SELECT * INTO TABLE for char(), varchar() fields.
This commit is contained in:
parent
ad01dd270d
commit
c3a960ad8a
@ -26,7 +26,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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;
|
intoName = parseTree->into;
|
||||||
archiveMode = 'n';
|
archiveMode = 'n';
|
||||||
|
|
||||||
|
/* fixup to prevent zero-length columns in create */
|
||||||
|
setVarAttrLenForCreateTable(tupType, targetList, rangeTable);
|
||||||
|
|
||||||
intoRelationId = heap_create(intoName,
|
intoRelationId = heap_create(intoName,
|
||||||
intoName, /* not used */
|
intoName, /* not used */
|
||||||
@ -537,6 +540,8 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
|
|||||||
DEFAULT_SMGR,
|
DEFAULT_SMGR,
|
||||||
tupType);
|
tupType);
|
||||||
|
|
||||||
|
resetVarAttrLenForCreateTable(tupType);
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* XXX rather than having to call setheapoverride(true)
|
* XXX rather than having to call setheapoverride(true)
|
||||||
* and then back to false, we should change the
|
* and then back to false, we should change the
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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/index.h"
|
||||||
#include "catalog/catname.h"
|
#include "catalog/catname.h"
|
||||||
#include "catalog/pg_proc.h"
|
#include "catalog/pg_proc.h"
|
||||||
|
#include "catalog/pg_type.h"
|
||||||
|
#include "parser/parsetree.h"
|
||||||
|
|
||||||
/* ----------------------------------------------------------------
|
/* ----------------------------------------------------------------
|
||||||
* global counters for number of tuples processed, retrieved,
|
* global counters for number of tuples processed, retrieved,
|
||||||
@ -1122,3 +1124,69 @@ ExecInsertIndexTuples(TupleTableSlot *slot,
|
|||||||
}
|
}
|
||||||
if (econtext != NULL) pfree(econtext);
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* 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);
|
Relation heapRelation, Relation indexRelation, IndexInfo *indexInfo);
|
||||||
extern void ExecInsertIndexTuples(TupleTableSlot *slot, ItemPointer tupleid,
|
extern void ExecInsertIndexTuples(TupleTableSlot *slot, ItemPointer tupleid,
|
||||||
EState *estate, bool is_update);
|
EState *estate, bool is_update);
|
||||||
|
extern void resetVarAttrLenForCreateTable(TupleDesc tupType);
|
||||||
|
extern void setVarAttrLenForCreateTable(TupleDesc tupType,
|
||||||
|
List *targetList, List *rangeTable);
|
||||||
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------
|
/* ----------------------------------------------------------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user