Support query without where clause when searching on Many2One with where operator

When not using subquery but EXISTS and having a target domain converted into
UNION, the query result does not have a 'where' clause.

Closes #14889
(grafted from 96982406e129d1e063c1a332289376f45e586ecc)

--HG--
branch : 8.0
This commit is contained in:
Cédric Krier
2026-06-11 14:29:17 +02:00
parent 596c9b8153
commit bb38407c55
2 changed files with 25 additions and 1 deletions
+4 -1
View File
@@ -284,7 +284,10 @@ class Many2One(Field):
if use_subquery:
expression = column.in_(query)
else:
query.where &= target_id == column
if query.where is None:
query.where = target_id == column
else:
query.where &= target_id == column
expression = Exists(query)
if operator.startswith('not'):
return ~expression
@@ -332,6 +332,27 @@ class SearchTestCaseMixin:
], query=True)
self.assertIn(self._strategy, str(query))
@with_transaction()
def test_search_where_target_union(self):
"Test search on Many2One using where and UNION-ed query on target"
pool = Pool()
Target = pool.get('test.many2one_target')
Many2One = pool.get('test.many2one')
target1, target2 = Target.create([
{'value': 1},
{'value': 2},
])
many2one1, many2one2 = Many2One.create([
{'many2one': target1},
{'many2one': target2},
])
many2ones = Many2One.search([
('many2one', 'where',
['OR', ('value', '=', 1), ('write_uid.id', '=', -1)]),
])
self.assertListEqual(many2ones, [many2one1])
class FieldMany2OneTestCase(
TestCase, CommonTestCaseMixin, SearchTestCaseMixin):