1
0
mirror of https://github.com/django/django.git synced 2025-10-23 21:59:11 +00:00

Fixed #25517 -- Made Concat function idempotent on SQLite.

This commit is contained in:
Josh Smeaton
2015-10-14 10:07:42 +11:00
committed by Tim Graham
parent 0922bbf18d
commit 6c95b134e9
3 changed files with 26 additions and 7 deletions

View File

@@ -7,7 +7,8 @@ from django.db import connection
from django.db.models import CharField, TextField, Value as V
from django.db.models.expressions import RawSQL
from django.db.models.functions import (
Coalesce, Concat, Greatest, Least, Length, Lower, Now, Substr, Upper,
Coalesce, Concat, ConcatPair, Greatest, Least, Length, Lower, Now, Substr,
Upper,
)
from django.test import TestCase, skipIfDBFeature, skipUnlessDBFeature
from django.utils import six, timezone
@@ -353,6 +354,19 @@ class FunctionTests(TestCase):
expected = article.title + ' - ' + article.text
self.assertEqual(expected.upper(), article.title_text)
@skipUnless(connection.vendor == 'sqlite', "sqlite specific implementation detail.")
def test_concat_coalesce_idempotent(self):
pair = ConcatPair(V('a'), V('b'))
# Check nodes counts
self.assertEqual(len(list(pair.flatten())), 3)
self.assertEqual(len(list(pair.coalesce().flatten())), 7) # + 2 Coalesce + 2 Value()
self.assertEqual(len(list(pair.flatten())), 3)
def test_concat_sql_generation_idempotency(self):
qs = Article.objects.annotate(description=Concat('title', V(': '), 'summary'))
# Multiple compilations should not alter the generated query.
self.assertEqual(str(qs.query), str(qs.all().query))
def test_lower(self):
Author.objects.create(name='John Smith', alias='smithj')
Author.objects.create(name='Rhonda')