On 2024-11-20 09:13 +0100, PG Doc comments form wrote:
> https://www.postgresql.org/docs/16/plpython-data.html#PLPYTHON-DATA-SET-RETURNING-FUNCS
> The code contains a misprint in the following section: Iterator (any
> object providing __iter__ and next methods)
>
> def next (self): must be: def __next__ (self):
>
> Also, the header - Iterator (any object providing __iter__ and next methods)
> should be Iterator (any object providing __iter__ and __next__ methods)
Good catch! That's a leftover from Python 2 and missed in commit
4228cabb72b after Python 2 was dropped in 15.0. Patch attached.
While looking at, we can also simplify a couple of plpython3u test
functions that still try res.next() before res.__next__(). Attached as
a separate patch.
--
Erik
diff --git a/doc/src/sgml/plpython.sgml b/doc/src/sgml/plpython.sgml
index e5d51d6e9f..bee817ea82 100644
--- a/doc/src/sgml/plpython.sgml
+++ b/doc/src/sgml/plpython.sgml
@@ -553,7 +553,7 @@ $$ LANGUAGE plpython3u;
<varlistentry>
<term>Iterator (any object providing <symbol>__iter__</symbol> and
- <symbol>next</symbol> methods)</term>
+ <symbol>__next__</symbol> methods)</term>
<listitem>
<para>
<programlisting>
@@ -569,7 +569,7 @@ AS $$
def __iter__ (self):
return self
- def next (self):
+ def __next__(self):
self.ndx += 1
if self.ndx == len(self.who):
raise StopIteration
diff --git a/src/pl/plpython/expected/plpython_spi.out b/src/pl/plpython/expected/plpython_spi.out
index 8853e2540d..7dfdd0d4a7 100644
--- a/src/pl/plpython/expected/plpython_spi.out
+++ b/src/pl/plpython/expected/plpython_spi.out
@@ -319,12 +319,7 @@ assert len(res.fetch(3)) == 1
assert len(res.fetch(3)) == 0
assert len(res.fetch(3)) == 0
try:
- # use next() or __next__(), the method name changed in
- # http://www.python.org/dev/peps/pep-3114/
- try:
- res.next()
- except AttributeError:
- res.__next__()
+ next(res)
except StopIteration:
pass
else:
@@ -334,11 +329,7 @@ CREATE FUNCTION cursor_mix_next_and_fetch() RETURNS int AS $$
res = plpy.cursor("select fname, lname from users order by fname")
assert len(res.fetch(2)) == 2
-item = None
-try:
- item = res.next()
-except AttributeError:
- item = res.__next__()
+item = next(res)
assert item['fname'] == 'rick'
assert len(res.fetch(2)) == 1
@@ -357,10 +348,7 @@ CREATE FUNCTION next_after_close() RETURNS int AS $$
res = plpy.cursor("select fname, lname from users")
res.close()
try:
- try:
- res.next()
- except AttributeError:
- res.__next__()
+ next(res)
except ValueError:
pass
else:
@@ -370,10 +358,7 @@ CREATE FUNCTION cursor_fetch_next_empty() RETURNS int AS $$
res = plpy.cursor("select fname, lname from users where false")
assert len(res.fetch(1)) == 0
try:
- try:
- res.next()
- except AttributeError:
- res.__next__()
+ next(res)
except StopIteration:
pass
else:
diff --git a/src/pl/plpython/sql/plpython_spi.sql b/src/pl/plpython/sql/plpython_spi.sql
index fcd113acaa..a1a8b9c824 100644
--- a/src/pl/plpython/sql/plpython_spi.sql
+++ b/src/pl/plpython/sql/plpython_spi.sql
@@ -218,12 +218,7 @@ assert len(res.fetch(3)) == 1
assert len(res.fetch(3)) == 0
assert len(res.fetch(3)) == 0
try:
- # use next() or __next__(), the method name changed in
- # http://www.python.org/dev/peps/pep-3114/
- try:
- res.next()
- except AttributeError:
- res.__next__()
+ next(res)
except StopIteration:
pass
else:
@@ -234,11 +229,7 @@ CREATE FUNCTION cursor_mix_next_and_fetch() RETURNS int AS $$
res = plpy.cursor("select fname, lname from users order by fname")
assert len(res.fetch(2)) == 2
-item = None
-try:
- item = res.next()
-except AttributeError:
- item = res.__next__()
+item = next(res)
assert item['fname'] == 'rick'
assert len(res.fetch(2)) == 1
@@ -259,10 +250,7 @@ CREATE FUNCTION next_after_close() RETURNS int AS $$
res = plpy.cursor("select fname, lname from users")
res.close()
try:
- try:
- res.next()
- except AttributeError:
- res.__next__()
+ next(res)
except ValueError:
pass
else:
@@ -273,10 +261,7 @@ CREATE FUNCTION cursor_fetch_next_empty() RETURNS int AS $$
res = plpy.cursor("select fname, lname from users where false")
assert len(res.fetch(1)) == 0
try:
- try:
- res.next()
- except AttributeError:
- res.__next__()
+ next(res)
except StopIteration:
pass
else: