diff --git a/odoo/addons/base/tests/test_expression.py b/odoo/addons/base/tests/test_expression.py index c08b442ce95..388f248eba7 100644 --- a/odoo/addons/base/tests/test_expression.py +++ b/odoo/addons/base/tests/test_expression.py @@ -728,9 +728,17 @@ class TestExpression(SavepointCaseWithUserDemo): helen = Model.create({'name': 'Hélène'}) self.assertEqual(helen, Model.search([('name', 'ilike', 'Helene')])) self.assertEqual(helen, Model.search([('name', 'ilike', 'hélène')])) + self.assertEqual(helen, Model.search([('name', '=ilike', 'Hel%')])) + self.assertEqual(helen, Model.search([('name', '=ilike', 'hél%')])) self.assertNotIn(helen, Model.search([('name', 'not ilike', 'Helene')])) self.assertNotIn(helen, Model.search([('name', 'not ilike', 'hélène')])) + # =like and like should be case and accent sensitive + self.assertEqual(helen, Model.search([('name', '=like', 'Hél%')])) + self.assertNotIn(helen, Model.search([('name', '=like', 'Hel%')])) + self.assertEqual(helen, Model.search([('name', 'like', 'élè')])) + self.assertNotIn(helen, Model.search([('name', 'like', 'ele')])) + hermione, nicostratus = Model.create([ {'name': 'Hermione', 'parent_id': helen.id}, {'name': 'Nicostratus', 'parent_id': helen.id} diff --git a/odoo/osv/expression.py b/odoo/osv/expression.py index a7a193e77ff..b588923c566 100644 --- a/odoo/osv/expression.py +++ b/odoo/osv/expression.py @@ -1036,7 +1036,7 @@ class expression(object): push_result(expr, [right]) else: - if 'like' in operator: + if operator in ('like', 'ilike', 'not like', 'not ilike'): right = f'%{pycompat.to_text(right)}%' unaccent = self._unaccent(field) else: @@ -1372,7 +1372,7 @@ class expression(object): expr += f"{_left} {_sql_operator} {_unaccent('%s')} AND " params.append(_right) - unaccent = self._unaccent(field) if sql_operator.endswith('like') else lambda x: x + unaccent = self._unaccent(field) if sql_operator.endswith('ilike') else lambda x: x lang = model.env.lang or 'en_US' if lang == 'en_US': left = unaccent(f""""{alias}"."{field.name}"->>'en_US'""") @@ -1520,7 +1520,7 @@ class expression(object): sql_operator = {'=like': 'like', '=ilike': 'ilike'}.get(operator, operator) cast = '::text' if sql_operator.endswith('like') else '' - unaccent = self._unaccent(field) if sql_operator.endswith('like') else lambda x: x + unaccent = self._unaccent(field) if sql_operator.endswith('ilike') else lambda x: x column = '%s.%s' % (table_alias, _quote(left)) query = f'({unaccent(column + cast)} {sql_operator} {unaccent("%s")})'