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

Commit4587547

Browse files
committed
Added: SPI_copytuple() & SPI_modifytuple()
1 parenta40a546 commit4587547

File tree

2 files changed

+108
-7
lines changed

2 files changed

+108
-7
lines changed

‎src/backend/executor/spi.c

Lines changed: 103 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ static void _SPI_fetch(FetchStmt * stmt);
4848
#endif
4949
staticint
5050
_SPI_execute_plan(_SPI_plan*plan,
51-
Datum*Values,char*Nulls,inttcount);
51+
Datum*Values,char*Nulls,inttcount);
5252

5353
#define_SPI_CPLAN_CURCXT0
5454
#define_SPI_CPLAN_PROCXT1
@@ -199,7 +199,7 @@ SPI_exec(char *src, int tcount)
199199
}
200200

201201
int
202-
SPI_execp(void*plan,Datum*Values,char*Nulls,inttcount)
202+
SPI_execp(void*plan,Datum*Values,char*Nulls,inttcount)
203203
{
204204
intres;
205205

@@ -278,11 +278,108 @@ SPI_saveplan(void *plan)
278278

279279
}
280280

281+
HeapTuple
282+
SPI_copytuple(HeapTupletuple)
283+
{
284+
MemoryContextoldcxt=NULL;
285+
HeapTuplectuple;
286+
287+
if (tuple==NULL)
288+
{
289+
SPI_result=SPI_ERROR_ARGUMENT;
290+
return (NULL);
291+
}
292+
293+
if (_SPI_curid+1==_SPI_connected)/* connected */
294+
{
295+
if (_SPI_current!=&(_SPI_stack[_SPI_curid+1]))
296+
elog(FATAL,"SPI: stack corrupted");
297+
oldcxt=MemoryContextSwitchTo(_SPI_current->savedcxt);
298+
}
299+
300+
ctuple=heap_copytuple(tuple);
301+
302+
if (oldcxt)
303+
MemoryContextSwitchTo(oldcxt);
304+
305+
return (ctuple);
306+
}
307+
308+
HeapTuple
309+
SPI_modifytuple(Relationrel,HeapTupletuple,intnatts,int*attnum,
310+
Datum*Values,char*Nulls)
311+
{
312+
MemoryContextoldcxt=NULL;
313+
HeapTuplemtuple;
314+
intnumberOfAttributes;
315+
uint8infomask;
316+
Datum*v;
317+
char*n;
318+
boolisnull;
319+
inti;
320+
321+
if (rel==NULL||tuple==NULL||natts <=0||attnum==NULL||Values==NULL)
322+
{
323+
SPI_result=SPI_ERROR_ARGUMENT;
324+
return (NULL);
325+
}
326+
327+
if (_SPI_curid+1==_SPI_connected)/* connected */
328+
{
329+
if (_SPI_current!=&(_SPI_stack[_SPI_curid+1]))
330+
elog(FATAL,"SPI: stack corrupted");
331+
oldcxt=MemoryContextSwitchTo(_SPI_current->savedcxt);
332+
}
333+
SPI_result=0;
334+
numberOfAttributes=rel->rd_att->natts;
335+
v= (Datum*)palloc(numberOfAttributes*sizeof(Datum));
336+
n= (char*)palloc(numberOfAttributes*sizeof(char));
337+
338+
/* fetch old values and nulls */
339+
for (i=0;i<numberOfAttributes;i++)
340+
{
341+
v[i]=heap_getattr(tuple,InvalidBuffer,i+1,rel->rd_att,&isnull);
342+
n[i]= (isnull) ?'n' :' ';
343+
}
344+
345+
/* replace values and nulls */
346+
for (i=0;i<natts;i++)
347+
{
348+
if (attnum[i] <=0||attnum[i]>numberOfAttributes)
349+
break;
350+
v[attnum[i]-1]=Values[i];
351+
n[attnum[i]-1]= (Nulls&&Nulls[i]=='n') ?'n' :' ';
352+
}
353+
354+
if (i==natts)/* no errors in attnum[] */
355+
{
356+
mtuple=heap_formtuple(rel->rd_att,v,n);
357+
infomask=mtuple->t_infomask;
358+
memmove(&(mtuple->t_ctid),&(tuple->t_ctid),
359+
((char*)&(tuple->t_hoff)- (char*)&(tuple->t_ctid)));
360+
mtuple->t_infomask=infomask;
361+
mtuple->t_natts=numberOfAttributes;
362+
}
363+
else
364+
{
365+
mtuple=NULL;
366+
SPI_result=SPI_ERROR_NOATTRIBUTE;
367+
}
368+
369+
pfree(v);
370+
pfree(n);
371+
372+
if (oldcxt)
373+
MemoryContextSwitchTo(oldcxt);
374+
375+
return (mtuple);
376+
}
377+
281378
int
282379
SPI_fnumber(TupleDesctupdesc,char*fname)
283380
{
284381
intres;
285-
382+
286383
for (res=0;res<tupdesc->natts;res++)
287384
{
288385
if (strcasecmp(tupdesc->attrs[res]->attname.data,fname)==0)
@@ -333,7 +430,7 @@ SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber)
333430
Datum
334431
SPI_getbinval(HeapTupletuple,TupleDesctupdesc,intfnumber,bool*isnull)
335432
{
336-
Datumval;
433+
Datumval;
337434

338435
*isnull= true;
339436
SPI_result=0;
@@ -539,7 +636,7 @@ _SPI_execute(char *src, int tcount, _SPI_plan * plan)
539636
}
540637

541638
staticint
542-
_SPI_execute_plan(_SPI_plan*plan,Datum*Values,char*Nulls,inttcount)
639+
_SPI_execute_plan(_SPI_plan*plan,Datum*Values,char*Nulls,inttcount)
543640
{
544641
QueryTreeList*queryTree_list=plan->qtlist;
545642
List*planTree_list=plan->ptlist;
@@ -591,7 +688,7 @@ _SPI_execute_plan(_SPI_plan * plan, Datum *Values, char *Nulls, int tcount)
591688
{
592689
paramLI->kind=PARAM_NUM;
593690
paramLI->id=k+1;
594-
paramLI->isnull= (Nulls!=NULL&&Nulls[k]!='n');
691+
paramLI->isnull= (Nulls&&Nulls[k]=='n');
595692
paramLI->value=Values[k];
596693
}
597694
paramLI->kind=PARAM_INVALID;

‎src/include/executor/spi.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,14 @@ extern intSPI_result;
7373
externintSPI_connect(void);
7474
externintSPI_finish(void);
7575
externintSPI_exec(char*src,inttcount);
76-
externintSPI_execp(void*plan,Datum*values,char*Nulls,inttcount);
76+
externintSPI_execp(void*plan,Datum*values,char*Nulls,inttcount);
7777
externvoid*SPI_prepare(char*src,intnargs,Oid*argtypes);
7878
externvoid*SPI_saveplan(void*plan);
7979

80+
externHeapTupleSPI_copytuple(HeapTupletuple);
81+
externHeapTuple
82+
SPI_modifytuple(Relationrel,HeapTupletuple,intnatts,
83+
int*attnum,Datum*Values,char*Nulls);
8084
externintSPI_fnumber(TupleDesctupdesc,char*fname);
8185
externchar*SPI_fname(TupleDesctupdesc,intfnumber);
8286
externchar*SPI_getvalue(HeapTupletuple,TupleDesctupdesc,intfnumber);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp