Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.893
diff -u -p -r1.893 common.inc
--- includes/common.inc	7 May 2009 15:29:07 -0000	1.893
+++ includes/common.inc	8 May 2009 00:14:31 -0000
@@ -1873,6 +1873,7 @@ function drupal_page_footer() {
 
   module_implements(MODULE_IMPLEMENTS_WRITE_CACHE);
   _registry_check_code(REGISTRY_WRITE_LOOKUP_CACHE);
+  drupal_cache_system_paths();
 }
 
 /**
Index: includes/path.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/path.inc,v
retrieving revision 1.35
diff -u -p -r1.35 path.inc
--- includes/path.inc	7 May 2009 15:49:57 -0000	1.35
+++ includes/path.inc	8 May 2009 00:14:31 -0000
@@ -1,5 +1,5 @@
 <?php
-// $Id: path.inc,v 1.35 2009/05/07 15:49:57 webchick Exp $
+// $Id: path.inc,v 1.33 2009/04/03 17:41:32 dries Exp $
 
 /**
  * @file
@@ -49,6 +49,8 @@ function drupal_lookup_path($action, $pa
   $map = &drupal_static(__FUNCTION__, array());
   $no_src = &drupal_static(__FUNCTION__ . ':no_src', array());
   $count = &drupal_static(__FUNCTION__ . ':count');
+  $system_paths = &drupal_static(__FUNCTION__ . ':system_paths');
+  $no_aliases = &drupal_static(__FUNCTION__ . ':no_alias', array());
 
   $path_language = $path_language ? $path_language : $language->language;
 
@@ -61,19 +63,41 @@ function drupal_lookup_path($action, $pa
     $map = array();
     $no_src = array();
     $count = NULL;
+    $system_paths = array();
+    $no_aliases = array();
   }
   elseif ($count > 0 && $path != '') {
     if ($action == 'alias') {
+      // During the first call to drupal_lookup_path() fetch as many paths
+      // as possible from cache.
+      if (!isset($map[$path_language])) {
+        // First get the cache of system paths saved for the current path.
+        $cid = 'path:system:' . current_path();
+        if ($cache = cache_get($cid, 'cache_path')) {
+          $system_paths = $cache->data;
+          // Now fetch the aliases corresponding to these system paths.
+          $result = db_query("SELECT src, dst FROM {url_alias} WHERE src IN(:system) AND language IN(:language, '') ORDER BY language ASC", array(
+                      ':system' => $system_paths,
+                      ':language' => $path_language));
+          foreach ($result as $record) {
+            $map[$path_language][$record->src] = $record->dst;
+          }
+          // Keep a record of paths with no alias to avoid querying twice.
+          $no_aliases[$path_language] = array_flip(array_diff_key($system_paths, array_keys($map[$path_language])));
+        }
+      }
       if (isset($map[$path_language][$path])) {
         return $map[$path_language][$path];
       }
-      // Get the most fitting result falling back with alias without language
-      $alias = db_query("SELECT dst FROM {url_alias} WHERE src = :src AND language IN(:language, '') ORDER BY language DESC", array(
-        ':src' => $path,
-        ':language' => $path_language))
-        ->fetchField();
-      $map[$path_language][$path] = $alias;
-      return $alias;
+      else if (!isset($no_aliases[$path_language][$path])) {
+        // Get the most fitting result falling back with alias without language
+        $alias = db_query("SELECT dst FROM {url_alias} WHERE src = :src AND language IN(:language, '') ORDER BY language DESC", array(
+          ':src' => $path,
+          ':language' => $path_language))
+          ->fetchField();
+        $map[$path_language][$path] = $alias;
+        return $alias;
+      }
     }
     // Check $no_src for this $path in case we've already determined that there
     // isn't a path that has this alias
@@ -103,11 +127,25 @@ function drupal_lookup_path($action, $pa
 }
 
 /**
+ * Cache system paths for a page.
+ */
+function drupal_cache_system_paths() {
+  $map = &drupal_static('drupal_lookup_path', array());
+  $system_paths = &drupal_static('drupal_lookup_path:system_paths', array());
+  if (!$system_paths && $item = menu_get_item()) {
+     // Generate a cache ID (cid) specific for this page.
+     $cid = 'path:system:' . current_path();
+     // Only store the system paths for this request.
+     if ($paths = current($map)) {
+       $data = array_keys($paths);
+       cache_set($cid, $data, 'cache_path');
+     }
+   }
+}
+
+/**
  * Given an internal Drupal path, return the alias set by the administrator.
  *
- * If no path is provided, the function will return the alias of the current
- * page.
- *
  * @param $path
  *   An internal Drupal path.
  * @param $path_language
Index: modules/system/system.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.install,v
retrieving revision 1.321
diff -u -p -r1.321 system.install
--- modules/system/system.install	7 May 2009 15:29:08 -0000	1.321
+++ modules/system/system.install	8 May 2009 00:14:39 -0000
@@ -606,6 +606,8 @@ function system_schema() {
   $schema['cache_page']['description'] = 'Cache table used to store compressed pages for anonymous users, if page caching is enabled.';
   $schema['cache_menu'] = $schema['cache'];
   $schema['cache_menu']['description'] = 'Cache table for the menu system to store router information as well as generated link trees for various menu/page/user combinations.';
+  $schema['cache_path'] = $schema['cache'];
+  $schema['cache_path']['description'] = 'Cache table for path alias lookup.';
   $schema['cache_registry'] = $schema['cache'];
   $schema['cache_registry']['description'] = 'Cache table for the code registry system to remember what code files need to be loaded on any given page.';
 
@@ -3439,6 +3441,17 @@ function system_update_7023() {
 }
 
 /**
+ * Create the cache_path table.
+ */
+function system_update_7024() {
+  $ret = array();
+  $schema['cache_path'] = drupal_get_schema_unprocessed('system', 'cache');
+  $schema['cache_path']['description'] = t('Cache table used for path alias lookups.');
+  db_create_table($ret, 'cache_path', $schema['cache_path']);
+  return $ret;
+}
+
+/**
  * @} End of "defgroup updates-6.x-to-7.x"
  * The next series of updates should start at 8000.
  */
