)
self._query = query
- if no_pqexec:
- if self._conn._pipeline:
- self._conn._pipeline.command_queue.append(
- partial(self._pgconn.send_query_params, None)
- )
- else:
- self._pgconn.send_query_params(query.query, None)
+
+ if self._conn._pipeline:
+ # In pipeline mode always use PQsendQueryParams - see #314
+ # Multiple statements in the same query are not allowed anyway.
+ self._conn._pipeline.command_queue.append(
+ partial(self._pgconn.send_query_params, query.query, None)
+ )
+ elif no_pqexec:
+ self._pgconn.send_query_params(query.query, None)
else:
# if we don't have to, let's use exec_ as it can run more than
# one query in one go
- if self._conn._pipeline:
- self._conn._pipeline.command_queue.append(
- partial(self._pgconn.send_query, query.query)
- )
- else:
- self._pgconn.send_query(query.query)
+ self._pgconn.send_query(query.query)
def _convert_query(
self, query: Query, params: Optional[Params] = None
fmt = BINARY if binary else TEXT
self._query = query
- if query.params or no_pqexec or fmt == BINARY:
- if self._conn._pipeline:
- self._conn._pipeline.command_queue.append(
- partial(
- self._pgconn.send_query_params,
- query.query,
- query.params,
- param_formats=query.formats,
- param_types=query.types,
- result_format=fmt,
- )
- )
- else:
- self._pgconn.send_query_params(
+
+ if self._conn._pipeline:
+ # In pipeline mode always use PQsendQueryParams - see #314
+ # Multiple statements in the same query are not allowed anyway.
+ self._conn._pipeline.command_queue.append(
+ partial(
+ self._pgconn.send_query_params,
query.query,
query.params,
param_formats=query.formats,
param_types=query.types,
result_format=fmt,
)
+ )
+ elif no_pqexec or query.params or fmt == BINARY:
+ self._pgconn.send_query_params(
+ query.query,
+ query.params,
+ param_formats=query.formats,
+ param_types=query.types,
+ result_format=fmt,
+ )
else:
# if we don't have to, let's use exec_ as it can run more than
# one query in one go
- if self._conn._pipeline:
- self._conn._pipeline.command_queue.append(
- partial(self._pgconn.send_query, query.query)
- )
- else:
- self._pgconn.send_query(query.query)
+ self._pgconn.send_query(query.query)
def _convert_query(
self, query: Query, params: Optional[Params] = None
conn.execute("set client_encoding to latin1")
with pytest.raises(UnicodeEncodeError):
cur.mogrify("select %(s)s", {"s": "\u20ac"})
+
+
+@pytest.mark.libpq(">= 14")
+@pytest.mark.pipeline
+def test_message_0x33(conn):
+ # https://github.com/psycopg/psycopg/issues/314
+ notices = []
+ conn.add_notice_handler(lambda diag: notices.append(diag.message_primary))
+
+ conn.autocommit = True
+ with conn.pipeline():
+ cur = conn.execute("select 'test'")
+ cur.fetchone() == ("test",)
+
+ assert not notices
await aconn.execute("set client_encoding to latin1")
with pytest.raises(UnicodeEncodeError):
cur.mogrify("select %(s)s", {"s": "\u20ac"})
+
+
+@pytest.mark.libpq(">= 14")
+@pytest.mark.pipeline
+async def test_message_0x33(aconn):
+ # https://github.com/psycopg/psycopg/issues/314
+ notices = []
+ aconn.add_notice_handler(lambda diag: notices.append(diag.message_primary))
+
+ await aconn.set_autocommit(True)
+ async with aconn.pipeline():
+ cur = await aconn.execute("select 'test'")
+ await cur.fetchone() == ("test",)
+
+ assert not notices
def test_message_0x33(conn):
+ # https://github.com/psycopg/psycopg/issues/314
notices = []
conn.add_notice_handler(lambda diag: notices.append(diag.message_primary))
async def test_message_0x33(aconn):
+ # https://github.com/psycopg/psycopg/issues/314
notices = []
aconn.add_notice_handler(lambda diag: notices.append(diag.message_primary))