Psycopg 3.2.8 (unreleased)
^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Fix `DateFromTicks` and `TimeFromTicks` return values to return date and
- time referred as UTC rather than the local timezone. Change
- `TimestampFromTicks` to return a datetime in UTC rather than in the local
- timezone (:ticket:`#1058`).
+- Fix `DateFromTicks` and `TimeFromTicks` return values to return a date and a
+ time referred to the UTC timezone rather than to the local timezone. For
+ consistency, `TimestampFromTicks` to return a datetime in UTC rather than in
+ the local timezone (:ticket:`#1058`).
+- Fix `~Cursor.rownumber` after using `~AsyncServerCursor.scroll()` on
+ `AsyncServerCursor` (:ticket:`#1066`).
Current release
async def scroll(self, value: int, mode: str = "relative") -> None:
async with self._conn.lock:
await self._conn.wait(self._scroll_gen(value, mode))
+ # Postgres doesn't have a reliable way to report a cursor out of bound
+ if mode == "relative":
+ self._pos += value
+ else:
+ self._pos = value
cur = conn.cursor("foo", row_factory=my_row_factory, scrollable=True)
cur.execute("select generate_series(1, 3) as x")
+ assert cur.rownumber == 0
recs = cur.fetchall()
+ assert cur.rownumber == 3
cur.scroll(0, "absolute")
+ assert cur.rownumber == 0
while rec := cur.fetchone():
recs.append(rec)
+ assert cur.rownumber == 3
assert recs == [[1, -1], [1, -2], [1, -3]] * 2
cur.scroll(0, "absolute")
def test_scroll(conn):
cur = conn.cursor("tmp", scrollable=True)
cur.execute("select generate_series(0,9)")
+ assert cur.rownumber == 0
cur.scroll(2)
+ assert cur.rownumber == 2
assert cur.fetchone() == (2,)
+ assert cur.rownumber == 3
cur.scroll(2)
+ assert cur.rownumber == 5
assert cur.fetchone() == (5,)
+ assert cur.rownumber == 6
cur.scroll(2, mode="relative")
+ assert cur.rownumber == 8
assert cur.fetchone() == (8,)
cur.scroll(9, mode="absolute")
+ assert cur.rownumber == 9
assert cur.fetchone() == (9,)
+ assert cur.rownumber == 10
with pytest.raises(ValueError):
cur.scroll(9, mode="wat")
+ assert cur.rownumber == 10
cur.close()
cur = aconn.cursor("foo", row_factory=my_row_factory, scrollable=True)
await cur.execute("select generate_series(1, 3) as x")
+ assert cur.rownumber == 0
recs = await cur.fetchall()
+ assert cur.rownumber == 3
await cur.scroll(0, "absolute")
+ assert cur.rownumber == 0
while rec := (await cur.fetchone()):
recs.append(rec)
+ assert cur.rownumber == 3
assert recs == [[1, -1], [1, -2], [1, -3]] * 2
await cur.scroll(0, "absolute")
async def test_scroll(aconn):
cur = aconn.cursor("tmp", scrollable=True)
await cur.execute("select generate_series(0,9)")
+ assert cur.rownumber == 0
await cur.scroll(2)
+ assert cur.rownumber == 2
assert await cur.fetchone() == (2,)
+ assert cur.rownumber == 3
await cur.scroll(2)
+ assert cur.rownumber == 5
assert await cur.fetchone() == (5,)
+ assert cur.rownumber == 6
await cur.scroll(2, mode="relative")
+ assert cur.rownumber == 8
assert await cur.fetchone() == (8,)
await cur.scroll(9, mode="absolute")
+ assert cur.rownumber == 9
assert await cur.fetchone() == (9,)
+ assert cur.rownumber == 10
with pytest.raises(ValueError):
await cur.scroll(9, mode="wat")
+ assert cur.rownumber == 10
await cur.close()