Unverified Kaydet (Commit) feb683c4 authored tarafından Mariusz Felisiak's avatar Mariusz Felisiak Kaydeden (comit) GitHub

Fixed #29155 -- Fixed crash when database functions are used with pattern lookups.

Thanks Tim Graham and Sergey Fedoseev for reviews.
üst 8f75984c
...@@ -397,7 +397,7 @@ class PatternLookup(BuiltinLookup): ...@@ -397,7 +397,7 @@ class PatternLookup(BuiltinLookup):
def process_rhs(self, qn, connection): def process_rhs(self, qn, connection):
rhs, params = super().process_rhs(qn, connection) rhs, params = super().process_rhs(qn, connection)
if params and not self.bilateral_transforms: if self.rhs_is_direct_value() and params and not self.bilateral_transforms:
params[0] = self.param_pattern % connection.ops.prep_for_like_query(params[0]) params[0] = self.param_pattern % connection.ops.prep_for_like_query(params[0])
return rhs, params return rhs, params
......
...@@ -17,6 +17,7 @@ class Alarm(models.Model): ...@@ -17,6 +17,7 @@ class Alarm(models.Model):
class Author(models.Model): class Author(models.Model):
name = models.CharField(max_length=100) name = models.CharField(max_length=100)
alias = models.CharField(max_length=50, null=True, blank=True)
class Meta: class Meta:
ordering = ('name',) ordering = ('name',)
......
...@@ -5,6 +5,7 @@ from operator import attrgetter ...@@ -5,6 +5,7 @@ from operator import attrgetter
from django.core.exceptions import FieldError from django.core.exceptions import FieldError
from django.db import connection from django.db import connection
from django.db.models.functions import Substr
from django.test import TestCase, skipUnlessDBFeature from django.test import TestCase, skipUnlessDBFeature
from .models import Article, Author, Game, Player, Season, Tag from .models import Article, Author, Game, Player, Season, Tag
...@@ -878,3 +879,19 @@ class LookupTests(TestCase): ...@@ -878,3 +879,19 @@ class LookupTests(TestCase):
season = Season.objects.create(year=2012, nulled_text_field=None) season = Season.objects.create(year=2012, nulled_text_field=None)
self.assertTrue(Season.objects.filter(pk=season.pk, nulled_text_field__isnull=True)) self.assertTrue(Season.objects.filter(pk=season.pk, nulled_text_field__isnull=True))
self.assertTrue(Season.objects.filter(pk=season.pk, nulled_text_field='')) self.assertTrue(Season.objects.filter(pk=season.pk, nulled_text_field=''))
def test_pattern_lookups_with_substr(self):
a = Author.objects.create(name='John Smith', alias='Johx')
b = Author.objects.create(name='Rhonda Simpson', alias='sonx')
tests = (
('startswith', [a]),
('istartswith', [a]),
('contains', [a, b]),
('icontains', [a, b]),
('endswith', [b]),
('iendswith', [b]),
)
for lookup, result in tests:
with self.subTest(lookup=lookup):
authors = Author.objects.filter(**{'name__%s' % lookup: Substr('alias', 1, 3)})
self.assertCountEqual(authors, result)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment