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

Commit57dd2ce

Browse files
committed
Make SPI's column-accessing functions work for system columns as well as
user columns. Needed for foreign keys on OID, but useful in general.
1 parent3e76c9a commit57dd2ce

File tree

1 file changed

+61
-21
lines changed
  • src/backend/executor

1 file changed

+61
-21
lines changed

‎src/backend/executor/spi.c

Lines changed: 61 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/executor/spi.c,v 1.58 2001/10/05 17:28:12 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/executor/spi.c,v 1.59 2001/10/23 17:38:25 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
1515
#include"postgres.h"
1616

1717
#include"access/printtup.h"
18+
#include"catalog/heap.h"
1819
#include"commands/command.h"
1920
#include"executor/spi_priv.h"
2021

@@ -435,28 +436,42 @@ int
435436
SPI_fnumber(TupleDesctupdesc,char*fname)
436437
{
437438
intres;
439+
Form_pg_attributesysatt;
438440

439441
for (res=0;res<tupdesc->natts;res++)
440442
{
441-
if (strcasecmp(NameStr(tupdesc->attrs[res]->attname),fname)==0)
443+
if (namestrcmp(&tupdesc->attrs[res]->attname,fname)==0)
442444
returnres+1;
443445
}
444446

447+
sysatt=SystemAttributeByName(fname, true/* "oid" will be accepted */);
448+
if (sysatt!=NULL)
449+
returnsysatt->attnum;
450+
451+
/* SPI_ERROR_NOATTRIBUTE is different from all sys column numbers */
445452
returnSPI_ERROR_NOATTRIBUTE;
446453
}
447454

448455
char*
449456
SPI_fname(TupleDesctupdesc,intfnumber)
450457
{
458+
Form_pg_attributeatt;
451459

452460
SPI_result=0;
453-
if (tupdesc->natts<fnumber||fnumber <=0)
461+
462+
if (fnumber>tupdesc->natts||fnumber==0||
463+
fnumber <=FirstLowInvalidHeapAttributeNumber)
454464
{
455465
SPI_result=SPI_ERROR_NOATTRIBUTE;
456466
returnNULL;
457467
}
458468

459-
returnpstrdup(NameStr(tupdesc->attrs[fnumber-1]->attname));
469+
if (fnumber>0)
470+
att=tupdesc->attrs[fnumber-1];
471+
else
472+
att=SystemAttributeDefinition(fnumber, true);
473+
474+
returnpstrdup(NameStr(att->attname));
460475
}
461476

462477
char*
@@ -466,12 +481,16 @@ SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber)
466481
val,
467482
result;
468483
boolisnull;
469-
Oidfoutoid,
484+
Oidtypoid,
485+
foutoid,
470486
typelem;
487+
int32typmod;
471488
booltypisvarlena;
472489

473490
SPI_result=0;
474-
if (tuple->t_data->t_natts<fnumber||fnumber <=0)
491+
492+
if (fnumber>tuple->t_data->t_natts||fnumber==0||
493+
fnumber <=FirstLowInvalidHeapAttributeNumber)
475494
{
476495
SPI_result=SPI_ERROR_NOATTRIBUTE;
477496
returnNULL;
@@ -480,8 +499,19 @@ SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber)
480499
origval=heap_getattr(tuple,fnumber,tupdesc,&isnull);
481500
if (isnull)
482501
returnNULL;
483-
if (!getTypeOutputInfo(tupdesc->attrs[fnumber-1]->atttypid,
484-
&foutoid,&typelem,&typisvarlena))
502+
503+
if (fnumber>0)
504+
{
505+
typoid=tupdesc->attrs[fnumber-1]->atttypid;
506+
typmod=tupdesc->attrs[fnumber-1]->atttypmod;
507+
}
508+
else
509+
{
510+
typoid= (SystemAttributeDefinition(fnumber, true))->atttypid;
511+
typmod=-1;
512+
}
513+
514+
if (!getTypeOutputInfo(typoid,&foutoid,&typelem,&typisvarlena))
485515
{
486516
SPI_result=SPI_ERROR_NOOUTFUNC;
487517
returnNULL;
@@ -499,7 +529,7 @@ SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber)
499529
result=OidFunctionCall3(foutoid,
500530
val,
501531
ObjectIdGetDatum(typelem),
502-
Int32GetDatum(tupdesc->attrs[fnumber-1]->atttypmod));
532+
Int32GetDatum(typmod));
503533

504534
/* Clean up detoasted copy, if any */
505535
if (val!=origval)
@@ -511,36 +541,42 @@ SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber)
511541
Datum
512542
SPI_getbinval(HeapTupletuple,TupleDesctupdesc,intfnumber,bool*isnull)
513543
{
514-
Datumval;
515-
516-
*isnull= true;
517544
SPI_result=0;
518-
if (tuple->t_data->t_natts<fnumber||fnumber <=0)
545+
546+
if (fnumber>tuple->t_data->t_natts||fnumber==0||
547+
fnumber <=FirstLowInvalidHeapAttributeNumber)
519548
{
520549
SPI_result=SPI_ERROR_NOATTRIBUTE;
550+
*isnull= true;
521551
return (Datum)NULL;
522552
}
523553

524-
val=heap_getattr(tuple,fnumber,tupdesc,isnull);
525-
526-
returnval;
554+
returnheap_getattr(tuple,fnumber,tupdesc,isnull);
527555
}
528556

529557
char*
530558
SPI_gettype(TupleDesctupdesc,intfnumber)
531559
{
560+
Oidtypoid;
532561
HeapTupletypeTuple;
533562
char*result;
534563

535564
SPI_result=0;
536-
if (tupdesc->natts<fnumber||fnumber <=0)
565+
566+
if (fnumber>tupdesc->natts||fnumber==0||
567+
fnumber <=FirstLowInvalidHeapAttributeNumber)
537568
{
538569
SPI_result=SPI_ERROR_NOATTRIBUTE;
539570
returnNULL;
540571
}
541572

573+
if (fnumber>0)
574+
typoid=tupdesc->attrs[fnumber-1]->atttypid;
575+
else
576+
typoid= (SystemAttributeDefinition(fnumber, true))->atttypid;
577+
542578
typeTuple=SearchSysCache(TYPEOID,
543-
ObjectIdGetDatum(tupdesc->attrs[fnumber-1]->atttypid),
579+
ObjectIdGetDatum(typoid),
544580
0,0,0);
545581

546582
if (!HeapTupleIsValid(typeTuple))
@@ -557,15 +593,19 @@ SPI_gettype(TupleDesc tupdesc, int fnumber)
557593
Oid
558594
SPI_gettypeid(TupleDesctupdesc,intfnumber)
559595
{
560-
561596
SPI_result=0;
562-
if (tupdesc->natts<fnumber||fnumber <=0)
597+
598+
if (fnumber>tupdesc->natts||fnumber==0||
599+
fnumber <=FirstLowInvalidHeapAttributeNumber)
563600
{
564601
SPI_result=SPI_ERROR_NOATTRIBUTE;
565602
returnInvalidOid;
566603
}
567604

568-
returntupdesc->attrs[fnumber-1]->atttypid;
605+
if (fnumber>0)
606+
returntupdesc->attrs[fnumber-1]->atttypid;
607+
else
608+
return (SystemAttributeDefinition(fnumber, true))->atttypid;
569609
}
570610

571611
char*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp