summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2017-04-06 20:28:21 -0400
committerSimon Charette <charette.s@gmail.com>2017-04-07 16:47:52 -0400
commita354c69055fd818e612ce22eaa2da0576a4b89ee (patch)
treeba38fef11f821c00fdac9cb1b7b848ffd2553512
parent67b2b1f116aceee12922d2a8ff832382bca7e8ad (diff)
Fixed #28038 -- Restored casting to text of builtin lookups on PostgreSQL.
Reverted 658f1e8 which broke code using __icontains's implicit cast to ::text on ArrayField. Thanks Peter J. Farrell for the report.
-rw-r--r--django/db/backends/postgresql/operations.py2
-rw-r--r--docs/releases/1.11.1.txt3
-rw-r--r--tests/postgres_tests/test_array.py8
3 files changed, 11 insertions, 2 deletions
diff --git a/django/db/backends/postgresql/operations.py b/django/db/backends/postgresql/operations.py
index 4658eac7c1..497a5303a2 100644
--- a/django/db/backends/postgresql/operations.py
+++ b/django/db/backends/postgresql/operations.py
@@ -74,8 +74,6 @@ class DatabaseOperations(BaseDatabaseOperations):
'istartswith', 'endswith', 'iendswith', 'regex', 'iregex'):
if internal_type in ('IPAddressField', 'GenericIPAddressField'):
lookup = "HOST(%s)"
- elif internal_type in ('CharField', 'TextField'):
- lookup = '%s'
else:
lookup = "%s::text"
diff --git a/docs/releases/1.11.1.txt b/docs/releases/1.11.1.txt
index 101988819a..d1e054bb18 100644
--- a/docs/releases/1.11.1.txt
+++ b/docs/releases/1.11.1.txt
@@ -12,3 +12,6 @@ Bugfixes
* Made migrations respect ``Index``’s ``name`` argument. If you created a
named index with Django 1.11, ``makemigrations`` will create a migration to
recreate the index with the correct name (:ticket:`28051`).
+
+* Fixed a crash when using a ``__icontains`` lookup on a ``ArrayField``
+ (:ticket:`28038`).
diff --git a/tests/postgres_tests/test_array.py b/tests/postgres_tests/test_array.py
index 69ae5f3cda..a11b60e261 100644
--- a/tests/postgres_tests/test_array.py
+++ b/tests/postgres_tests/test_array.py
@@ -216,6 +216,14 @@ class TestQuerying(PostgreSQLTestCase):
self.objs[1:3]
)
+ def test_icontains(self):
+ # Using the __icontains lookup with ArrayField is inefficient.
+ instance = CharArrayModel.objects.create(field=['FoO'])
+ self.assertSequenceEqual(
+ CharArrayModel.objects.filter(field__icontains='foo'),
+ [instance]
+ )
+
def test_contains_charfield(self):
# Regression for #22907
self.assertSequenceEqual(