mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
This patch allows the PL/Python module to do (SRF) functions.
The patch was taken from the CVS version. I have modified the plpython.c file and have added a test sql script for testing the functionality. It was actually the script that was in the 8.0.3 version but have since been removed. In order to signal the end of a set, the called python function must simply return plpy.EndOfSet and the set would be returned. Gerrit van Dyk
This commit is contained in:
parent
109f079be6
commit
af8756713f
@ -29,7 +29,7 @@
|
||||
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.62 2005/05/06 17:24:55 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.63 2005/07/04 18:59:42 momjian Exp $
|
||||
*
|
||||
*********************************************************************
|
||||
*/
|
||||
@ -286,6 +286,9 @@ static PyObject *PLy_exc_error = NULL;
|
||||
static PyObject *PLy_exc_fatal = NULL;
|
||||
static PyObject *PLy_exc_spi_error = NULL;
|
||||
|
||||
/* End-of-set Indication */
|
||||
static PyObject *PLy_endofset = NULL;
|
||||
|
||||
/* some globals for the python module
|
||||
*/
|
||||
static char PLy_plan_doc[] = {
|
||||
@ -770,6 +773,16 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure * proc)
|
||||
fcinfo->isnull = true;
|
||||
rv = (Datum) NULL;
|
||||
}
|
||||
/* test for end-of-set condition */
|
||||
else if (fcinfo->flinfo->fn_retset && plrv == PLy_endofset)
|
||||
{
|
||||
ReturnSetInfo *rsi;
|
||||
|
||||
fcinfo->isnull = true;
|
||||
rv = (Datum)NULL;
|
||||
rsi = (ReturnSetInfo *)fcinfo->resultinfo;
|
||||
rsi->isDone = ExprEndResult;
|
||||
}
|
||||
else
|
||||
{
|
||||
fcinfo->isnull = false;
|
||||
@ -2317,9 +2330,11 @@ PLy_init_plpy(void)
|
||||
PLy_exc_error = PyErr_NewException("plpy.Error", NULL, NULL);
|
||||
PLy_exc_fatal = PyErr_NewException("plpy.Fatal", NULL, NULL);
|
||||
PLy_exc_spi_error = PyErr_NewException("plpy.SPIError", NULL, NULL);
|
||||
PLy_endofset = PyErr_NewException("plpy.EndOfSet",NULL,NULL);
|
||||
PyDict_SetItemString(plpy_dict, "Error", PLy_exc_error);
|
||||
PyDict_SetItemString(plpy_dict, "Fatal", PLy_exc_fatal);
|
||||
PyDict_SetItemString(plpy_dict, "SPIError", PLy_exc_spi_error);
|
||||
PyDict_SetItemString(plpy_dict, "EndOfSet", PLy_endofset);
|
||||
|
||||
/*
|
||||
* initialize main module, and add plpy
|
||||
|
12
src/pl/plpython/sql/plpython_setof.sql
Normal file
12
src/pl/plpython/sql/plpython_setof.sql
Normal file
@ -0,0 +1,12 @@
|
||||
|
||||
CREATE or replace FUNCTION test_setof() returns setof text
|
||||
AS
|
||||
'if GD.has_key("calls"):
|
||||
GD["calls"] = GD["calls"] + 1
|
||||
if GD["calls"] > 2:
|
||||
del GD["calls"]
|
||||
return plpy.EndOfSet
|
||||
else:
|
||||
GD["calls"] = 1
|
||||
return str(GD["calls"])'
|
||||
LANGUAGE plpythonu;
|
Loading…
Reference in New Issue
Block a user