--- 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"; - // (? 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; }