]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
test(crdb): tweak server-side cursors test to run on CRDB
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Tue, 12 Jul 2022 11:24:21 +0000 (12:24 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Tue, 12 Jul 2022 11:58:34 +0000 (12:58 +0100)
Server-side cursors are well supported starting from CRDB 22.1.3.

docs/api/crdb.rst
tests/fix_crdb.py
tests/test_server_cursor.py
tests/test_server_cursor_async.py

index 3bc781fcc2875b4244963b3ffe51e448e75053b3..de8344ec48980ec2e5032826399ae94e16af7c9b 100644 (file)
@@ -32,6 +32,8 @@ affecting Psycopg behaviour:
   older versions, you can use `CANCEL QUERY`_ instead (but from a different
   connection).
 
+- :ref:`server-side-cursors` are well supported only from CockroachDB 22.1.3.
+
 - `~psycopg.ConnectionInfo.backend_pid` is only populated from CockroachDB
   22.1. Note however that you cannot use the PID to terminate the session; use
   `SHOW session_id`_ to find the id of a session, which you may terminate with
index 5a73d005c8c6b8a54c482004958f5e478573e7ee..27144774d5026874a5920b715a054288de1f4cc5 100644 (file)
@@ -98,6 +98,7 @@ _crdb_reasons = {
     "copy array": 82792,
     "copy canceled": 81559,
     "copy": 41608,
+    "cursor invalid name": 84261,
     "cursor with hold": 77101,
     "deferrable": 48307,
     "do": 17511,
@@ -124,4 +125,5 @@ _crdb_reasons = {
 _crdb_reason_version = {
     "backend pid": "skip < 22",
     "cancel": "skip < 22",
+    "server-side cursor": "skip < 22.1.3",
 }
index 350d95b65c996dce245597c0444d2f92595c364c..e1f8ce392077bc27de46722a6a2ca043f13c92a5 100644 (file)
@@ -34,6 +34,7 @@ def test_init_params(conn):
         assert cur.withhold is True
 
 
+@pytest.mark.crdb_skip("cursor invalid name")
 def test_funny_name(conn):
     cur = conn.cursor("1-2-3")
     cur.execute("select generate_series(1, 3) as bar")
@@ -58,7 +59,7 @@ def test_connection(conn):
 def test_description(conn):
     cur = conn.cursor("foo")
     assert cur.name == "foo"
-    cur.execute("select generate_series(1, 10) as bar")
+    cur.execute("select generate_series(1, 10)::int4 as bar")
     assert len(cur.description) == 1
     assert cur.description[0].name == "bar"
     assert cur.description[0].type_code == cur.adapters.types["int4"].oid
@@ -88,7 +89,7 @@ def test_query_params(conn):
 
 def test_binary_cursor_execute(conn):
     cur = conn.cursor("foo", binary=True)
-    cur.execute("select generate_series(1, 2)")
+    cur.execute("select generate_series(1, 2)::int4")
     assert cur.fetchone() == (1,)
     assert cur.pgresult.fformat(0) == 1
     assert cur.pgresult.get_value(0, 0) == b"\x00\x00\x00\x01"
@@ -100,7 +101,7 @@ def test_binary_cursor_execute(conn):
 
 def test_execute_binary(conn):
     cur = conn.cursor("foo")
-    cur.execute("select generate_series(1, 2)", binary=True)
+    cur.execute("select generate_series(1, 2)::int4", binary=True)
     assert cur.fetchone() == (1,)
     assert cur.pgresult.fformat(0) == 1
     assert cur.pgresult.get_value(0, 0) == b"\x00\x00\x00\x01"
@@ -108,7 +109,7 @@ def test_execute_binary(conn):
     assert cur.pgresult.fformat(0) == 1
     assert cur.pgresult.get_value(0, 0) == b"\x00\x00\x00\x02"
 
-    cur.execute("select generate_series(1, 1)")
+    cur.execute("select generate_series(1, 1)::int4")
     assert cur.fetchone() == (1,)
     assert cur.pgresult.fformat(0) == 0
     assert cur.pgresult.get_value(0, 0) == b"1"
@@ -125,7 +126,7 @@ def test_binary_cursor_text_override(conn):
     assert cur.pgresult.fformat(0) == 0
     assert cur.pgresult.get_value(0, 0) == b"2"
 
-    cur.execute("select generate_series(1, 2)")
+    cur.execute("select generate_series(1, 2)::int4")
     assert cur.fetchone() == (1,)
     assert cur.pgresult.fformat(0) == 1
     assert cur.pgresult.get_value(0, 0) == b"\x00\x00\x00\x01"
@@ -247,6 +248,7 @@ def test_close_no_clobber(conn):
     with pytest.raises(e.DivisionByZero):
         with conn.cursor("foo") as cur:
             cur.execute("select 1 / %s", (0,))
+            cur.fetchall()
 
 
 def test_warn_close(conn, recwarn):
index 337f1677f8c775cafe88d72a793d6589239ec357..0a795bb8253ea076b2a3066d8c1234ba27c2ef91 100644 (file)
@@ -41,6 +41,7 @@ async def test_init_params(aconn):
         assert cur.withhold is True
 
 
+@pytest.mark.crdb_skip("cursor invalid name")
 async def test_funny_name(aconn):
     cur = aconn.cursor("1-2-3")
     await cur.execute("select generate_series(1, 3) as bar")
@@ -65,7 +66,7 @@ async def test_connection(aconn):
 async def test_description(aconn):
     cur = aconn.cursor("foo")
     assert cur.name == "foo"
-    await cur.execute("select generate_series(1, 10) as bar")
+    await cur.execute("select generate_series(1, 10)::int4 as bar")
     assert len(cur.description) == 1
     assert cur.description[0].name == "bar"
     assert cur.description[0].type_code == cur.adapters.types["int4"].oid
@@ -95,7 +96,7 @@ async def test_query_params(aconn):
 
 async def test_binary_cursor_execute(aconn):
     cur = aconn.cursor("foo", binary=True)
-    await cur.execute("select generate_series(1, 2)")
+    await cur.execute("select generate_series(1, 2)::int4")
     assert (await cur.fetchone()) == (1,)
     assert cur.pgresult.fformat(0) == 1
     assert cur.pgresult.get_value(0, 0) == b"\x00\x00\x00\x01"
@@ -107,7 +108,7 @@ async def test_binary_cursor_execute(aconn):
 
 async def test_execute_binary(aconn):
     cur = aconn.cursor("foo")
-    await cur.execute("select generate_series(1, 2)", binary=True)
+    await cur.execute("select generate_series(1, 2)::int4", binary=True)
     assert (await cur.fetchone()) == (1,)
     assert cur.pgresult.fformat(0) == 1
     assert cur.pgresult.get_value(0, 0) == b"\x00\x00\x00\x01"
@@ -132,7 +133,7 @@ async def test_binary_cursor_text_override(aconn):
     assert cur.pgresult.fformat(0) == 0
     assert cur.pgresult.get_value(0, 0) == b"2"
 
-    await cur.execute("select generate_series(1, 2)")
+    await cur.execute("select generate_series(1, 2)::int4")
     assert (await cur.fetchone()) == (1,)
     assert cur.pgresult.fformat(0) == 1
     assert cur.pgresult.get_value(0, 0) == b"\x00\x00\x00\x01"
@@ -258,6 +259,7 @@ async def test_close_no_clobber(aconn):
     with pytest.raises(e.DivisionByZero):
         async with aconn.cursor("foo") as cur:
             await cur.execute("select 1 / %s", (0,))
+            await cur.fetchall()
 
 
 async def test_warn_close(aconn, recwarn):