88 *
99 *
1010 * 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 $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
@@ -32,10 +32,12 @@ static int _SPI_connected = -1;
3232static int _SPI_curid = -1 ;
3333
3434static 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 );
3637
3738static 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 );
3941
4042static void _SPI_cursor_operation (Portal portal , bool forward , int count ,
4143 DestReceiver * dest );
@@ -236,7 +238,33 @@ SPI_execp(void *plan, Datum *Values, const char *Nulls, int tcount)
236238 if (res < 0 )
237239 return res ;
238240
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 );
240268
241269 _SPI_end_call (true);
242270 return res ;
@@ -1068,7 +1096,7 @@ _SPI_execute(const char *src, int tcount, _SPI_plan *plan)
10681096 {
10691097 qdesc = CreateQueryDesc (queryTree , planTree , dest ,
10701098 NULL , false);
1071- res = _SPI_pquery (qdesc , true,
1099+ res = _SPI_pquery (qdesc , true, false,
10721100 queryTree -> canSetTag ? tcount : 0 );
10731101 if (res < 0 )
10741102 return res ;
@@ -1078,7 +1106,7 @@ _SPI_execute(const char *src, int tcount, _SPI_plan *plan)
10781106 {
10791107 qdesc = CreateQueryDesc (queryTree , planTree , dest ,
10801108 NULL , false);
1081- res = _SPI_pquery (qdesc , false, 0 );
1109+ res = _SPI_pquery (qdesc , false, false, 0 );
10821110 if (res < 0 )
10831111 return res ;
10841112 }
@@ -1096,7 +1124,7 @@ _SPI_execute(const char *src, int tcount, _SPI_plan *plan)
10961124
10971125static int
10981126_SPI_execute_plan (_SPI_plan * plan , Datum * Values , const char * Nulls ,
1099- int tcount )
1127+ bool useSnapshotNow , int tcount )
11001128{
11011129 List * query_list_list = plan -> qtlist ;
11021130 List * plan_list = plan -> ptlist ;
@@ -1167,7 +1195,7 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, const char *Nulls,
11671195 {
11681196 qdesc = CreateQueryDesc (queryTree , planTree , dest ,
11691197 paramLI , false);
1170- res = _SPI_pquery (qdesc , true,
1198+ res = _SPI_pquery (qdesc , true, useSnapshotNow ,
11711199 queryTree -> canSetTag ? tcount : 0 );
11721200 if (res < 0 )
11731201 return res ;
@@ -1180,7 +1208,7 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, const char *Nulls,
11801208}
11811209
11821210static int
1183- _SPI_pquery (QueryDesc * queryDesc , bool runit , int tcount )
1211+ _SPI_pquery (QueryDesc * queryDesc , bool runit , bool useSnapshotNow , int tcount )
11841212{
11851213 int operation = queryDesc -> operation ;
11861214 int res ;
@@ -1217,7 +1245,7 @@ _SPI_pquery(QueryDesc *queryDesc, bool runit, int tcount)
12171245 ResetUsage ();
12181246#endif
12191247
1220- ExecutorStart (queryDesc , false);
1248+ ExecutorStart (queryDesc , useSnapshotNow , false);
12211249
12221250 ExecutorRun (queryDesc , ForwardScanDirection , (long ) tcount );
12231251
0 commit comments