Fixed #29155 -- Fixed crash when database functions are used with pattern lookups.
Thanks Tim Graham and Sergey Fedoseev for reviews.
This commit is contained in:
parent
8f75984c26
commit
feb683c4c2
|
@ -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):
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
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):
|
||||||
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)
|
||||||
|
|
Loading…
Reference in New Issue