[1.8.x] Fixed #25772 -- Corrected __len lookup on ArrayField for empty arrays.
Backport of 88fc9e2826
from master
This commit is contained in:
parent
78627091f8
commit
3ec4e739dd
|
@ -198,7 +198,11 @@ class ArrayLenTransform(Transform):
|
|||
|
||||
def as_sql(self, compiler, connection):
|
||||
lhs, params = compiler.compile(self.lhs)
|
||||
return 'array_length(%s, 1)' % lhs, params
|
||||
# Distinguish NULL and empty arrays
|
||||
return (
|
||||
'CASE WHEN %(lhs)s IS NULL THEN NULL ELSE '
|
||||
'coalesce(array_length(%(lhs)s, 1), 0) END'
|
||||
) % {'lhs': lhs}, params
|
||||
|
||||
|
||||
class IndexTransform(Transform):
|
||||
|
|
|
@ -11,3 +11,6 @@ Bugfixes
|
|||
|
||||
* Fixed incorrect ``unique_together`` field name generation by ``inspectdb``
|
||||
(:ticket:`25274`).
|
||||
|
||||
* Corrected ``__len`` query lookup on ``ArrayField`` for empty arrays
|
||||
(:ticket:`25772`).
|
||||
|
|
|
@ -218,6 +218,13 @@ class TestQuerying(TestCase):
|
|||
self.objs[0:3]
|
||||
)
|
||||
|
||||
def test_len_empty_array(self):
|
||||
obj = NullableIntegerArrayModel.objects.create(field=[])
|
||||
self.assertSequenceEqual(
|
||||
NullableIntegerArrayModel.objects.filter(field__len=0),
|
||||
[obj]
|
||||
)
|
||||
|
||||
def test_slice(self):
|
||||
self.assertSequenceEqual(
|
||||
NullableIntegerArrayModel.objects.filter(field__0_1=[2]),
|
||||
|
|
Loading…
Reference in New Issue