--- database.pgsql.inc.orig	Tue Dec 18 22:56:36 2007
+++ database.pgsql.inc	Tue Dec 18 22:57:28 2007
@@ -435,10 +435,26 @@ function db_check_setup() {
  * @return SQL query with the DISTINCT wrapper surrounding the given table.field.
  */
 function db_distinct_field($table, $field, $query) {
-  $field_to_select = 'DISTINCT ON ('. $table .'.'. $field .") $table.$field";
-  // (?<!text) is a negative look-behind (no need to rewrite queries that already use DISTINCT).
-  $query = preg_replace('/(SELECT.*)(?:'. $table .'\.|\s)(?<!DISTINCT\()(?<!DISTINCT\('. $table .'\.)'. $field .'(.*FROM )/AUsi', '\1 '. $field_to_select .'\2', $query);
-  $query = preg_replace('/(ORDER BY )(?!'. $table .'\.'. $field .')/', '\1'."$table.$field, ", $query);
+  // Rewrite rules:
+  //
+  // (1) SELECT .... FROM .... {some}_table t ....
+  //  => SELECT .... FROM .... (SELECT DISTINCT ON (primary_field) * FROM {some}_table) t ....
+  //
+  // (2) Don't rewrite SELECT DISTINCT ON (t.n)
+  //     SELECT DISTINCT ON (t.n) .... FROM .... {some}_table t ....
+  //  => SELECT DISTINCT ON (t.n) .... FROM .... {some}_table t ....
+  //
+  //     SELECT DISTINCT ON (n) .... FROM .... {some}_table t ....
+  //  => SELECT DISTINCT ON (t.n) .... FROM .... {some}_table t ....
+  //
+  // (3) SELECT DISTINCT ON (...., t.n, ....) .... FROM .... {some}_table t ....
+  //  => SELECT DISTINCT ON (...., t.n, ....) .... FROM .... (SELECT DISTINCT ON (f)// FROM {some}_table) t ....
+  if (!preg_match('/DISTINCT\s+ON\s*\(\s*('. $table .'\s*\.\s*)?'. $field .'\s*\)/si', $query)
+      && preg_match('/(.*FROM\s+)(.*?\s)(\s*(WHERE|GROUP|HAVING|ORDER|LIMIT|FOR).*)/Asi', $query, $m)) {
+    $query = $m[1];
+    $query .= preg_replace('/([\{\w+\}]+)\s+(' . $table . ')\s/Usi', '(SELECT DISTINCT ON (' . $field . ') * FROM \1) \2 ', $m[2]);
+    $query .= $m[3];
+  }
   return $query;
 }
 
