diff --git includes/database.inc includes/database.inc index 0b5ead4..ffd23a5 100644 --- includes/database.inc +++ includes/database.inc @@ -62,7 +62,7 @@ define('DB_ERROR', 'a515ac9c2796ca0e23adbe92c68fc9fc'); * query: the SQL query executed, passed through check_plain() */ function update_sql($sql) { - $result = db_query($sql, true); + $result = db_query($sql, TRUE); return array('success' => $result !== FALSE, 'query' => check_plain($sql)); } diff --git includes/database.mysql.inc includes/database.mysql.inc index 43342e9..a06bd17 100644 --- includes/database.mysql.inc +++ includes/database.mysql.inc @@ -365,7 +365,7 @@ function db_distinct_field($table, $field, $query) { $matches = array(); if (preg_match('/^SELECT(.*?)FROM(.*)/is', $query, $matches)) { $select = preg_replace( - '/((?:^|,)\s*)(? $value) { + if (strstr($value, $qualified_primary_field)) { + $key_found = $key; + break; + } + } + if ($key_found !== FALSE) { + $prepend_to_order_by = $order_by_elements[$key_found]; + unset($order_by_elements[$key_found]); + } + else { + $prepend_to_order_by = $qualified_primary_field; + } + array_unshift($order_by_elements, $prepend_to_order_by); + $order_by = 'ORDER BY '. implode(', ', $order_by_elements); + } + else { + $order_by = ''; + } + $field_to_select = 'DISTINCT ON ('. $qualified_primary_field .') '. $qualified_primary_field; + $field_to_select_count = 'DISTINCT('. $qualified_primary_field .')'; + $patterns = array('/'. preg_quote($qualified_primary_field) .'(?=\s|,|$)/', '/(?<=COUNT\()'. preg_quote($qualified_primary_field) . '(?=\))/'); + $replacements = array($field_to_select, $field_to_select_count); + $select_list_replacement = preg_replace($patterns, $replacements, $matches[1]); + $query = preg_replace($regex, "SELECT $select_list_replacement FROM \\2$order_by\\5", $query); + } + } } return $query; }