Re: Python setof patch - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Re: Python setof patch |
Date | |
Msg-id | 200507041904.j64J4pQ11690@candle.pha.pa.us Whole thread Raw |
In response to | Python setof patch (Gerrit van Dyk <gvandyk@agileworks.net>) |
Responses |
Re: Python setof patch
|
List | pgsql-patches |
Patch applied. Thanks. --------------------------------------------------------------------------- Gerrit van Dyk wrote: > Hi, > > 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. > > Please feel free to email me if you experience any problems. > > My next project I am working in is to get the PL/Python module to return > records (ie. structured data) > > Regards > Gerrit van Dyk > AgileWorks (Pty) Ltd > diff -c -r -P orig/pgsql/src/pl/plpython/plpython.c new/pgsql/src/pl/plpython/plpython.c > *** orig/pgsql/src/pl/plpython/plpython.c 2005-06-15 10:55:02.000000000 +0200 > --- new/pgsql/src/pl/plpython/plpython.c 2005-06-14 14:12:01.000000000 +0200 > *************** > *** 286,291 **** > --- 286,294 ---- > 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,775 **** > --- 773,788 ---- > 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,2325 **** > --- 2330,2340 ---- > 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 > diff -c -r -P orig/pgsql/src/pl/plpython/sql/plpython_setof.sql new/pgsql/src/pl/plpython/sql/plpython_setof.sql > *** orig/pgsql/src/pl/plpython/sql/plpython_setof.sql 1970-01-01 02:00:00.000000000 +0200 > --- new/pgsql/src/pl/plpython/sql/plpython_setof.sql 2005-06-14 14:12:01.000000000 +0200 > *************** > *** 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; > > ---------------------------(end of broadcast)--------------------------- > TIP 9: the planner will ignore your desire to choose an index scan if your > joining column's datatypes do not match -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
pgsql-patches by date: