Fixed #33815 -- Fixed last_executed_query() on Oracle when parameter names overlap.
This commit is contained in:
parent
d12d7c4c42
commit
249ecc437f
|
@ -309,14 +309,15 @@ END;
|
|||
# `statement` doesn't contain the query parameters. Substitute
|
||||
# parameters manually.
|
||||
if isinstance(params, (tuple, list)):
|
||||
for i, param in enumerate(params):
|
||||
for i, param in enumerate(reversed(params), start=1):
|
||||
param_num = len(params) - i
|
||||
statement = statement.replace(
|
||||
":arg%d" % i, force_str(param, errors="replace")
|
||||
":arg%d" % param_num, force_str(param, errors="replace")
|
||||
)
|
||||
elif isinstance(params, dict):
|
||||
for key, param in params.items():
|
||||
for key in sorted(params, key=len, reverse=True):
|
||||
statement = statement.replace(
|
||||
":%s" % key, force_str(param, errors="replace")
|
||||
":%s" % key, force_str(params[key], errors="replace")
|
||||
)
|
||||
return statement
|
||||
|
||||
|
|
|
@ -101,6 +101,7 @@ class LastExecutedQueryTest(TestCase):
|
|||
pk=1,
|
||||
reporter__pk=9,
|
||||
).exclude(reporter__pk__in=[2, 1]),
|
||||
Article.objects.filter(pk__in=list(range(20, 31))),
|
||||
):
|
||||
sql, params = qs.query.sql_with_params()
|
||||
with qs.query.get_compiler(DEFAULT_DB_ALIAS).execute_sql(CURSOR) as cursor:
|
||||
|
@ -125,6 +126,22 @@ class LastExecutedQueryTest(TestCase):
|
|||
sql % params,
|
||||
)
|
||||
|
||||
@skipUnlessDBFeature("supports_paramstyle_pyformat")
|
||||
def test_last_executed_query_dict_overlap_keys(self):
|
||||
square_opts = Square._meta
|
||||
sql = "INSERT INTO %s (%s, %s) VALUES (%%(root)s, %%(root2)s)" % (
|
||||
connection.introspection.identifier_converter(square_opts.db_table),
|
||||
connection.ops.quote_name(square_opts.get_field("root").column),
|
||||
connection.ops.quote_name(square_opts.get_field("square").column),
|
||||
)
|
||||
with connection.cursor() as cursor:
|
||||
params = {"root": 2, "root2": 4}
|
||||
cursor.execute(sql, params)
|
||||
self.assertEqual(
|
||||
cursor.db.ops.last_executed_query(cursor, sql, params),
|
||||
sql % params,
|
||||
)
|
||||
|
||||
|
||||
class ParameterHandlingTest(TestCase):
|
||||
def test_bad_parameter_count(self):
|
||||
|
|
Loading…
Reference in New Issue