diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py index a43d0ad2dc..87e3d83e9c 100644 --- a/frappe/model/db_query.py +++ b/frappe/model/db_query.py @@ -613,7 +613,10 @@ class DatabaseQuery: elif f.operator.lower() in ("in", "not in"): # if values contain '' or falsy values then only coalesce column - can_be_null = not f.value or any(v is None or v == "" for v in f.value) + # for `in` query this is only required if values contain '' or values are empty. + # for `not in` queries we can't be sure as column values might contain null. + if f.operator.lower() == "in": + can_be_null = not f.value or any(v is None or v == "" for v in f.value) values = f.value or "" if isinstance(values, str): diff --git a/frappe/tests/test_db_query.py b/frappe/tests/test_db_query.py index 881b90f399..9e61c5d3ec 100644 --- a/frappe/tests/test_db_query.py +++ b/frappe/tests/test_db_query.py @@ -749,6 +749,10 @@ class TestReportview(FrappeTestCase): self.assertNotIn("ifnull", frappe.get_all("User", {"name": ("in", ["a", "b"])}, run=0)) self.assertIn("ifnull", frappe.get_all("User", {"name": ("in", ["a", None])}, run=0)) self.assertIn("ifnull", frappe.get_all("User", {"name": ("in", ["a", ""])}, run=0)) + self.assertIn("ifnull", frappe.get_all("User", {"name": ("in", [])}, run=0)) + self.assertIn("ifnull", frappe.get_all("User", {"name": ("not in", ["a"])}, run=0)) + self.assertIn("ifnull", frappe.get_all("User", {"name": ("not in", [])}, run=0)) + self.assertIn("ifnull", frappe.get_all("User", {"name": ("not in", [""])}, run=0)) def add_child_table_to_blog_post():