Commit 61c102d0 authored by Josh Smeaton's avatar Josh Smeaton
Browse files

Fixed #24183 -- Fixed wrong comparisons in Substr

parent 7f20041b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -110,13 +110,13 @@ class Substr(Func):
        pos: an integer > 0, or an expression returning an integer
        length: an optional number of characters to return
        """
        if not hasattr('pos', 'resolve_expression'):
        if not hasattr(pos, 'resolve_expression'):
            if pos < 1:
                raise ValueError("'pos' must be greater than 0")
            pos = Value(pos)
        expressions = [expression, pos]
        if length is not None:
            if not hasattr('length', 'resolve_expression'):
            if not hasattr(length, 'resolve_expression'):
                length = Value(length)
            expressions.append(length)
        super(Substr, self).__init__(*expressions, **extra)
+12 −0
Original line number Diff line number Diff line
@@ -278,6 +278,18 @@ class FunctionTests(TestCase):
        with six.assertRaisesRegex(self, ValueError, "'pos' must be greater than 0"):
            Author.objects.annotate(raises=Substr('name', 0))

    def test_substr_with_expressions(self):
        Author.objects.create(name='John Smith', alias='smithj')
        Author.objects.create(name='Rhonda')
        authors = Author.objects.annotate(name_part=Substr('name', V(5), V(3)))
        self.assertQuerysetEqual(
            authors.order_by('name'), [
                ' Sm',
                'da',
            ],
            lambda a: a.name_part
        )

    def test_nested_function_ordering(self):
        Author.objects.create(name='John Smith')
        Author.objects.create(name='Rhonda Simpson', alias='ronny')