diff --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py index 2feb55454b..0cbd4b0b25 100644 --- a/trytond/model/modelsql.py +++ b/trytond/model/modelsql.py @@ -1835,15 +1835,21 @@ class ModelSQL(ModelStorage): else: if (arg[2] is False or arg[2] is None) and (arg[1] == '='): if column._type == 'boolean': - qu1.append('("%s"."%s" = %%s)' % \ - (table._table, arg[0])) + qu1.append('(("%s"."%s" = %%s) OR ("%s"."%s" IS NULL))' + % (table._table, arg[0], table._table, arg[0])) qu2.append(False) else: qu1.append('("%s"."%s" IS NULL)' % \ - (table._table, arg[0])) - elif (arg[2] is False or arg[2] is None) and (arg[1] == '!='): - qu1.append('("%s"."%s" IS NOT NULL)' % \ (table._table, arg[0])) + elif (arg[2] is False or arg[2] is None) and (arg[1] == '!='): + if column._type == 'boolean': + qu1.append('(("%s"."%s" != %%s) ' + 'AND ("%s"."%s" IS NOT NULL))' + % (table._table, arg[0], table._table, arg[0])) + qu2.append(False) + else: + qu1.append('("%s"."%s" IS NOT NULL)' % \ + (table._table, arg[0])) else: if arg[0] == 'id': qu1.append('("%s"."%s" %s %%s)' % \ diff --git a/trytond/tests/test_fields.py b/trytond/tests/test_fields.py index 71d2a193c5..564d38f88f 100644 --- a/trytond/tests/test_fields.py +++ b/trytond/tests/test_fields.py @@ -170,6 +170,23 @@ class FieldsTestCase(unittest.TestCase): boolean3_id = self.boolean.create({}) self.assert_(boolean3_id) + # Test search with NULL value + boolean4_id = self.boolean.create({ + 'boolean': None, + }) + self.assert_(boolean4_id) + + boolean_ids = self.boolean.search([ + ('boolean', '=', False), + ]) + self.assertEqual(boolean_ids, + [boolean2_id, boolean3_id, boolean4_id]) + + boolean_ids = self.boolean.search([ + ('boolean', '!=', False), + ]) + self.assertEqual(boolean_ids, [boolean1_id]) + boolean3 = self.boolean.read(boolean3_id, ['boolean']) self.assert_(boolean3['boolean'] == False)