1
- <!-- $PostgreSQL: pgsql/doc/src/sgml/plpython.sgml,v 1.30 2006/05/26 19:23:09 adunstan Exp $ -->
1
+ <!-- $PostgreSQL: pgsql/doc/src/sgml/plpython.sgml,v 1.31 2006/09/02 12:30:01 momjian Exp $ -->
2
2
3
3
<chapter id="plpython">
4
4
<title>PL/Python - Python Procedural Language</title>
46
46
<title>PL/Python Functions</title>
47
47
48
48
<para>
49
- Functions in PL/Python are declared via theusual <xref
49
+ Functions in PL/Python are declared via thestandard <xref
50
50
linkend="sql-createfunction" endterm="sql-createfunction-title">
51
- syntax. For example:
51
+ syntax:
52
+
53
+ <programlisting>
54
+ CREATE FUNCTION <replaceable>funcname</replaceable> (<replaceable>argument-list</replaceable>)
55
+ RETURNS <replaceable>return-type</replaceable>
56
+ AS $$
57
+ # PL/Python function body
58
+ $$ LANGUAGE plpythonu;
59
+ </programlisting>
60
+ </para>
61
+
62
+ <para>
63
+ The body of a function is simply a Python script. When the function
64
+ is called, all unnamed arguments are passed as elements to the array
65
+ <varname>args[]</varname> and named arguments as ordinary variables to the
66
+ Python script. The result is returned from the Python code in the usual way,
67
+ with <literal>return</literal> or <literal>yield</literal> (in case of
68
+ a resultset statement).
69
+ </para>
70
+
71
+ <para>
72
+ For example, a function to return the greater of two integers can be
73
+ defined as:
74
+
52
75
<programlisting>
53
- CREATE FUNCTION myfunc(text) RETURNS text
54
- AS 'return args[0]'
55
- LANGUAGE plpythonu;
76
+ CREATE FUNCTION pymax (a integer, b integer)
77
+ RETURNS integer
78
+ AS $$
79
+ if a > b:
80
+ return a
81
+ return b
82
+ $$ LANGUAGE plpythonu;
56
83
</programlisting>
57
84
58
85
The Python code that is given as the body of the function definition
59
- gets transformed into a Python function.
60
- For example, the above results in
86
+ is transformed into a Python function. For example, the above results in
61
87
62
88
<programlisting>
63
- def __plpython_procedure_myfunc_23456():
64
- return args[0]
89
+ def __plpython_procedure_pymax_23456():
90
+ if a > b:
91
+ return a
92
+ return b
65
93
</programlisting>
66
94
67
95
assuming that 23456 is the OID assigned to the function by
68
96
<productname>PostgreSQL</productname>.
69
97
</para>
70
98
99
+ <para>
100
+ The <productname>PostgreSQL</> function parameters are available in
101
+ the global <varname>args</varname> list. In the
102
+ <function>pymax</function> example, <varname>args[0]</varname> contains
103
+ whatever was passed in as the first argument and
104
+ <varname>args[1]</varname> contains the second argument's value. Alternatively,
105
+ one can use named parameters as shown in the example above. This greatly simplifies
106
+ the reading and writing of <application>PL/Python</application> code.
107
+ </para>
108
+
109
+ <para>
110
+ If an SQL null value<indexterm><primary>null value</primary><secondary
111
+ sortas="PL/Python">PL/Python</secondary></indexterm> is passed to a
112
+ function, the argument value will appear as <symbol>None</symbol> in
113
+ Python. The above function definition will return the wrong answer for null
114
+ inputs. We could add <literal>STRICT</literal> to the function definition
115
+ to make <productname>PostgreSQL</productname> do something more reasonable:
116
+ if a null value is passed, the function will not be called at all,
117
+ but will just return a null result automatically. Alternatively,
118
+ we could check for null inputs in the function body:
119
+
120
+ <programlisting>
121
+ CREATE FUNCTION pymax (a integer, b integer)
122
+ RETURNS integer
123
+ AS $$
124
+ if (a is None) or (b is None):
125
+ return None
126
+ if a > b:
127
+ return a
128
+ return b
129
+ $$ LANGUAGE plpythonu;
130
+ </programlisting>
131
+
132
+ As shown above, to return an SQL null value from a PL/Python
133
+ function, return the value <symbol>None</symbol>. This can be done whether the
134
+ function is strict or not.
135
+ </para>
136
+
137
+ <para>
138
+ Composite-type arguments are passed to the function as Python mappings. The
139
+ element names of the mapping are the attribute names of the composite type.
140
+ If an attribute in the passed row has the null value, it has the value
141
+ <symbol>None</symbol> in the mapping. Here is an example:
142
+
143
+ <programlisting>
144
+ CREATE TABLE employee (
145
+ name text,
146
+ salary integer,
147
+ age integer
148
+ );
149
+
150
+ CREATE FUNCTION overpaid (e employee)
151
+ RETURNS boolean
152
+ AS $$
153
+ if e["salary"] > 200000:
154
+ return True
155
+ if (e["age"] < 30) and (e["salary"] > 100000):
156
+ return True
157
+ return False
158
+ $$ LANGUAGE plpythonu;
159
+ </programlisting>
160
+ </para>
161
+
162
+ <para>
163
+ There are multiple ways to return row or composite types from a Python
164
+ scripts. In following examples we assume to have:
165
+
166
+ <programlisting>
167
+ CREATE TABLE named_value (
168
+ name text,
169
+ value integer
170
+ );
171
+ </programlisting>
172
+ or
173
+ <programlisting>
174
+ CREATE TYPE named_value AS (
175
+ name text,
176
+ value integer
177
+ );
178
+ </programlisting>
179
+
180
+ <variablelist>
181
+ <varlistentry>
182
+ <term>Sequence types (tuple or list), but not <literal>set</literal> (because
183
+ it is not indexable)</term>
184
+ <listitem>
185
+ <para>
186
+ Returned sequence objects must have the same number of items as
187
+ composite types have fields. Item with index 0 is assigned to the first field
188
+ of the composite type, 1 to second and so on. For example:
189
+
190
+ <programlisting>
191
+ CREATE FUNCTION make_pair (name text, value integer)
192
+ RETURNS named_value
193
+ AS $$
194
+ return [ name, value ]
195
+ # or alternatively, as tuple: return ( name, value )
196
+ $$ LANGUAGE plpythonu;
197
+ </programlisting>
198
+
199
+ To return SQL null in any column, insert <symbol>None</symbol> at
200
+ the corresponding position.
201
+ </para>
202
+ </listitem>
203
+
204
+ <varlistentry>
205
+ <term>Mapping (dictionary)</term>
206
+ <listitem>
207
+ <para>
208
+ Value for a composite type's column is retrieved from the mapping with
209
+ the column name as key. Example:
210
+
211
+ <programlisting>
212
+ CREATE FUNCTION make_pair (name text, value integer)
213
+ RETURNS named_value
214
+ AS $$
215
+ return { "name": name, "value": value }
216
+ $$ LANGUAGE plpythonu;
217
+ </programlisting>
218
+
219
+ Additional dictionary key/value pairs are ignored. Missing keys are
220
+ treated as errors, i.e. to return an SQL null value for any column, insert
221
+ <symbol>None</symbol> with the corresponding column name as the key.
222
+ </para>
223
+ </listitem>
224
+
225
+ <varlistentry>
226
+ <term>Object (any object providing method <literal>__getattr__</literal>)</term>
227
+ <listitem>
228
+ <para>
229
+ Example:
230
+
231
+ <programlisting>
232
+ CREATE FUNCTION make_pair (name text, value integer)
233
+ RETURNS named_value
234
+ AS $$
235
+ class named_value:
236
+ def __init__ (self, n, v):
237
+ self.name = n
238
+ self.value = v
239
+ return named_value(name, value)
240
+
241
+ # or simply
242
+ class nv: pass
243
+ nv.name = name
244
+ nv.value = value
245
+ return nv
246
+ $$ LANGUAGE plpythonu;
247
+ </programlisting>
248
+ </para>
249
+ </listitem>
250
+ </varlistentry>
251
+ </variablelist>
252
+ </para>
253
+
71
254
<para>
72
255
If you do not provide a return value, Python returns the default
73
256
<symbol>None</symbol>. <application>PL/Python</application> translates
@@ -77,13 +260,100 @@ def __plpython_procedure_myfunc_23456():
77
260
</para>
78
261
79
262
<para>
80
- The <productname>PostgreSQL</> function parameters are available in
81
- the global <varname>args</varname> list. In the
82
- <function>myfunc</function> example, <varname>args[0]</> contains
83
- whatever was passed in as the text argument. For
84
- <literal>myfunc2(text, integer)</literal>, <varname>args[0]</>
85
- would contain the <type>text</type> argument and
86
- <varname>args[1]</varname> the <type>integer</type> argument.
263
+ A <application>PL/Python</application> function can also return sets of
264
+ scalar or composite types. There are serveral ways to achieve this because
265
+ the returned object is internally turned into an iterator. For following
266
+ examples, let's assume to have composite type:
267
+
268
+ <programlisting>
269
+ CREATE TYPE greeting AS (
270
+ how text,
271
+ who text
272
+ );
273
+ </programlisting>
274
+
275
+ Currently known iterable types are:
276
+ <variablelist>
277
+ <varlistentry>
278
+ <term>Sequence types (tuple, list, set)</term>
279
+ <listitem>
280
+ <para>
281
+ <programlisting>
282
+ CREATE FUNCTION greet (how text)
283
+ RETURNS SETOF greeting
284
+ AS $$
285
+ # return tuple containing lists as composite types
286
+ # all other combinations work also
287
+ return ( [ how, "World" ], [ how, "PostgreSQL" ], [ how, "PL/Python" ] )
288
+ $$ LANGUAGE plpythonu;
289
+ </programlisting>
290
+ </para>
291
+ </listitem>
292
+ </varlistentry>
293
+
294
+ <varlistentry>
295
+ <term>Iterator (any object providing <symbol>__iter__</symbol> and
296
+ <symbol>next</symbol> methods)</term>
297
+ <listitem>
298
+ <para>
299
+ <programlisting>
300
+ CREATE FUNCTION greet (how text)
301
+ RETURNS SETOF greeting
302
+ AS $$
303
+ class producer:
304
+ def __init__ (self, how, who):
305
+ self.how = how
306
+ self.who = who
307
+ self.ndx = -1
308
+
309
+ def __iter__ (self):
310
+ return self
311
+
312
+ def next (self):
313
+ self.ndx += 1
314
+ if self.ndx == len(self.who):
315
+ raise StopIteration
316
+ return ( self.how, self.who[self.ndx] )
317
+
318
+ return producer(how, [ "World", "PostgreSQL", "PL/Python" ])
319
+ $$ LANGUAGE plpythonu;
320
+ </programlisting>
321
+ </para>
322
+ </listitem>
323
+ </varlistentry>
324
+
325
+ <varlistentry>
326
+ <term>Generator (<literal>yield</literal>)</term>
327
+ <listitem>
328
+ <para>
329
+ <programlisting>
330
+ CREATE FUNCTION greet (how text)
331
+ RETURNS SETOF greeting
332
+ AS $$
333
+ for who in [ "World", "PostgreSQL", "PL/Python" ]:
334
+ yield ( how, who )
335
+ $$ LANGUAGE plpythonu;
336
+ </programlisting>
337
+
338
+ <warning>
339
+ <para>
340
+ Currently, due to Python
341
+ <ulink url="http://sourceforge.net/tracker/index.php?func=detail&aid=1483133&group_id=5470&atid=105470">bug #1483133</ulink>,
342
+ some debug versions of Python 2.4
343
+ (configured and compiled with option <literal>--with-pydebug</literal>)
344
+ are known to crash the <productname>PostgreSQL</productname> server.
345
+ Unpatched versions of Fedora 4 contain this bug.
346
+ It does not happen in production version of Python or on patched
347
+ versions of Fedora 4.
348
+ </para>
349
+ </warning>
350
+ </para>
351
+ </listitem>
352
+ </varlistentry>
353
+ </variablelist>
354
+
355
+ Whenever new iterable types are added to Python language,
356
+ <application>PL/Python</application> is ready to use it.
87
357
</para>
88
358
89
359
<para>