summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2020-02-18 11:45:12 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-02-18 11:46:01 +0100
commit2448b3182c75cce5d22dd80be0fb5cba6104c364 (patch)
tree3d663be486d3276f016017f9a06e250f36dddeb5
parentbcf58e3e705cf0feaf29768a3539b241d8f12ec8 (diff)
[3.0.x] Fixed #31271 -- Preserved ordering when unifying query parameters on Oracle.
This caused misplacing parameters in logged SQL queries. Regression in 79065b55a70cd220820a260a1c54851b7be0615a. Thanks Hans Aarne Liblik for the report. Backport of 2a038521c4eabdc5f6d5026d3dd6d22868e329cd from master
-rw-r--r--django/db/backends/oracle/base.py5
-rw-r--r--docs/releases/3.0.4.txt3
-rw-r--r--tests/backends/tests.py4
3 files changed, 11 insertions, 1 deletions
diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py
index ef33d9fad7..86650a894e 100644
--- a/django/db/backends/oracle/base.py
+++ b/django/db/backends/oracle/base.py
@@ -497,7 +497,10 @@ class FormatStylePlaceholderCursor:
# 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)
diff --git a/docs/releases/3.0.4.txt b/docs/releases/3.0.4.txt
index 7be1ed15ce..216bc29b0e 100644
--- a/docs/releases/3.0.4.txt
+++ b/docs/releases/3.0.4.txt
@@ -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`).
diff --git a/tests/backends/tests.py b/tests/backends/tests.py
index da20d94442..2a50199192 100644
--- a/tests/backends/tests.py
+++ b/tests/backends/tests.py
@@ -79,6 +79,10 @@ class LastExecutedQueryTest(TestCase):
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)