8
8
*
9
9
*
10
10
* IDENTIFICATION
11
- * $Header: /cvsroot/pgsql/src/backend/executor/spi.c,v 1.105 2003/09/23 15:11:33 tgl Exp $
11
+ * $Header: /cvsroot/pgsql/src/backend/executor/spi.c,v 1.106 2003/09/25 18:58:35 tgl Exp $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -32,10 +32,12 @@ static int _SPI_connected = -1;
32
32
static int _SPI_curid = -1 ;
33
33
34
34
static int _SPI_execute (const char * src , int tcount , _SPI_plan * plan );
35
- static int _SPI_pquery (QueryDesc * queryDesc , bool runit , int tcount );
35
+ static int _SPI_pquery (QueryDesc * queryDesc , bool runit ,
36
+ bool useSnapshotNow , int tcount );
36
37
37
38
static int _SPI_execute_plan (_SPI_plan * plan ,
38
- Datum * Values , const char * Nulls , int tcount );
39
+ Datum * Values , const char * Nulls ,
40
+ bool useSnapshotNow , int tcount );
39
41
40
42
static void _SPI_cursor_operation (Portal portal , bool forward , int count ,
41
43
DestReceiver * dest );
@@ -236,7 +238,33 @@ SPI_execp(void *plan, Datum *Values, const char *Nulls, int tcount)
236
238
if (res < 0 )
237
239
return res ;
238
240
239
- res = _SPI_execute_plan ((_SPI_plan * ) plan , Values , Nulls , tcount );
241
+ res = _SPI_execute_plan ((_SPI_plan * ) plan , Values , Nulls , false, tcount );
242
+
243
+ _SPI_end_call (true);
244
+ return res ;
245
+ }
246
+
247
+ /*
248
+ * SPI_execp_now -- identical to SPI_execp, except that we use SnapshotNow
249
+ * instead of the normal QuerySnapshot. This is currently not documented
250
+ * in spi.sgml because it is only intended for use by RI triggers.
251
+ */
252
+ int
253
+ SPI_execp_now (void * plan , Datum * Values , const char * Nulls , int tcount )
254
+ {
255
+ int res ;
256
+
257
+ if (plan == NULL || tcount < 0 )
258
+ return SPI_ERROR_ARGUMENT ;
259
+
260
+ if (((_SPI_plan * ) plan )-> nargs > 0 && Values == NULL )
261
+ return SPI_ERROR_PARAM ;
262
+
263
+ res = _SPI_begin_call (true);
264
+ if (res < 0 )
265
+ return res ;
266
+
267
+ res = _SPI_execute_plan ((_SPI_plan * ) plan , Values , Nulls , true, tcount );
240
268
241
269
_SPI_end_call (true);
242
270
return res ;
@@ -1068,7 +1096,7 @@ _SPI_execute(const char *src, int tcount, _SPI_plan *plan)
1068
1096
{
1069
1097
qdesc = CreateQueryDesc (queryTree , planTree , dest ,
1070
1098
NULL , false);
1071
- res = _SPI_pquery (qdesc , true,
1099
+ res = _SPI_pquery (qdesc , true, false,
1072
1100
queryTree -> canSetTag ? tcount : 0 );
1073
1101
if (res < 0 )
1074
1102
return res ;
@@ -1078,7 +1106,7 @@ _SPI_execute(const char *src, int tcount, _SPI_plan *plan)
1078
1106
{
1079
1107
qdesc = CreateQueryDesc (queryTree , planTree , dest ,
1080
1108
NULL , false);
1081
- res = _SPI_pquery (qdesc , false, 0 );
1109
+ res = _SPI_pquery (qdesc , false, false, 0 );
1082
1110
if (res < 0 )
1083
1111
return res ;
1084
1112
}
@@ -1096,7 +1124,7 @@ _SPI_execute(const char *src, int tcount, _SPI_plan *plan)
1096
1124
1097
1125
static int
1098
1126
_SPI_execute_plan (_SPI_plan * plan , Datum * Values , const char * Nulls ,
1099
- int tcount )
1127
+ bool useSnapshotNow , int tcount )
1100
1128
{
1101
1129
List * query_list_list = plan -> qtlist ;
1102
1130
List * plan_list = plan -> ptlist ;
@@ -1167,7 +1195,7 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, const char *Nulls,
1167
1195
{
1168
1196
qdesc = CreateQueryDesc (queryTree , planTree , dest ,
1169
1197
paramLI , false);
1170
- res = _SPI_pquery (qdesc , true,
1198
+ res = _SPI_pquery (qdesc , true, useSnapshotNow ,
1171
1199
queryTree -> canSetTag ? tcount : 0 );
1172
1200
if (res < 0 )
1173
1201
return res ;
@@ -1180,7 +1208,7 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, const char *Nulls,
1180
1208
}
1181
1209
1182
1210
static int
1183
- _SPI_pquery (QueryDesc * queryDesc , bool runit , int tcount )
1211
+ _SPI_pquery (QueryDesc * queryDesc , bool runit , bool useSnapshotNow , int tcount )
1184
1212
{
1185
1213
int operation = queryDesc -> operation ;
1186
1214
int res ;
@@ -1217,7 +1245,7 @@ _SPI_pquery(QueryDesc *queryDesc, bool runit, int tcount)
1217
1245
ResetUsage ();
1218
1246
#endif
1219
1247
1220
- ExecutorStart (queryDesc , false);
1248
+ ExecutorStart (queryDesc , useSnapshotNow , false);
1221
1249
1222
1250
ExecutorRun (queryDesc , ForwardScanDirection , (long ) tcount );
1223
1251
0 commit comments