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

Commit2206b49

Browse files
committed
Simplify ParamListInfo data structure to support only numbered parameters,
not named ones, and replace linear searches of the list with array indexing.The named-parameter support has been dead code for many years anyway,and recent profiling suggests that the searching was costing a noticeableamount of performance for complex queries.
1 parent0606860 commit2206b49

File tree

20 files changed

+217
-338
lines changed

20 files changed

+217
-338
lines changed

‎src/backend/commands/prepare.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* Copyright (c) 2002-2006, PostgreSQL Global Development Group
1111
*
1212
* IDENTIFICATION
13-
* $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.49 2006/03/05 15:58:24 momjian Exp $
13+
* $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.50 2006/04/22 01:25:58 tgl Exp $
1414
*
1515
*-------------------------------------------------------------------------
1616
*/
@@ -247,30 +247,30 @@ EvaluateParams(EState *estate, List *params, List *argtypes)
247247
if (list_length(params)!=nargs)
248248
elog(ERROR,"wrong number of arguments");
249249

250+
if (nargs==0)
251+
returnNULL;
252+
250253
exprstates= (List*)ExecPrepareExpr((Expr*)params,estate);
251254

252-
paramLI= (ParamListInfo)
253-
palloc0((nargs+1)*sizeof(ParamListInfoData));
255+
/* sizeof(ParamListInfoData) includes the first array element */
256+
paramLI= (ParamListInfo)palloc(sizeof(ParamListInfoData)+
257+
(nargs-1)*sizeof(ParamExternData));
258+
paramLI->numParams=nargs;
254259

255260
forboth(le,exprstates,la,argtypes)
256261
{
257262
ExprState*n=lfirst(le);
258-
boolisNull;
263+
ParamExternData*prm=&paramLI->params[i];
259264

260-
paramLI[i].value=ExecEvalExprSwitchContext(n,
261-
GetPerTupleExprContext(estate),
262-
&isNull,
263-
NULL);
264-
paramLI[i].kind=PARAM_NUM;
265-
paramLI[i].id=i+1;
266-
paramLI[i].ptype=lfirst_oid(la);
267-
paramLI[i].isnull=isNull;
265+
prm->ptype=lfirst_oid(la);
266+
prm->value=ExecEvalExprSwitchContext(n,
267+
GetPerTupleExprContext(estate),
268+
&prm->isnull,
269+
NULL);
268270

269271
i++;
270272
}
271273

272-
paramLI[i].kind=PARAM_INVALID;
273-
274274
returnparamLI;
275275
}
276276

‎src/backend/executor/execQual.c

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.189 2006/03/10 01:51:23 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.190 2006/04/22 01:25:58 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -605,13 +605,12 @@ ExecEvalParam(ExprState *exprstate, ExprContext *econtext,
605605
bool*isNull,ExprDoneCond*isDone)
606606
{
607607
Param*expression= (Param*)exprstate->expr;
608-
intthisParamKind=expression->paramkind;
609-
AttrNumberthisParamId=expression->paramid;
608+
intthisParamId=expression->paramid;
610609

611610
if (isDone)
612611
*isDone=ExprSingleResult;
613612

614-
if (thisParamKind==PARAM_EXEC)
613+
if (expression->paramkind==PARAM_EXEC)
615614
{
616615
/*
617616
* PARAM_EXEC params (internal executor parameters) are stored in the
@@ -633,18 +632,27 @@ ExecEvalParam(ExprState *exprstate, ExprContext *econtext,
633632
else
634633
{
635634
/*
636-
*All other parameter types must be sought in ecxt_param_list_info.
635+
*PARAM_EXTERN parameters must be sought in ecxt_param_list_info.
637636
*/
638-
ParamListInfoparamInfo;
639-
640-
paramInfo=lookupParam(econtext->ecxt_param_list_info,
641-
thisParamKind,
642-
expression->paramname,
643-
thisParamId,
644-
false);
645-
Assert(paramInfo->ptype==expression->paramtype);
646-
*isNull=paramInfo->isnull;
647-
returnparamInfo->value;
637+
ParamListInfoparamInfo=econtext->ecxt_param_list_info;
638+
639+
Assert(expression->paramkind==PARAM_EXTERN);
640+
if (paramInfo&&
641+
thisParamId>0&&thisParamId <=paramInfo->numParams)
642+
{
643+
ParamExternData*prm=&paramInfo->params[thisParamId-1];
644+
645+
if (OidIsValid(prm->ptype))
646+
{
647+
Assert(prm->ptype==expression->paramtype);
648+
*isNull=prm->isnull;
649+
returnprm->value;
650+
}
651+
}
652+
ereport(ERROR,
653+
(errcode(ERRCODE_UNDEFINED_OBJECT),
654+
errmsg("no value found for parameter %d",thisParamId)));
655+
return (Datum)0;/* keep compiler quiet */
648656
}
649657
}
650658

