summaryrefslogtreecommitdiff
path: root/django/db
diff options
context:
space:
mode:
authorJacob Walls <jacobtylerwalls@gmail.com>2024-12-29 01:13:48 -0800
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2025-08-04 10:14:01 +0200
commit8914f4703cf03e2a01683c4ba00f5ae7d3fa449d (patch)
tree5331d4fac059c893d16875710dc8539ff91bdc81 /django/db
parent079d31e698fa08dd92e2bc4f3fe9b4817a214419 (diff)
Fixed #35972 -- Fixed lookup crashes after subquery annotations.
Diffstat (limited to 'django/db')
-rw-r--r--django/db/backends/base/schema.py3
-rw-r--r--django/db/models/expressions.py4
-rw-r--r--django/db/models/functions/comparison.py2
-rw-r--r--django/db/models/lookups.py12
4 files changed, 12 insertions, 9 deletions
diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py
index 5262864e7f..cc33740195 100644
--- a/django/db/backends/base/schema.py
+++ b/django/db/backends/base/schema.py
@@ -1,6 +1,7 @@
import logging
import operator
from datetime import datetime
+from itertools import chain
from django.conf import settings
from django.core.exceptions import FieldError
@@ -1160,7 +1161,7 @@ class BaseDatabaseSchemaEditor:
# Combine actions together if we can (e.g. postgres)
if self.connection.features.supports_combined_alters and actions:
sql, params = tuple(zip(*actions))
- actions = [(", ".join(sql), sum(params, []))]
+ actions = [(", ".join(sql), tuple(chain(*params)))]
# Apply those actions
for sql, params in actions:
self.execute(
diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py
index 012a7c346b..1168c7ddbd 100644
--- a/django/db/models/expressions.py
+++ b/django/db/models/expressions.py
@@ -1127,7 +1127,7 @@ class Func(SQLiteNumericMixin, Expression):
template = template or data.get("template", self.template)
arg_joiner = arg_joiner or data.get("arg_joiner", self.arg_joiner)
data["expressions"] = data["field"] = arg_joiner.join(sql_parts)
- return template % data, params
+ return template % data, tuple(params)
def copy(self):
copy = super().copy()
@@ -1323,7 +1323,7 @@ class Col(Expression):
alias, column = self.alias, self.target.column
identifiers = (alias, column) if alias else (column,)
sql = ".".join(map(compiler.quote_name_unless_alias, identifiers))
- return sql, []
+ return sql, ()
def relabeled_clone(self, relabels):
if self.alias is None:
diff --git a/django/db/models/functions/comparison.py b/django/db/models/functions/comparison.py
index 11af0c0750..8f7493f2fd 100644
--- a/django/db/models/functions/comparison.py
+++ b/django/db/models/functions/comparison.py
@@ -26,7 +26,7 @@ class Cast(Func):
compiler, connection, template=template, **extra_context
)
format_string = "%H:%M:%f" if db_type == "time" else "%Y-%m-%d %H:%M:%f"
- params.insert(0, format_string)
+ params = (format_string, *params)
return sql, params
elif db_type == "date":
template = "date(%(expressions)s)"
diff --git a/django/db/models/lookups.py b/django/db/models/lookups.py
index 51817710e9..65128732fd 100644
--- a/django/db/models/lookups.py
+++ b/django/db/models/lookups.py
@@ -101,7 +101,7 @@ class Lookup(Expression):
return Value(self.lhs)
def get_db_prep_lookup(self, value, connection):
- return ("%s", [value])
+ return ("%s", (value,))
def process_lhs(self, compiler, connection, lhs=None):
lhs = lhs or self.lhs
@@ -415,7 +415,7 @@ class IExact(BuiltinLookup):
def process_rhs(self, qn, connection):
rhs, params = super().process_rhs(qn, connection)
if params:
- params[0] = connection.ops.prep_for_iexact_query(params[0])
+ params = (connection.ops.prep_for_iexact_query(params[0]), *params[1:])
return rhs, params
@@ -603,8 +603,9 @@ class PatternLookup(BuiltinLookup):
def process_rhs(self, qn, connection):
rhs, params = super().process_rhs(qn, connection)
if self.rhs_is_direct_value() and params and not self.bilateral_transforms:
- params[0] = self.param_pattern % connection.ops.prep_for_like_query(
- params[0]
+ params = (
+ self.param_pattern % connection.ops.prep_for_like_query(params[0]),
+ *params[1:],
)
return rhs, params
@@ -686,8 +687,9 @@ class Regex(BuiltinLookup):
else:
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
+ params = (*lhs_params, *rhs_params)
sql_template = connection.ops.regex_lookup(self.lookup_name)
- return sql_template % (lhs, rhs), lhs_params + rhs_params
+ return sql_template % (lhs, rhs), params
@Field.register_lookup