From 4c6ab1f2aa2a99d17ab308c0156f971a13d3fcaf Mon Sep 17 00:00:00 2001
From: adamb70 <adam.boaler@hotmail.com>
Date: Wed, 5 Feb 2020 01:51:13 +0000
Subject: [PATCH] Fixed #28528 -- Allowed combining SearchVectors with
 different configs.

---
 django/contrib/postgres/search.py   |  2 +-
 tests/postgres_tests/test_search.py | 11 +++++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/django/contrib/postgres/search.py b/django/contrib/postgres/search.py
index 000241ba24..2786251548 100644
--- a/django/contrib/postgres/search.py
+++ b/django/contrib/postgres/search.py
@@ -56,7 +56,7 @@ class SearchVectorCombinable:
     ADD = '||'
 
     def _combine(self, other, connector, reversed):
-        if not isinstance(other, SearchVectorCombinable) or not self.config == other.config:
+        if not isinstance(other, SearchVectorCombinable):
             raise TypeError(
                 'SearchVector can only be combined with other SearchVector '
                 'instances, got %s.' % type(other).__name__
diff --git a/tests/postgres_tests/test_search.py b/tests/postgres_tests/test_search.py
index 068a4afe93..89aa8c6662 100644
--- a/tests/postgres_tests/test_search.py
+++ b/tests/postgres_tests/test_search.py
@@ -297,6 +297,17 @@ class TestCombinations(GrailTestData, PostgreSQLTestCase):
         with self.assertRaisesMessage(TypeError, msg):
             Line.objects.filter(dialogue__search=None + SearchVector('character__name'))
 
+    def test_combine_different_vector_configs(self):
+        searched = Line.objects.annotate(
+            search=(
+                SearchVector('dialogue', config='english') +
+                SearchVector('dialogue', config='french')
+            ),
+        ).filter(
+            search=SearchQuery('cadeaux', config='french') | SearchQuery('nostrils')
+        )
+        self.assertCountEqual(searched, [self.french, self.verse2])
+
     def test_query_and(self):
         searched = Line.objects.annotate(
             search=SearchVector('scene__setting', 'dialogue'),