Index: django/db/models/sql/where.py
===================================================================
--- django/db/models/sql/where.py	(revision 6783)
+++ django/db/models/sql/where.py	(working copy)
@@ -42,6 +42,8 @@
             return None, []
         result = []
         result_params = []
+        if self.connection == OR:
+            failed = 0
         for child in node.children:
             if hasattr(child, 'as_sql'):
                 sql, params = child.as_sql(qn=qn)
@@ -60,10 +62,14 @@
                     if self.connection == AND and not node.negated:
                         # We can bail out early in this particular case (only).
                         raise
+                    elif self.connection == OR:
+                        failed += 1
                     sql = None
             if sql:
                 result.append(format % sql)
                 result_params.extend(params)
+        if self.connection == OR and failed == len(node.children):
+            raise EmptyResultSet
         conn = ' %s ' % node.connection
         return conn.join(result), result_params
 
Index: tests/modeltests/or_lookups/models.py
===================================================================
--- tests/modeltests/or_lookups/models.py	(revision 6783)
+++ tests/modeltests/or_lookups/models.py	(working copy)
@@ -125,4 +125,10 @@
 [<Article: Hello>]
 >>> Article.objects.complex_filter(Q(pk=1) | Q(pk=2))
 [<Article: Hello>, <Article: Goodbye>]
+
+# Check that Q(id__in=[]) returns the same results as Q(id__in=[]) | Q(id__in=[]) when used with filter : 
+>>> Article.objects.filter(Q(id__in=[]) | Q(id__in=[])) 
+[]
+>>> Article.objects.filter(Q(id__in=[]) | Q(id=1) |Q(id__in=[])) 
+[<Article: Hello>]
 """}
