summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2021-04-14 21:11:17 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-04-14 21:13:27 +0200
commit208e72276a3e12a4e7998b9a1219bc96a16cf7b8 (patch)
tree0b82534d3aef1eecaf3b83a224cc11a0fb1f0fe0 /django
parentd0267690f8a8e83065459d13a5a6f29e75640f78 (diff)
[3.2.x] Fixed #32645 -- Fixed QuerySet.update() crash when ordered by joined fields on MySQL/MariaDB.
Thanks Matt Westcott for the report. Regression in 779e615e362108862f1681f965ee9e4f1d0ae6d2. Backport of ca9872905559026af82000e46cde6f7dedc897b6 from main
Diffstat (limited to 'django')
-rw-r--r--django/db/backends/mysql/compiler.py11
1 files changed, 10 insertions, 1 deletions
diff --git a/django/db/backends/mysql/compiler.py b/django/db/backends/mysql/compiler.py
index da02c1fd73..49b47961a1 100644
--- a/django/db/backends/mysql/compiler.py
+++ b/django/db/backends/mysql/compiler.py
@@ -1,4 +1,5 @@
from django.core.exceptions import FieldError
+from django.db.models.expressions import Col
from django.db.models.sql import compiler
@@ -45,8 +46,16 @@ class SQLUpdateCompiler(compiler.SQLUpdateCompiler, SQLCompiler):
if self.query.order_by:
order_by_sql = []
order_by_params = []
+ db_table = self.query.get_meta().db_table
try:
- for _, (sql, params, _) in self.get_order_by():
+ for resolved, (sql, params, _) in self.get_order_by():
+ if (
+ isinstance(resolved.expression, Col) and
+ resolved.expression.alias != db_table
+ ):
+ # Ignore ordering if it contains joined fields, because
+ # they cannot be used in the ORDER BY clause.
+ raise FieldError
order_by_sql.append(sql)
order_by_params.extend(params)
update_query += ' ORDER BY ' + ', '.join(order_by_sql)