diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 294e0b21fd..82438355cb 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -117,7 +117,7 @@ class SQLCompiler(object): if self.query.distinct: result.append(self.connection.ops.distinct_sql(distinct_fields)) - params.extend(o_params) + result.append(', '.join(out_cols + self.ordering_aliases)) params.extend(s_params) params.extend(self.ordering_params) @@ -146,6 +146,7 @@ class SQLCompiler(object): if ordering: result.append('ORDER BY %s' % ', '.join(ordering)) + params.extend(o_params) if with_limits: if self.query.high_mark is not None: diff --git a/tests/queries/tests.py b/tests/queries/tests.py index a47461bb86..380d64b8f9 100644 --- a/tests/queries/tests.py +++ b/tests/queries/tests.py @@ -2130,6 +2130,26 @@ class ValuesQuerysetTests(BaseQuerysetTest): order_by=['value_minus_one']) qs = qs.values('num') + def test_extra_select_params_values_order_in_extra(self): + # testing for 23259 issue + qs = Number.objects.extra( + select={'value_plus_x': 'num+%s'}, + select_params=[1], + order_by=['value_plus_x']) + qs = qs.filter(num=72) + qs = qs.values('num') + self.assertQuerysetEqual(qs, [{'num': 72}], self.identity) + + def test_extra_multiple_select_params_values_order_by(self): + # testing for 23259 issue + qs = Number.objects.extra(select=OrderedDict([('value_plus_x', 'num+%s'), + ('value_minus_x', 'num-%s')]), + select_params=(72, 72)) + qs = qs.order_by('value_minus_x') + qs = qs.filter(num=1) + qs = qs.values('num') + self.assertQuerysetEqual(qs, [], self.identity) + def test_extra_values_list(self): # testing for ticket 14930 issues qs = Number.objects.extra(select={'value_plus_one': 'num+1'})