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 ,
4143DestReceiver * dest );
@@ -236,7 +238,33 @@ SPI_execp(void *plan, Datum *Values, const char *Nulls, int tcount)
236238if (res < 0 )
237239return 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);
242270return res ;
@@ -1068,7 +1096,7 @@ _SPI_execute(const char *src, int tcount, _SPI_plan *plan)
10681096{
10691097qdesc = CreateQueryDesc (queryTree ,planTree ,dest ,
10701098NULL , false);
1071- res = _SPI_pquery (qdesc , true,
1099+ res = _SPI_pquery (qdesc , true, false,
10721100queryTree -> canSetTag ?tcount :0 );
10731101if (res < 0 )
10741102return res ;
@@ -1078,7 +1106,7 @@ _SPI_execute(const char *src, int tcount, _SPI_plan *plan)
10781106{
10791107qdesc = CreateQueryDesc (queryTree ,planTree ,dest ,
10801108NULL , false);
1081- res = _SPI_pquery (qdesc , false,0 );
1109+ res = _SPI_pquery (qdesc , false,false, 0 );
10821110if (res < 0 )
10831111return 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{
11011129List * query_list_list = plan -> qtlist ;
11021130List * plan_list = plan -> ptlist ;
@@ -1167,7 +1195,7 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, const char *Nulls,
11671195{
11681196qdesc = CreateQueryDesc (queryTree ,planTree ,dest ,
11691197paramLI , false);
1170- res = _SPI_pquery (qdesc , true,
1198+ res = _SPI_pquery (qdesc , true,useSnapshotNow ,
11711199queryTree -> canSetTag ?tcount :0 );
11721200if (res < 0 )
11731201return 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{
11851213int operation = queryDesc -> operation ;
11861214int res ;
@@ -1217,7 +1245,7 @@ _SPI_pquery(QueryDesc *queryDesc, bool runit, int tcount)
12171245ResetUsage ();
12181246#endif
12191247
1220- ExecutorStart (queryDesc , false);
1248+ ExecutorStart (queryDesc ,useSnapshotNow , false);
12211249
12221250ExecutorRun (queryDesc ,ForwardScanDirection , (long )tcount );
12231251