From: CommanderKeynes Date: Tue, 7 Jan 2025 15:52:36 +0000 (-0500) Subject: Asyncpg null query fix X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7bfb829f25c1bfe2139afe7875882298aaf345ba;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Asyncpg null query fix Adjusted the asyncpg dialect so that an empty SQL string, which is valid for PostgreSQL server, may be successfully processed at the dialect level, such as when using :meth:`.Connection.exec_driver_sql`. Pull request courtesy Andrew Jackson. Closes: #12220 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/12220 Pull-request-sha: 45c94febee66b567040b1fbfa3a93079a1314f09 Change-Id: I870df9e31f4a229939e76c702724c25073329282 --- diff --git a/doc/build/changelog/unreleased_20/12220.rst b/doc/build/changelog/unreleased_20/12220.rst new file mode 100644 index 0000000000..a4b30cca5b --- /dev/null +++ b/doc/build/changelog/unreleased_20/12220.rst @@ -0,0 +1,9 @@ +.. change:: + :tags: bug, postgresql + :tickets: 12220 + + Adjusted the asyncpg dialect so that an empty SQL string, which is valid + for PostgreSQL server, may be successfully processed at the dialect level, + such as when using :meth:`.Connection.exec_driver_sql`. Pull request + courtesy Andrew Jackson. + diff --git a/lib/sqlalchemy/dialects/postgresql/asyncpg.py b/lib/sqlalchemy/dialects/postgresql/asyncpg.py index ecb09560fc..3a1c7b3f71 100644 --- a/lib/sqlalchemy/dialects/postgresql/asyncpg.py +++ b/lib/sqlalchemy/dialects/postgresql/asyncpg.py @@ -586,7 +586,8 @@ class AsyncAdapt_asyncpg_cursor(AsyncAdapt_dbapi_cursor): status = prepared_stmt.get_statusmsg() reg = re.match( - r"(?:SELECT|UPDATE|DELETE|INSERT \d+) (\d+)", status + r"(?:SELECT|UPDATE|DELETE|INSERT \d+) (\d+)", + status or "", ) if reg: self._rowcount = int(reg.group(1)) diff --git a/test/dialect/postgresql/test_dialect.py b/test/dialect/postgresql/test_dialect.py index 892e2abc9b..109101011f 100644 --- a/test/dialect/postgresql/test_dialect.py +++ b/test/dialect/postgresql/test_dialect.py @@ -1040,6 +1040,12 @@ class MiscBackendTest( __only_on__ = "postgresql" __backend__ = True + @testing.fails_on(["+psycopg2"]) + def test_empty_sql_string(self, connection): + + result = connection.exec_driver_sql("") + assert result._soft_closed + @testing.provide_metadata def test_date_reflection(self): metadata = self.metadata