‎src/backend/executor/functions.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/executor/functions.c,v 1.101 2006/03/05 15:58:26 momjian Exp $
11+
* $PostgreSQL: pgsql/src/backend/executor/functions.c,v 1.102 2006/04/22 01:25:58 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -431,17 +431,19 @@ postquel_sub_params(SQLFunctionCachePtr fcache,
431431
{
432432
inti;
433433

434-
paramLI= (ParamListInfo)palloc0((nargs+1)*sizeof(ParamListInfoData));
434+
/* sizeof(ParamListInfoData) includes the first array element */
435+
paramLI= (ParamListInfo)palloc(sizeof(ParamListInfoData)+
436+
(nargs-1)*sizeof(ParamExternData));
437+
paramLI->numParams=nargs;
435438

436439
for (i=0;i<nargs;i++)
437440
{
438-
paramLI[i].kind=PARAM_NUM;
439-
paramLI[i].id=i+1;
440-
paramLI[i].ptype=fcache->argtypes[i];
441-
paramLI[i].value=fcinfo->arg[i];
442-
paramLI[i].isnull=fcinfo->argnull[i];
441+
ParamExternData*prm=&paramLI->params[i];
442+
443+
prm->value=fcinfo->arg[i];
444+
prm->isnull=fcinfo->argnull[i];
445+
prm->ptype=fcache->argtypes[i];
443446
}
444-
paramLI[nargs].kind=PARAM_INVALID;
445447
}
446448
else
447449
paramLI=NULL;

‎src/backend/executor/spi.c

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.150 2006/04/04 19:35:34 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.151 2006/04/22 01:25:58 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -885,33 +885,33 @@ SPI_cursor_open(const char *name, void *plan,
885885
/* If the plan has parameters, set them up */
886886
if (spiplan->nargs>0)
887887
{
888-
paramLI= (ParamListInfo)palloc0((spiplan->nargs+1)*
889-
sizeof(ParamListInfoData));
888+
/* sizeof(ParamListInfoData) includes the first array element */
889+
paramLI= (ParamListInfo)palloc(sizeof(ParamListInfoData)+
890+
(spiplan->nargs-1)*sizeof(ParamExternData));
891+
paramLI->numParams=spiplan->nargs;
890892

891893
for (k=0;k<spiplan->nargs;k++)
892894
{
893-
paramLI[k].kind=PARAM_NUM;
894-
paramLI[k].id=k+1;
895-
paramLI[k].ptype=spiplan->argtypes[k];
896-
paramLI[k].isnull= (Nulls&&Nulls[k]=='n');
897-
if (paramLI[k].isnull)
895+
ParamExternData*prm=&paramLI->params[k];
896+
897+
prm->ptype=spiplan->argtypes[k];
898+
prm->isnull= (Nulls&&Nulls[k]=='n');
899+
if (prm->isnull)
898900
{
899901
/* nulls just copy */
900-
paramLI[k].value=Values[k];
902+
prm->value=Values[k];
901903
}
902904
else
903905
{
904906
/* pass-by-ref values must be copied into portal context */
905907
int16paramTypLen;
906908
boolparamTypByVal;
907909

908-
get_typlenbyval(spiplan->argtypes[k],
909-
&paramTypLen,&paramTypByVal);
910-
paramLI[k].value=datumCopy(Values[k],
911-
paramTypByVal,paramTypLen);
910+
get_typlenbyval(prm->ptype,&paramTypLen,&paramTypByVal);
911+
prm->value=datumCopy(Values[k],
912+
paramTypByVal,paramTypLen);
912913
}
913914
}
914-
paramLI[k].kind=PARAM_INVALID;
915915
}
916916
else
917917
paramLI=NULL;
@@ -1334,18 +1334,19 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, const char *Nulls,
13341334
{
13351335
intk;
13361336

1337-
paramLI= (ParamListInfo)
1338-
palloc0((nargs+1)*sizeof(ParamListInfoData));
1337+
/* sizeof(ParamListInfoData) includes the first array element */
1338+
paramLI= (ParamListInfo)palloc(sizeof(ParamListInfoData)+
1339+
(nargs-1)*sizeof(ParamExternData));
1340+
paramLI->numParams=nargs;
13391341

13401342
for (k=0;k<nargs;k++)
13411343
{
1342-
paramLI[k].kind=PARAM_NUM;
1343-
paramLI[k].id=k+1;
1344-
paramLI[k].ptype=plan->argtypes[k];
1345-
paramLI[k].isnull= (Nulls&&Nulls[k]=='n');
1346-
paramLI[k].value=Values[k];
1344+
ParamExternData*prm=&paramLI->params[k];
1345+
1346+
prm->value=Values[k];
1347+
prm->isnull= (Nulls&&Nulls[k]=='n');
1348+
prm->ptype=plan->argtypes[k];
13471349
}
1348-
paramLI[k].kind=PARAM_INVALID;
13491350
}
13501351
else
13511352
paramLI=NULL;

‎src/backend/nodes/copyfuncs.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* Portions Copyright (c) 1994, Regents of the University of California
1616
*
1717
* IDENTIFICATION
18-
* $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.333 2006/04/15 17:45:34 tgl Exp $
18+
* $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.334 2006/04/22 01:25:58 tgl Exp $
1919
*
2020
*-------------------------------------------------------------------------
2121
*/
@@ -729,7 +729,6 @@ _copyParam(Param *from)
729729

730730
COPY_SCALAR_FIELD(paramkind);
731731
COPY_SCALAR_FIELD(paramid);
732-
COPY_STRING_FIELD(paramname);
733732
COPY_SCALAR_FIELD(paramtype);
734733

735734
returnnewnode;

‎src/backend/nodes/equalfuncs.c

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
* Portions Copyright (c) 1994, Regents of the University of California
1919
*
2020
* IDENTIFICATION
21-
* $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.269 2006/04/15 17:45:34 tgl Exp $
21+
* $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.270 2006/04/22 01:25:59 tgl Exp $
2222
*
2323
*-------------------------------------------------------------------------
2424
*/
@@ -147,23 +147,9 @@ static bool
147147
_equalParam(Param*a,Param*b)
148148
{
149149
COMPARE_SCALAR_FIELD(paramkind);
150+
COMPARE_SCALAR_FIELD(paramid);
150151
COMPARE_SCALAR_FIELD(paramtype);
151152

152-
switch (a->paramkind)
153-
{
154-
casePARAM_NAMED:
155-
COMPARE_STRING_FIELD(paramname);
156-
break;
157-
casePARAM_NUM:
158-
casePARAM_EXEC:
159-
casePARAM_SUBLINK:
160-
COMPARE_SCALAR_FIELD(paramid);
161-
break;
162-
default:
163-
elog(ERROR,"unrecognized paramkind: %d",
164-
a->paramkind);
165-
}
166-
167153
return true;
168154
}
169155

‎src/backend/nodes/outfuncs.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.272 2006/03/23 00:19:29 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.273 2006/04/22 01:25:59 tgl Exp $
1212
*
1313
* NOTES
1414
* Every node type that can appear in stored rules' parsetrees *must*
@@ -624,9 +624,8 @@ _outParam(StringInfo str, Param *node)
624624
{
625625
WRITE_NODE_TYPE("PARAM");
626626

627-
WRITE_INT_FIELD(paramkind);
627+
WRITE_ENUM_FIELD(paramkind,ParamKind);
628628
WRITE_INT_FIELD(paramid);
629-
WRITE_STRING_FIELD(paramname);
630629
WRITE_OID_FIELD(paramtype);
631630
}
632631

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp