1
0
mirror of https://github.com/django/django.git synced 2025-10-26 23:26:08 +00:00

Fixed #36612 -- Fixed a KeyTextTransform crash on MySQL against annotations.

MySQL only supports the ->> when used directly against columns, this can be
inferred by the presence of lhs.output_field.model as model bounds fields are
directly tied to columns.

Purposely don't systematically switch to using JSON_QUOTE(JSON_EXTRACT(...))
as there might be functional indices out there that rely on the SQL remaining
stable between versions.

Thanks Jacob Tavener for the report.
This commit is contained in:
Simon Charette
2025-09-17 01:56:40 -04:00
committed by Sarah Boyce
parent a36df6890d
commit af84cfba59
2 changed files with 12 additions and 2 deletions

View File

@@ -424,8 +424,12 @@ class KeyTextTransform(KeyTransform):
output_field = TextField() output_field = TextField()
def as_mysql(self, compiler, connection): def as_mysql(self, compiler, connection):
if connection.mysql_is_mariadb: # The ->> operator is not supported on MariaDB (see MDEV-13594) and
# MariaDB doesn't support -> and ->> operators (see MDEV-13594). # only supported against columns on MySQL.
if (
connection.mysql_is_mariadb
or getattr(self.lhs.output_field, "model", None) is None
):
sql, params = super().as_mysql(compiler, connection) sql, params = super().as_mysql(compiler, connection)
return "JSON_UNQUOTE(%s)" % sql, params return "JSON_UNQUOTE(%s)" % sql, params
else: else:

View File

@@ -1160,6 +1160,12 @@ class TestQuerying(TestCase):
True, True,
) )
def test_cast_with_key_text_transform(self):
obj = NullableJSONModel.objects.annotate(
json_data=Cast(Value({"foo": "bar"}, JSONField()), JSONField())
).get(pk=self.objs[0].pk, json_data__foo__icontains="bar")
self.assertEqual(obj, self.objs[0])
@skipUnlessDBFeature("supports_json_field_contains") @skipUnlessDBFeature("supports_json_field_contains")
def test_contains_contained_by_with_key_transform(self): def test_contains_contained_by_with_key_transform(self):
tests = [ tests = [