Server-side cursors are well supported starting from CRDB 22.1.3.
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
"copy array": 82792,
"copy canceled": 81559,
"copy": 41608,
+ "cursor invalid name": 84261,
"cursor with hold": 77101,
"deferrable": 48307,
"do": 17511,
_crdb_reason_version = {
"backend pid": "skip < 22",
"cancel": "skip < 22",
+ "server-side cursor": "skip < 22.1.3",
}
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")
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
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"
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"
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"
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"
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):
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")
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
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"
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"
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"
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):