Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitc3a960a

Browse files
committed
Fix for SELECT * INTO TABLE for char(), varchar() fields.
1 parentad01dd2 commitc3a960a

File tree

3 files changed

+79
-3
lines changed

3 files changed

+79
-3
lines changed

‎src/backend/executor/execMain.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
*
2727
*
2828
* IDENTIFICATION
29-
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.12 1997/04/02 04:04:11 vadim Exp $
29+
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.13 1997/05/31 16:52:00 momjian Exp $
3030
*
3131
*-------------------------------------------------------------------------
3232
*/
@@ -530,13 +530,18 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
530530
*/
531531
intoName=parseTree->into;
532532
archiveMode='n';
533+
534+
/* fixup to prevent zero-length columns in create */
535+
setVarAttrLenForCreateTable(tupType,targetList,rangeTable);
533536

534537
intoRelationId=heap_create(intoName,
535538
intoName,/* not used */
536539
archiveMode,
537540
DEFAULT_SMGR,
538541
tupType);
539542

543+
resetVarAttrLenForCreateTable(tupType);
544+
540545
/* ----------------
541546
* XXX rather than having to call setheapoverride(true)
542547
*and then back to false, we should change the

‎src/backend/executor/execUtils.c

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.7 1997/01/10 09:58:53 vadim Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.8 1997/05/31 16:52:02 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -55,6 +55,8 @@
5555
#include"catalog/index.h"
5656
#include"catalog/catname.h"
5757
#include"catalog/pg_proc.h"
58+
#include"catalog/pg_type.h"
59+
#include"parser/parsetree.h"
5860

5961
/* ----------------------------------------------------------------
6062
* global counters for number of tuples processed, retrieved,
@@ -1122,3 +1124,69 @@ ExecInsertIndexTuples(TupleTableSlot *slot,
11221124
}
11231125
if (econtext!=NULL)pfree(econtext);
11241126
}
1127+
1128+
/* ----------------------------------------------------------------
1129+
* setVarAttrLenForCreateTable -
1130+
* called when we do a SELECT * INTO TABLE tab
1131+
* needed for attributes that have a defined length, like bpchar and
1132+
* varchar
1133+
* ----------------------------------------------------------------
1134+
*/
1135+
void
1136+
setVarAttrLenForCreateTable(TupleDesctupType,List*targetList,
1137+
List*rangeTable)
1138+
{
1139+
List*tl;
1140+
TargetEntry*tle;
1141+
Node*expr;
1142+
intvarno;
1143+
1144+
tl=targetList;
1145+
1146+
for (varno=0;varno<tupType->natts;varno++) {
1147+
tle=lfirst(tl);
1148+
1149+
if (tupType->attrs[varno]->atttypid==BPCHAROID||
1150+
tupType->attrs[varno]->atttypid==VARCHAROID) {
1151+
expr=tle->expr;
1152+
if (expr&&IsA(expr,Var)) {
1153+
Var*var;
1154+
RangeTblEntry*rtentry;
1155+
Relationrd;
1156+
1157+
var= (Var*)expr;
1158+
rtentry=rt_fetch(var->varno,rangeTable);
1159+
rd=heap_open(rtentry->relid);
1160+
/* set length to that defined in relation */
1161+
tupType->attrs[varno]->attlen=
1162+
(*rd->rd_att->attrs[var->varattno-1]).attlen;
1163+
heap_close(rd);
1164+
}
1165+
else
1166+
elog(WARN,"setVarAttrLenForCreateTable: can't get length for variable-length field");
1167+
}
1168+
tl=lnext(tl);
1169+
}
1170+
}
1171+
1172+
1173+
/* ----------------------------------------------------------------
1174+
* resetVarAttrLenForCreateTable -
1175+
* called when we do a SELECT * INTO TABLE tab
1176+
* needed for attributes that have a defined length, like bpchar and
1177+
* varchar
1178+
* resets length to -1 for those types
1179+
* ----------------------------------------------------------------
1180+
*/
1181+
void
1182+
resetVarAttrLenForCreateTable(TupleDesctupType)
1183+
{
1184+
intvarno;
1185+
1186+
for (varno=0;varno<tupType->natts;varno++) {
1187+
if (tupType->attrs[varno]->atttypid==BPCHAROID||
1188+
tupType->attrs[varno]->atttypid==VARCHAROID)
1189+
/* set length to original -1 */
1190+
tupType->attrs[varno]->attlen=-1;
1191+
}
1192+
}

‎src/include/executor/executor.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
* Copyright (c) 1994, Regents of the University of California
88
*
9-
* $Id: executor.h,v 1.7 1996/12/26 17:53:40 momjian Exp $
9+
* $Id: executor.h,v 1.8 1997/05/31 16:52:19 momjian Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -174,6 +174,9 @@ extern IndexTuple ExecFormIndexTuple(HeapTuple heapTuple,
174174
RelationheapRelation,RelationindexRelation,IndexInfo*indexInfo);
175175
externvoidExecInsertIndexTuples(TupleTableSlot*slot,ItemPointertupleid,
176176
EState*estate,boolis_update);
177+
externvoidresetVarAttrLenForCreateTable(TupleDesctupType);
178+
externvoidsetVarAttrLenForCreateTable(TupleDesctupType,
179+
List*targetList,List*rangeTable);
177180

178181

179182
/* ----------------------------------------------------------------

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp