=== trac/ticket/query.py
==================================================================
--- trac/ticket/query.py	(revision 4680)
+++ trac/ticket/query.py	(local)
@@ -226,50 +226,16 @@
         return cols
 
     def count(self, req, db=None, cached_ids=None):
-        sql, args = self.get_sql(req, cached_ids)
-        return self._count(sql, args)
+        self.execute(req, db, cached_ids)
+        return self.num_items
 
-    def _count(self, sql, args, db=None):
-        if not db:
-            db = self.env.get_db_cnx()
-        cursor = db.cursor()
-
-        count_sql = 'SELECT COUNT(*) FROM (' + sql + ') AS foo'
-        # self.env.log.debug("Count results in Query SQL: " + count_sql % 
-        #                    tuple([repr(a) for a in args]))
-
-        cnt = 0
-        try:
-            cursor.execute(count_sql, args);
-        except:
-            db.rollback()
-            raise
-        for cnt, in cursor:
-            break
-        self.env.log.debug("Count results in Query: %d" % cnt)
-        return cnt
-
     def execute(self, req, db=None, cached_ids=None):
         if not db:
             db = self.env.get_db_cnx()
         cursor = db.cursor()
 
         sql, args = self.get_sql(req, cached_ids)
-        self.num_items = self._count(sql, args, db)
 
-        if self.num_items <= self.max:
-            self.has_more_pages = False
-
-        if self.has_more_pages:
-            max = self.max
-            if self.group:
-                max += 1
-            sql = sql + " LIMIT %d OFFSET %d" % (max, self.offset)
-            if (self.page > int(ceil(float(self.num_items) / self.max)) and
-                self.num_items != 0):
-                raise TracError(_('Page %(page)s is beyond the number of '
-                                  'pages in the query', page=self.page))
-
         self.env.log.debug("Query SQL: " + sql % tuple([repr(a) for a in args]))     
         try:
             cursor.execute(sql, args)
@@ -304,8 +270,23 @@
                     except (TypeError, ValueError):
                         val = False
                 result[name] = val
-            results.append(result)
+            if 'TICKET_VIEW' in req.perm('ticket', result['id']):
+                results.append(result)
         cursor.close()
+
+        self.num_items = len(results)
+
+        if self.num_items <= self.max:
+            self.has_more_pages = False
+
+        if self.has_more_pages:
+            max = self.max
+            if self.group:
+                max += 1
+            if (self.page > int(ceil(float(self.num_items) / self.max)) and
+                self.num_items != 0):
+                raise TracError(_('Page %(page)s is beyond the number of '
+                                  'pages in the query', page=self.page))
         return results
 
     def get_href(self, href, id=None, order=None, desc=None, format=None,
@@ -667,8 +648,7 @@
 
         results = Paginator(tickets,
                             self.page - 1,
-                            self.max,
-                            self.num_items)
+                            self.max)
         
         if req:
             if results.has_next_page:

