From 787cc96ef6197d73c7d4ad96f25500910c399603 Mon Sep 17 00:00:00 2001 From: Jacob Walls Date: Mon, 27 Oct 2025 12:27:30 -0400 Subject: [PATCH] Refs #35972 -- Returned params in a tuple in further lookups. --- django/contrib/gis/db/models/lookups.py | 2 +- django/db/models/fields/json.py | 6 +++--- django/db/models/lookups.py | 6 +++--- django/db/models/sql/compiler.py | 4 ++-- tests/custom_lookups/tests.py | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/django/contrib/gis/db/models/lookups.py b/django/contrib/gis/db/models/lookups.py index b9e5e47b27..c0cb80ea70 100644 --- a/django/contrib/gis/db/models/lookups.py +++ b/django/contrib/gis/db/models/lookups.py @@ -19,7 +19,7 @@ class GISLookup(Lookup): band_lhs = None def __init__(self, lhs, rhs): - rhs, *self.rhs_params = rhs if isinstance(rhs, (list, tuple)) else [rhs] + rhs, *self.rhs_params = rhs if isinstance(rhs, (list, tuple)) else (rhs,) super().__init__(lhs, rhs) self.template_params = {} self.process_rhs_params() diff --git a/django/db/models/fields/json.py b/django/db/models/fields/json.py index e0aa5c622b..af5ec4c8b0 100644 --- a/django/db/models/fields/json.py +++ b/django/db/models/fields/json.py @@ -316,8 +316,8 @@ class JSONExact(lookups.Exact): def process_rhs(self, compiler, connection): rhs, rhs_params = super().process_rhs(compiler, connection) # Treat None lookup values as null. - if rhs == "%s" and rhs_params == [None]: - rhs_params = ["null"] + if rhs == "%s" and (*rhs_params,) == (None,): + rhs_params = ("null",) if connection.vendor == "mysql": func = ["JSON_EXTRACT(%s, '$')"] * len(rhs_params) rhs %= tuple(func) @@ -552,7 +552,7 @@ class KeyTransformExact(JSONExact): def as_oracle(self, compiler, connection): rhs, rhs_params = super().process_rhs(compiler, connection) - if rhs_params == ["null"]: + if rhs_params and (*rhs_params,) == ("null",): # Field has key and it's NULL. has_key_expr = HasKeyOrArrayIndex(self.lhs.lhs, self.lhs.key_name) has_key_sql, has_key_params = has_key_expr.as_oracle(compiler, connection) diff --git a/django/db/models/lookups.py b/django/db/models/lookups.py index 65128732fd..f15147a60b 100644 --- a/django/db/models/lookups.py +++ b/django/db/models/lookups.py @@ -232,12 +232,12 @@ class BuiltinLookup(Lookup): lhs_sql = ( connection.ops.lookup_cast(self.lookup_name, field_internal_type) % lhs_sql ) - return lhs_sql, list(params) + return lhs_sql, tuple(params) def as_sql(self, compiler, connection): lhs_sql, params = self.process_lhs(compiler, connection) rhs_sql, rhs_params = self.process_rhs(compiler, connection) - params.extend(rhs_params) + params = (*params, *rhs_params) rhs_sql = self.get_rhs_op(connection, rhs_sql) return "%s %s" % (lhs_sql, rhs_sql), params @@ -725,7 +725,7 @@ class YearLookup(Lookup): rhs_sql, _ = self.process_rhs(compiler, connection) rhs_sql = self.get_direct_rhs_sql(connection, rhs_sql) start, finish = self.year_lookup_bounds(connection, self.rhs) - params.extend(self.get_bound_params(start, finish)) + params = (*params, *self.get_bound_params(start, finish)) return "%s %s" % (lhs_sql, rhs_sql), params return super().as_sql(compiler, connection) diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 14603d5773..20f06ad168 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -1703,8 +1703,8 @@ class SQLInsertCompiler(SQLCompiler): sql, params = "%s", [val] # The following hook is only used by Oracle Spatial, which sometimes - # needs to yield 'NULL' and [] as its placeholder and params instead - # of '%s' and [None]. The 'NULL' placeholder is produced earlier by + # needs to yield 'NULL' and () as its placeholder and params instead + # of '%s' and (None,). The 'NULL' placeholder is produced earlier by # OracleOperations.get_geom_placeholder(). The following line removes # the corresponding None parameter. See ticket #10888. params = self.connection.ops.modify_insert_params(sql, params) diff --git a/tests/custom_lookups/tests.py b/tests/custom_lookups/tests.py index db985240d7..1be289b18a 100644 --- a/tests/custom_lookups/tests.py +++ b/tests/custom_lookups/tests.py @@ -119,7 +119,7 @@ class YearLte(models.lookups.LessThanOrEqual): real_lhs = self.lhs.lhs lhs_sql, params = self.process_lhs(compiler, connection, real_lhs) rhs_sql, rhs_params = self.process_rhs(compiler, connection) - params.extend(rhs_params) + params = (*params, *rhs_params) # Build SQL where the integer year is concatenated with last month # and day, then convert that to date. (We try to have SQL like: # WHERE somecol <= '2013-12-31')