From 6e32d1fa1dafd0c9cd9f93997ecebb26cd9a1b62 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Wed, 10 May 2023 17:22:45 +0200 Subject: [PATCH] =?UTF-8?q?Fixed=20#34554=20--=20Fixed=20Reverse(Value(?= =?UTF-8?q?=E2=80=A6))=20crash=20on=20Oracle.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- django/db/models/functions/text.py | 3 ++- tests/db_functions/text/test_reverse.py | 15 +++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/django/db/models/functions/text.py b/django/db/models/functions/text.py index 34421eb15db..fba2840c4b1 100644 --- a/django/db/models/functions/text.py +++ b/django/db/models/functions/text.py @@ -257,7 +257,7 @@ class Reverse(Transform): def as_oracle(self, compiler, connection, **extra_context): # REVERSE in Oracle is undocumented and doesn't support multi-byte # strings. Use a special subquery instead. - return super().as_sql( + sql, params = super().as_sql( compiler, connection, template=( @@ -268,6 +268,7 @@ class Reverse(Transform): ), **extra_context, ) + return sql, params * 3 class Right(Left): diff --git a/tests/db_functions/text/test_reverse.py b/tests/db_functions/text/test_reverse.py index 62d769d80cf..3e94c111be0 100644 --- a/tests/db_functions/text/test_reverse.py +++ b/tests/db_functions/text/test_reverse.py @@ -1,5 +1,5 @@ from django.db import connection -from django.db.models import CharField +from django.db.models import CharField, Value from django.db.models.functions import Length, Reverse, Trim from django.test import TestCase from django.test.utils import register_lookup @@ -24,15 +24,18 @@ class ReverseTests(TestCase): ) def test_basic(self): - authors = Author.objects.annotate(backward=Reverse("name")) + authors = Author.objects.annotate( + backward=Reverse("name"), + constant=Reverse(Value("static string")), + ) self.assertQuerySetEqual( authors, [ - ("John Smith", "htimS nhoJ"), - ("Élena Jordan", "nadroJ anelÉ"), - ("パイソン", "ンソイパ"), + ("John Smith", "htimS nhoJ", "gnirts citats"), + ("Élena Jordan", "nadroJ anelÉ", "gnirts citats"), + ("パイソン", "ンソイパ", "gnirts citats"), ], - lambda a: (a.name, a.backward), + lambda a: (a.name, a.backward, a.constant), ordered=False, )