? -x-681760.patch ? -y681760-node-query_1.patch ? 1001242-select-exists.patch ? 681760-node-query_1_2.patch ? 986296-21-node-type-status.patch ? 993026-sort-nodes-with-test.patch ? authorize_remove_check_plain.patch ? x100.patch ? sites/fullpreview ? sites/all/modules/ctools ? sites/all/modules/delay ? sites/all/modules/devel ? sites/all/modules/domain ? sites/all/modules/domain_prefix ? sites/all/modules/domain_user ? sites/all/modules/domain_views ? sites/all/modules/example ? sites/all/modules/fullpreview ? sites/all/modules/fullpreview.zip ? sites/all/modules/mega_menu ? sites/all/modules/pathauto ? sites/all/modules/pimp ? sites/all/modules/rainbow ? sites/all/modules/role_access ? sites/all/modules/role_edit ? sites/all/modules/secure_permissions ? sites/all/modules/styleguide ? sites/all/modules/token ? sites/all/modules/views ? sites/all/modules/workbench ? sites/all/themes/austin ? sites/all/themes/zen ? sites/default/files Index: modules/node/node.module =================================================================== RCS file: /cvs/drupal/drupal/modules/node/node.module,v retrieving revision 1.1334 diff -u -p -r1.1334 node.module --- modules/node/node.module 30 Dec 2010 03:47:36 -0000 1.1334 +++ modules/node/node.module 31 Dec 2010 17:56:31 -0000 @@ -3162,29 +3162,26 @@ function _node_query_node_access_alter($ return; } - // Prevent duplicate records. - $query->distinct(); - - // Find all instances of the {node} table being joined -- could appear - // more than once in the query, and could be aliased. Join each one to - // the node_access table. + // Find all instances of the {node} table in the query -- could appear + // more than once in the query, and could be aliased. Add a subselect + // to each one to properly filter by node access rules. $tables = $query->getTables(); + $grants = node_access_grants($op, $account); if ($type == 'entity') { // The original query looked something like: // @code // SELECT nid FROM sometable s - // INNER JOIN node_access na ON na.nid = s.nid - // WHERE ($node_access_conditions) + // WHERE EXISTS (SELECT nid FROM node_access na WHERE $node_access_conditions) // @endcode // // Our query will look like: // @code // SELECT entity_type, entity_id // FROM field_data_something s - // LEFT JOIN node_access na ON s.entity_id = na.nid - // WHERE (entity_type = 'node' AND $node_access_conditions) OR (entity_type <> 'node') + // WHERE (entity_type = 'node' AND EXISTS (SELECT nid FROM node_access na WHERE + // $node_access_conditions)) OR (entity_type <> 'node') // @endcode // // So instead of directly adding to the query object, we need to collect @@ -3194,17 +3191,9 @@ function _node_query_node_access_alter($ foreach ($tables as $nalias => $tableinfo) { $table = $tableinfo['table']; if (!($table instanceof SelectQueryInterface) && $table == $base_table) { - - // The node_access table has the access grants for any given node so JOIN - // it to the table containing the nid which can be either the node - // table or a field value table. - if ($type == 'node') { - $access_alias = $query->join('node_access', 'na', '%alias.nid = ' . $nalias . '.nid'); - } - else { - $access_alias = $query->leftJoin('node_access', 'na', '%alias.nid = ' . $nalias . '.entity_id'); - $base_alias = $nalias; - } + // Set the subquery. + $subquery = db_select('node_access', 'na') + ->fields('na', array('nid')); $grant_conditions = db_or(); // If any grant exists for the specified user, then user has access @@ -3212,29 +3201,29 @@ function _node_query_node_access_alter($ foreach ($grants as $realm => $gids) { foreach ($gids as $gid) { $grant_conditions->condition(db_and() - ->condition($access_alias . '.gid', $gid) - ->condition($access_alias . '.realm', $realm) + ->condition('na.gid', $gid) + ->condition('na.realm', $realm) ); } } - $count = count($grant_conditions->conditions()); - if ($type == 'node') { - if ($count) { - $query->condition($grant_conditions); - } - $query->condition($access_alias . '.grant_' . $op, 1, '>='); + // Attach conditions to the subquery for nodes. + if (count($grant_conditions->conditions())) { + $subquery->condition($grant_conditions); } - else { - if ($count) { - $entity_conditions->condition($grant_conditions); - } - $entity_conditions->condition($access_alias . '.grant_' . $op, 1, '>='); + $subquery->condition('na.grant_' . $op, 1, '>='); + $field = 'nid'; + // Now handle entities. + if ($type == 'entity') { + // Set a common alias for entities. + $base_alias = $nalias; + $field = 'entity_id'; } + $query->exists($subquery); } } - if ($type == 'entity' && count($entity_conditions->conditions())) { + if ($type == 'entity' && count($subquery->conditions())) { // All the node access conditions are only for field values belonging to // nodes. $entity_conditions->condition("$base_alias.entity_type", 'node'); @@ -3246,6 +3235,7 @@ function _node_query_node_access_alter($ // Add the compiled set of rules to the query. $query->condition($or); } + } /**