Index: django/db/models/query.py
===================================================================
--- django/db/models/query.py	(revision 6783)
+++ django/db/models/query.py	(working copy)
@@ -714,6 +714,7 @@
 
     def get_sql(self, opts):
         joins, where, params = SortedDict(), [], []
+        failed = 0
         for val in self.args:
             try:
                 joins2, where2, params2 = val.get_sql(opts)
@@ -721,8 +722,11 @@
                 where.extend(where2)
                 params.extend(params2)
             except EmptyResultSet:
-                if not isinstance(self, QOr):
-                    raise EmptyResultSet
+                failed+=1
+        if len(self.args)==failed:
+            raise EmptyResultSet
+        if not isinstance(self, QOr) and failed:
+            raise EmptyResultSet
         if where:
             return joins, ['(%s)' % self.operator.join(where)], params
         return joins, [], params
Index: tests/modeltests/or_lookups/models.py
===================================================================
--- tests/modeltests/or_lookups/models.py	(revision 6783)
+++ tests/modeltests/or_lookups/models.py	(working copy)
@@ -116,4 +116,13 @@
 [<Article: Hello>]
 >>> Article.objects.complex_filter(Q(pk=1) | Q(pk=2))
 [<Article: Hello>, <Article: Goodbye>]
+
+# Check that Q(pk__in=[]) returns the same results as Q(pk__in=[]) | Q(pk__in=[]) when used with filter :
+>>> Article.objects.filter(Q(pk__in=[]) | Q(pk__in=[]))
+[]
+
+# But with Q(pk__in=[]) | Q(pk__in=[1,]) | Q(pk__in=[]) it must return something :
+>>> Article.objects.filter(Q(pk__in=[]) | Q(pk__in=[1,]) | Q(pk__in=[]))
+[<Article: Hello>]
+
 """}
