diff --git a/modules/user/user.module b/modules/user/user.module
index 5892786f82967500621e10a34d650f1814b6923a..015facca24d3c82dfd2813bd1e364586b786050a 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -572,10 +572,10 @@ function user_role_permissions($roles = array(), $reset = FALSE) {
     if ($fetch) {
       // Get from the database permissions that were not in the static variable.
       // Only role IDs with at least one permission assigned will return rows.
-      $result = db_query("SELECT r.rid, p.permission FROM {role} r INNER JOIN {role_permission} p ON p.rid = r.rid WHERE r.rid IN (:fetch)", array(':fetch' => $fetch));
+      $result = db_query("SELECT rid, permission FROM {role_permission} WHERE rid IN (:fetch)", array(':fetch' => $fetch));
 
-      while ($row = db_fetch_array($result)) {
-        $stored_permissions[$row['rid']][$row['permission']] = TRUE;
+      foreach ($result as $row) {
+        $stored_permissions[$row->rid][$row->permission] = TRUE;
       }
       foreach ($fetch as $rid) {
         // For every rid, we know we at least assigned an empty array.