1
0
mirror of https://github.com/postgres/postgres.git synced 2025-12-12 02:37:31 +03:00

PL/Python: Fix slicing support for result objects for Python 3

The old way of implementing slicing support by implementing
PySequenceMethods.sq_slice no longer works in Python 3.  You now have
to implement PyMappingMethods.mp_subscript.  Do this by simply
proxying the call to the wrapped list of result dictionaries.
Consolidate some of the subscripting regression tests.

Jan Urbański
This commit is contained in:
Peter Eisentraut
2012-05-10 20:38:17 +03:00
parent 1540d3bf4d
commit a97207b690
3 changed files with 116 additions and 36 deletions

View File

@@ -1,18 +1,3 @@
--
-- result objects
--
CREATE FUNCTION test_resultobject_access() RETURNS void
AS $$
rv = plpy.execute("SELECT fname, lname, username FROM users ORDER BY username")
plpy.info([row for row in rv])
rv[1] = dict([(k, v*2) for (k, v) in rv[1].items()])
plpy.info([row for row in rv])
$$ LANGUAGE plpythonu;
SELECT test_resultobject_access();
--
-- nested calls
--
@@ -147,6 +132,42 @@ SELECT result_len_test($$CREATE TEMPORARY TABLE foo3 (a int, b text)$$);
SELECT result_len_test($$INSERT INTO foo3 VALUES (1, 'one'), (2, 'two')$$);
SELECT result_len_test($$UPDATE foo3 SET b= '' WHERE a = 2$$);
CREATE FUNCTION result_subscript_test() RETURNS void
AS $$
result = plpy.execute("SELECT 1 AS c UNION SELECT 2 "
"UNION SELECT 3 UNION SELECT 4")
plpy.info(result[1]['c'])
plpy.info(result[-1]['c'])
plpy.info([item['c'] for item in result[1:3]])
plpy.info([item['c'] for item in result[::2]])
result[-1] = {'c': 1000}
result[:2] = [{'c': 10}, {'c': 100}]
plpy.info([item['c'] for item in result[:]])
# raises TypeError, but the message differs on Python 2.6, so silence it
try:
plpy.info(result['foo'])
except TypeError:
pass
else:
assert False, "TypeError not raised"
$$ LANGUAGE plpythonu;
SELECT result_subscript_test();
CREATE FUNCTION result_empty_test() RETURNS void
AS $$
result = plpy.execute("select 1 where false")
plpy.info(result[:])
$$ LANGUAGE plpythonu;
SELECT result_empty_test();
-- cursor objects