mirror of
https://github.com/django/django.git
synced 2025-09-18 15:09:12 +00:00
Fixed #34103 -- Fixed logging SQL queries with duplicate parameters on Oracle.
This commit is contained in:
parent
80c66e40f7
commit
64b3c413da
@ -323,16 +323,16 @@ END;
|
|||||||
# Unlike Psycopg's `query` and MySQLdb`'s `_executed`, cx_Oracle's
|
# Unlike Psycopg's `query` and MySQLdb`'s `_executed`, cx_Oracle's
|
||||||
# `statement` doesn't contain the query parameters. Substitute
|
# `statement` doesn't contain the query parameters. Substitute
|
||||||
# parameters manually.
|
# parameters manually.
|
||||||
if isinstance(params, (tuple, list)):
|
if params:
|
||||||
for i, param in enumerate(reversed(params), start=1):
|
if isinstance(params, (tuple, list)):
|
||||||
param_num = len(params) - i
|
params = {
|
||||||
statement = statement.replace(
|
f":arg{i}": param for i, param in enumerate(dict.fromkeys(params))
|
||||||
":arg%d" % param_num, force_str(param, errors="replace")
|
}
|
||||||
)
|
elif isinstance(params, dict):
|
||||||
elif isinstance(params, dict):
|
params = {f":{key}": val for (key, val) in params.items()}
|
||||||
for key in sorted(params, key=len, reverse=True):
|
for key in sorted(params, key=len, reverse=True):
|
||||||
statement = statement.replace(
|
statement = statement.replace(
|
||||||
":%s" % key, force_str(params[key], errors="replace")
|
key, force_str(params[key], errors="replace")
|
||||||
)
|
)
|
||||||
return statement
|
return statement
|
||||||
|
|
||||||
|
@ -142,6 +142,23 @@ class LastExecutedQueryTest(TestCase):
|
|||||||
sql % params,
|
sql % params,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_last_executed_query_with_duplicate_params(self):
|
||||||
|
square_opts = Square._meta
|
||||||
|
table = connection.introspection.identifier_converter(square_opts.db_table)
|
||||||
|
id_column = connection.ops.quote_name(square_opts.get_field("id").column)
|
||||||
|
root_column = connection.ops.quote_name(square_opts.get_field("root").column)
|
||||||
|
sql = f"UPDATE {table} SET {root_column} = %s + %s WHERE {id_column} = %s"
|
||||||
|
with connection.cursor() as cursor:
|
||||||
|
params = [42, 42, 1]
|
||||||
|
cursor.execute(sql, params)
|
||||||
|
last_executed_query = connection.ops.last_executed_query(
|
||||||
|
cursor, sql, params
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
last_executed_query,
|
||||||
|
f"UPDATE {table} SET {root_column} = 42 + 42 WHERE {id_column} = 1",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class ParameterHandlingTest(TestCase):
|
class ParameterHandlingTest(TestCase):
|
||||||
def test_bad_parameter_count(self):
|
def test_bad_parameter_count(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user