From da19b3897dc7c2e99b120d40322b36b4f1a09fe8 Mon Sep 17 00:00:00 2001 From: VIZZARD-X Date: Sat, 22 Nov 2025 15:57:33 +0530 Subject: Fixed #36112 -- Added fallback in last_executed_query() on Oracle and PostgreSQL. --- django/db/backends/oracle/operations.py | 6 +++++- django/db/backends/postgresql/operations.py | 6 +++--- tests/backends/base/test_operations.py | 13 +++++++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/django/db/backends/oracle/operations.py b/django/db/backends/oracle/operations.py index b3e28b102f..75f80941b3 100644 --- a/django/db/backends/oracle/operations.py +++ b/django/db/backends/oracle/operations.py @@ -352,7 +352,11 @@ END; statement = statement.replace( key, force_str(params[key], errors="replace") ) - return statement + return ( + super().last_executed_query(cursor, sql, params) + if statement is None + else statement + ) def last_insert_id(self, cursor, table_name, pk_name): sq_name = self._get_sequence_name(cursor, strip_quotes(table_name), pk_name) diff --git a/django/db/backends/postgresql/operations.py b/django/db/backends/postgresql/operations.py index 91456e3daf..5f4eda905f 100644 --- a/django/db/backends/postgresql/operations.py +++ b/django/db/backends/postgresql/operations.py @@ -302,11 +302,11 @@ class DatabaseOperations(BaseDatabaseOperations): try: return self.compose_sql(sql, params) except errors.DataError: - return None + return super().last_executed_query(cursor, sql, params) else: if cursor._query and cursor._query.query is not None: return cursor._query.query.decode() - return None + return super().last_executed_query(cursor, sql, params) else: @@ -315,7 +315,7 @@ class DatabaseOperations(BaseDatabaseOperations): # The query attribute is a Psycopg extension to the DB API 2.0. if cursor.query is not None: return cursor.query.decode() - return None + return super().last_executed_query(cursor, sql, params) if is_psycopg3: diff --git a/tests/backends/base/test_operations.py b/tests/backends/base/test_operations.py index a0bd50351c..96fadb4c7a 100644 --- a/tests/backends/base/test_operations.py +++ b/tests/backends/base/test_operations.py @@ -171,6 +171,19 @@ class DatabaseOperationTests(TestCase): def setUp(self): self.ops = BaseDatabaseOperations(connection=connection) + def test_last_executed_query_base_fallback(self): + sql = "INVALID SQL" + params = [] + with connection.cursor() as cursor: + cursor.close() + try: + cursor.execute(sql, params) + except connection.features.closed_cursor_error_class: + pass + self.assertIsNotNone( + connection.ops.last_executed_query(cursor, sql, params), + ) + @skipIfDBFeature("can_distinct_on_fields") def test_distinct_on_fields(self): msg = "DISTINCT ON fields is not supported by this database backend" -- cgit v1.3