From 91be6e1818c3cb70890608491eea79e984f98ede Mon Sep 17 00:00:00 2001 From: Kacper Wolkiewicz <45897171+wolkiewiczk@users.noreply.github.com> Date: Wed, 31 May 2023 12:57:40 +0200 Subject: [PATCH] Fixed #34606 -- Fixed Right() function with zero length on Oracle and SQLite. --- AUTHORS | 1 + django/db/models/functions/text.py | 4 +++- tests/db_functions/text/test_right.py | 18 +++++++++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 95f24762ee..d5e3af2310 100644 --- a/AUTHORS +++ b/AUTHORS @@ -545,6 +545,7 @@ answer newbie questions, and generally made Django that much better: Justin Michalicek Justin Myles Holmes Jyrki Pulliainen + Kacper Wolkiewicz Kadesarin Sanjek Kapil Bansal Karderio diff --git a/django/db/models/functions/text.py b/django/db/models/functions/text.py index fba2840c4b..2b49f54328 100644 --- a/django/db/models/functions/text.py +++ b/django/db/models/functions/text.py @@ -276,7 +276,9 @@ class Right(Left): def get_substr(self): return Substr( - self.source_expressions[0], self.source_expressions[1] * Value(-1) + self.source_expressions[0], + self.source_expressions[1] * Value(-1), + self.source_expressions[1], ) diff --git a/tests/db_functions/text/test_right.py b/tests/db_functions/text/test_right.py index 126f1583a5..93d929f9e0 100644 --- a/tests/db_functions/text/test_right.py +++ b/tests/db_functions/text/test_right.py @@ -1,5 +1,6 @@ +from django.db import connection from django.db.models import IntegerField, Value -from django.db.models.functions import Lower, Right +from django.db.models.functions import Length, Lower, Right from django.test import TestCase from ..models import Author @@ -26,6 +27,21 @@ class RightTests(TestCase): with self.assertRaisesMessage(ValueError, "'length' must be greater than 0"): Author.objects.annotate(raises=Right("name", 0)) + def test_zero_length(self): + Author.objects.create(name="Tom", alias="tom") + authors = Author.objects.annotate( + name_part=Right("name", Length("name") - Length("alias")) + ) + self.assertQuerySetEqual( + authors.order_by("name"), + [ + "mith", + "" if connection.features.interprets_empty_strings_as_nulls else None, + "", + ], + lambda a: a.name_part, + ) + def test_expressions(self): authors = Author.objects.annotate( name_part=Right("name", Value(3, output_field=IntegerField()))