PL/Python result set slicing broken in Python 3

Started by Peter Eisentrautover 13 years ago9 messages
#1Peter Eisentraut
peter_e@gmx.net

This doesn't work anymore with Python 3:

rv = plpy.execute(...)
do_something(rv[0:1])

Apparently, they changed the C API for doing slicing, or rather made one
of the two APIs for it silently do nothing. Details are difficult to
find, but this email message seems to contain something:
<http://mail.python.org/pipermail/python-3000/2007-August/009851.html&gt;.

I'll try to sort this out sometime, but if someone wants to take a shot
at it, go ahead.

#2Jan Urbański
wulczer@wulczer.org
In reply to: Peter Eisentraut (#1)
Re: PL/Python result set slicing broken in Python 3

On 02/05/12 20:18, Peter Eisentraut wrote:

This doesn't work anymore with Python 3:

rv = plpy.execute(...)
do_something(rv[0:1])

Apparently, they changed the C API for doing slicing, or rather made one
of the two APIs for it silently do nothing. Details are difficult to
find, but this email message seems to contain something:
<http://mail.python.org/pipermail/python-3000/2007-August/009851.html&gt;.

I'll try to sort this out sometime, but if someone wants to take a shot
at it, go ahead.

Sounds ugly. I'll take a look.

Cheers,
Jan

#3Jan Urbański
wulczer@wulczer.org
In reply to: Jan Urbański (#2)
Re: PL/Python result set slicing broken in Python 3

On 03/05/12 11:04, Jan Urbański wrote:

On 02/05/12 20:18, Peter Eisentraut wrote:

This doesn't work anymore with Python 3:

rv = plpy.execute(...)
do_something(rv[0:1])

Apparently, they changed the C API for doing slicing, or rather made one
of the two APIs for it silently do nothing. Details are difficult to
find, but this email message seems to contain something:
<http://mail.python.org/pipermail/python-3000/2007-August/009851.html&gt;.

I'll try to sort this out sometime, but if someone wants to take a shot
at it, go ahead.

Sounds ugly. I'll take a look.

I found some instructions on how to deal with the Python 2/Python 3
slicing mess:

http://renesd.blogspot.com/2009/07/python3-c-api-simple-slicing-sqslice.html

Apparently you need that egregious hack in order to avoid code
duplication. I'll try to produce a patch over the weekend.

Cheers,
Jan

#4Jan Urbański
wulczer@wulczer.org
In reply to: Jan Urbański (#3)
1 attachment(s)
Re: PL/Python result set slicing broken in Python 3

On 04/05/12 20:00, Jan Urbański wrote:

On 03/05/12 11:04, Jan Urbański wrote:

On 02/05/12 20:18, Peter Eisentraut wrote:

This doesn't work anymore with Python 3:

rv = plpy.execute(...)
do_something(rv[0:1])

Sounds ugly. I'll take a look.

I found some instructions on how to deal with the Python 2/Python 3
slicing mess:

http://renesd.blogspot.com/2009/07/python3-c-api-simple-slicing-sqslice.html

Thanks to the helpful folk at #python I found out that the fix is much
easier. Attached is a patch that fixes the bug and passes regression
tests on Pythons 2.3 through 3.2.

Apparently once you implement PyMappingMethods.mp_subscript you can drop
PySequenceMethods.sq_slice, but I guess there's no harm in keeping it
(and I'm not sure it'd work on Python 2.3 with only mp_subscript
implemented).

Do we want to backpatch this? If so, I'd need to produce a version that
applies to the monolithic plpython.c file from the previous releases.

Cheers,
Jan

Attachments:

0001-Fix-slicing-support-for-result-objects-for-Python-3.patchtext/x-diff; name=0001-Fix-slicing-support-for-result-objects-for-Python-3.patchDownload
#5Robert Haas
robertmhaas@gmail.com
In reply to: Jan Urbański (#4)
Re: PL/Python result set slicing broken in Python 3

On Sat, May 5, 2012 at 4:45 PM, Jan Urbański <wulczer@wulczer.org> wrote:

I found some instructions on how to deal with the Python 2/Python 3
slicing mess:

http://renesd.blogspot.com/2009/07/python3-c-api-simple-slicing-sqslice.html

Thanks to the helpful folk at #python I found out that the fix is much
easier. Attached is a patch that fixes the bug and passes regression tests
on Pythons 2.3 through 3.2.

Apparently once you implement PyMappingMethods.mp_subscript you can drop
PySequenceMethods.sq_slice, but I guess there's no harm in keeping it (and
I'm not sure it'd work on Python 2.3 with only mp_subscript implemented).

Do we want to backpatch this? If so, I'd need to produce a version that
applies to the monolithic plpython.c file from the previous releases.

Did this get forgotten about?

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#6Peter Eisentraut
peter_e@gmx.net
In reply to: Robert Haas (#5)
Re: PL/Python result set slicing broken in Python 3

On tor, 2012-05-10 at 12:37 -0400, Robert Haas wrote:

On Sat, May 5, 2012 at 4:45 PM, Jan Urbański <wulczer@wulczer.org> wrote:

I found some instructions on how to deal with the Python 2/Python 3
slicing mess:

http://renesd.blogspot.com/2009/07/python3-c-api-simple-slicing-sqslice.html

Thanks to the helpful folk at #python I found out that the fix is much
easier. Attached is a patch that fixes the bug and passes regression tests
on Pythons 2.3 through 3.2.

Apparently once you implement PyMappingMethods.mp_subscript you can drop
PySequenceMethods.sq_slice, but I guess there's no harm in keeping it (and
I'm not sure it'd work on Python 2.3 with only mp_subscript implemented).

Do we want to backpatch this? If so, I'd need to produce a version that
applies to the monolithic plpython.c file from the previous releases.

Did this get forgotten about?

I'm working on it.

#7Peter Eisentraut
peter_e@gmx.net
In reply to: Jan Urbański (#4)
Re: PL/Python result set slicing broken in Python 3

On lör, 2012-05-05 at 22:45 +0200, Jan Urbański wrote:

Apparently once you implement PyMappingMethods.mp_subscript you can
drop PySequenceMethods.sq_slice, but I guess there's no harm in
keeping it (and I'm not sure it'd work on Python 2.3 with only
mp_subscript implemented).

Committed this now.

From test coverage reports, I now see that PLy_result_ass_item() is no
longer called. That's probably OK, if assignments are now handled
through the mapping methods. But should we remove the function then?

Do we want to backpatch this? If so, I'd need to produce a version
that applies to the monolithic plpython.c file from the previous
releases.

I don't think this should be backpatched.

#8Jan Urbański
wulczer@wulczer.org
In reply to: Peter Eisentraut (#7)
Re: PL/Python result set slicing broken in Python 3

On 10/05/12 19:45, Peter Eisentraut wrote:

On lör, 2012-05-05 at 22:45 +0200, Jan Urbański wrote:

Apparently once you implement PyMappingMethods.mp_subscript you can
drop PySequenceMethods.sq_slice, but I guess there's no harm in
keeping it (and I'm not sure it'd work on Python 2.3 with only
mp_subscript implemented).

Committed this now.

From test coverage reports, I now see that PLy_result_ass_item() is no
longer called. That's probably OK, if assignments are now handled
through the mapping methods. But should we remove the function then?

Have you tried on Python 2.3 as well? People on #python said that if you
implement the mapping functions, the sequence slicing functions are no
longer used, but maybe we should revisit for the next release, rather
than risk introducing a regression for the benefit of removing a few
dead lines.

Cheers,
Jan

#9Peter Eisentraut
peter_e@gmx.net
In reply to: Jan Urbański (#8)
Re: PL/Python result set slicing broken in Python 3

On fre, 2012-05-11 at 11:28 +0200, Jan Urbański wrote:

On 10/05/12 19:45, Peter Eisentraut wrote:

On lör, 2012-05-05 at 22:45 +0200, Jan Urbański wrote:

Apparently once you implement PyMappingMethods.mp_subscript you can
drop PySequenceMethods.sq_slice, but I guess there's no harm in
keeping it (and I'm not sure it'd work on Python 2.3 with only
mp_subscript implemented).

Committed this now.

From test coverage reports, I now see that PLy_result_ass_item() is no
longer called. That's probably OK, if assignments are now handled
through the mapping methods. But should we remove the function then?

Have you tried on Python 2.3 as well? People on #python said that if you
implement the mapping functions, the sequence slicing functions are no
longer used, but maybe we should revisit for the next release, rather
than risk introducing a regression for the benefit of removing a few
dead lines.

I did test Python 2.3, but you're right, we should leave this alone
during beta.