Skip to content

Commit

Permalink
[3.0.x] Fixed #31271 -- Preserved ordering when unifying query parame…
Browse files Browse the repository at this point in the history
…ters on Oracle.

This caused misplacing parameters in logged SQL queries.

Regression in 79065b5.

Thanks Hans Aarne Liblik for the report.
Backport of 2a03852 from master
  • Loading branch information
felixxm committed Feb 18, 2020
1 parent bcf58e3 commit 2448b31
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 1 deletion.
5 changes: 4 additions & 1 deletion django/db/backends/oracle/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,10 @@ def _fix_for_params(self, query, params, unify_by_values=False):
# params_dict = {0.75: ':arg0', 2: ':arg1', 'sth': ':arg2'}
# args = [':arg0', ':arg1', ':arg0', ':arg2', ':arg0']
# params = {':arg0': 0.75, ':arg1': 2, ':arg2': 'sth'}
params_dict = {param: ':arg%d' % i for i, param in enumerate(set(params))}
params_dict = {
param: ':arg%d' % i
for i, param in enumerate(dict.fromkeys(params))
}
args = [params_dict[param] for param in params]
params = {value: key for key, value in params_dict.items()}
query = query % tuple(args)
Expand Down
3 changes: 3 additions & 0 deletions docs/releases/3.0.4.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,6 @@ Bugfixes
related fields or parent link fields with :ref:`multi-table-inheritance` in
the ``of`` argument, the corresponding models were not locked
(:ticket:`31246`).

* Fixed a regression in Django 3.0 that caused misplacing parameters in logged
SQL queries on Oracle (:ticket:`31271`).
4 changes: 4 additions & 0 deletions tests/backends/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,10 @@ def test_last_executed_query(self):
for qs in (
Article.objects.filter(pk=1),
Article.objects.filter(pk__in=(1, 2), reporter__pk=3),
Article.objects.filter(
pk=1,
reporter__pk=9,
).exclude(reporter__pk__in=[2, 1]),
):
sql, params = qs.query.sql_with_params()
cursor = qs.query.get_compiler(DEFAULT_DB_ALIAS).execute_sql(CURSOR)
Expand Down

0 comments on commit 2448b31

Please sign in to comment.