Browse Source

Fixed #34580 -- Avoided unnecessary computation of selected expressions in SQLCompiler.

Performance regression in 278881e37619278789942513916acafaa88d26f3.

Co-authored-by: David Smith <smithdc@gmail.com>
Simon Charette 1 year ago
parent
commit
98f6ada0e2
2 changed files with 6 additions and 1 deletions
  1. 3 1
      django/db/models/sql/compiler.py
  2. 3 0
      docs/releases/4.2.2.txt

+ 3 - 1
django/db/models/sql/compiler.py

@@ -331,7 +331,9 @@ class SQLCompiler:
             default_order, _ = ORDER_DIR["DESC"]
 
         selected_exprs = {}
-        if select := self.select:
+        # Avoid computing `selected_exprs` if there is no `ordering` as it's
+        # relatively expensive.
+        if ordering and (select := self.select):
             for ordinal, (expr, _, alias) in enumerate(select, start=1):
                 pos_expr = PositionRef(ordinal, alias, expr)
                 if alias:

+ 3 - 0
docs/releases/4.2.2.txt

@@ -22,3 +22,6 @@ Bugfixes
 
 * Fixed a bug in Django 4.2 where :option:`makemigrations --update` didn't
   respect the ``--name`` option (:ticket:`34568`).
+
+* Fixed a performance regression in Django 4.2 when compiling queries without
+  ordering (:ticket:`34580`).