Index: includes/path.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/path.inc,v
retrieving revision 1.71
diff -u -p -r1.71 path.inc
--- includes/path.inc	9 Aug 2010 00:13:06 -0000	1.71
+++ includes/path.inc	18 Nov 2010 02:37:11 -0000
@@ -96,11 +96,16 @@ function drupal_lookup_path($action, $pa
           // Now fetch the aliases corresponding to these system paths.
           // We order by ASC and overwrite array keys to ensure the correct
           // alias is used when there are multiple aliases per path.
-          $cache['map'][$path_language] = db_query("SELECT source, alias FROM {url_alias} WHERE source IN (:system) AND language IN (:language, :language_none) ORDER BY language ASC, pid ASC", array(
+          $aliases = db_query("SELECT pid, source, alias, language FROM {url_alias} WHERE source IN (:system) AND language IN (:language, :language_none)", array(
             ':system' => $cache['system_paths'],
             ':language' => $path_language,
             ':language_none' => LANGUAGE_NONE,
-          ))->fetchAllKeyed();
+          ))->fetchAll(PDO::FETCH_ASSOC);
+          uasort($aliases, 'drupal_sort_url_aliases');
+          $aliases = array_reverse($aliases);
+          foreach ($aliases as $alias) {
+            $cache['map'][$path_language][$alias['source']] = $alias['alias'];
+          }
           // Keep a record of paths with no alias to avoid querying twice.
           $cache['no_aliases'][$path_language] = array_flip(array_diff_key($cache['system_paths'], array_keys($cache['map'][$path_language])));
         }
@@ -118,13 +123,15 @@ function drupal_lookup_path($action, $pa
       // For system paths which were not cached, query aliases individually.
       elseif (!isset($cache['no_aliases'][$path_language][$path])) {
         // Get the most fitting result falling back with alias without language
-        $alias = db_query("SELECT alias FROM {url_alias} WHERE source = :source AND language IN (:language, :language_none) ORDER BY language DESC, pid DESC", array(
+        $aliases = db_query("SELECT pid, source, alias, language FROM {url_alias} WHERE source = :source AND language IN (:language, :language_none)", array(
           ':source' => $path,
           ':language' => $path_language,
           ':language_none' => LANGUAGE_NONE,
-        ))->fetchField();
-        $cache['map'][$path_language][$path] = $alias;
-        return $alias;
+        ))->fetchAll(PDO::FETCH_ASSOC);
+        uasort($aliases, 'drupal_sort_url_aliases');
+        $alias = reset($aliases);
+        $cache['map'][$path_language][$path] = $alias['alias'];
+        return $alias['alias'];
       }
     }
     // Check $no_source for this $path in case we've already determined that there
@@ -134,12 +141,15 @@ function drupal_lookup_path($action, $pa
       $source = FALSE;
       if (!isset($cache['map'][$path_language]) || !($source = array_search($path, $cache['map'][$path_language]))) {
         // Get the most fitting result falling back with alias without language
-        if ($source = db_query("SELECT source FROM {url_alias} WHERE alias = :alias AND language IN (:language, :language_none) ORDER BY language DESC, pid DESC", array(
-                     ':alias' => $path,
-                     ':language' => $path_language,
-                     ':language_none' => LANGUAGE_NONE))
-            ->fetchField()) {
-          $cache['map'][$path_language][$source] = $path;
+        $aliases = db_query("SELECT pid, source, alias, language FROM {url_alias} WHERE alias = :alias AND language IN (:language, :language_none)", array(
+          ':alias' => $path,
+          ':language' => $path_language,
+          ':language_none' => LANGUAGE_NONE,
+        ))->fetchAll(PDO::FETCH_ASSOC);
+        if (!empty($aliases)) {
+          uasort($aliases, 'drupal_sort_url_aliases');
+          $alias = reset($aliases);
+          $cache['map'][$path_language][$alias['source']] = $path;
         }
         else {
           // We can't record anything into $map because we do not have a valid
@@ -155,6 +165,15 @@ function drupal_lookup_path($action, $pa
   return FALSE;
 }
 
+function drupal_sort_url_aliases($a, $b) {
+  if ($a['language'] != $b['language']) {
+    return $a['language'] == LANGUAGE_NONE;
+  }
+  else {
+    return $a['pid'] < $b['pid'];
+  }
+}
+
 /**
  * Cache system paths for a page.
  *
