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 : 7.0
This commit is contained in:
Cédric Krier
2026-06-11 14:29:17 +02:00
parent 573113ca33
commit dc482bf2a3
2 changed files with 25 additions and 1 deletions
+4 -1
View File
@@ -250,7 +250,10 @@ class Many2One(Field):
target_id, = query.columns
if isinstance(target_id, As):
target_id = target_id.expression
query.where &= target_id == column
if query.where is None:
query.where = target_id == column
else:
query.where &= target_id == column
expression = column.in_(query)
if operator.startswith('not'):
return ~expression
@@ -274,6 +274,27 @@ class FieldMany2OneTestCase(unittest.TestCase):
self.assertEqual(record.target.context, 'foo')
@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 FieldMany2OneTreeTestCase(unittest.TestCase):
"Test Field Many2One Tree"