commit 5048476fd5dcaa7ef2b631e36a6e7cad7bb4549a
Author: Ryan Hughes <rjhughes@med.umich.edu>
Date:   Thu Apr 14 10:24:03 2011 -0400

    Oracle translator for groupby aliases works.

diff --git a/includes/database.oracle.inc b/includes/database.oracle.inc
index 78e7843..1d2b982 100644
--- a/includes/database.oracle.inc
+++ b/includes/database.oracle.inc
@@ -277,43 +277,39 @@ function oracle_escape_empty_literals($query)
   	    return preg_replace_callback("/'.*?'/", 'oracle_escape_empty_literal', $query);
 }
 
-function oracle_escape_group_by_alias_callback($match, $al= FALSE, $cl= FALSE, $init = FALSE)
-{
-  static $aliases;
-  static $cols;
-  
-  if ($init) {
-    $aliases= $al;
-    $cols= $cl;
-    return;
+function oracle_escape_group_by_alias_callback($matches) {
+  $query   = $matches[0];
+  $select  = $matches[1];
+  $fields  = $matches[2];
+  $groupby = $matches[3];
+  $having  = $matches[4];
+  $outro   = $matches[5];
+
+  $fieldspec = explode(',', $fields);
+  $groupbyspec = explode(',', $groupby);
+
+  $aliases = array();
+  foreach ($fieldspec as $field) {
+    list($col, $alias) = explode(" AS ", $field, 2);
+
+    $aliases[trim($alias)] = trim($col);
   }
 
-  $retval= $match[0];
-  $pieces= explode("ORDER BY",$retval);
-  $retval= preg_replace('/^GROUP BY nid$/','',$pieces[0]);
-
-  foreach ($aliases as $key => $alias)
-  {
-    $col= trim($cols[$key]);
-    $retval= str_replace($alias, $col, $retval);
+  foreach ($groupbyspec as $key => $groupcol) {
+    if (isset($aliases[trim($groupcol)])) {
+      $groupbyspec[$key] = $aliases[trim($groupcol)];
+    }
   }
-
-  return $retval.( isset($pieces[1]) ? "ORDER BY".$pieces[1] : "");
-
+  
+  $retval = "{$select} {$fields} GROUP BY ".implode(',', $groupbyspec)." {$having} {$outro}";
+  return $retval;
 }
 
 function oracle_escape_group_by_alias($query)
 {
 	if (preg_match('/GROUP BY/',$query))
 	{
-		preg_match_all('/(SELECT COUNT\(\*\) FROM \()*(SELECT )*(DISTINCT )*((.+?)\sAS\s([^,\s]+)[,\s]*?)/',$query,$matches);
-		$cols= $matches[5];
-		$aliases= $matches[6];
-		if (count($cols)>0)
-		{
-			oracle_escape_group_by_alias_callback(NULL,$aliases,$cols,TRUE); 
-			$query= preg_replace_callback("/GROUP BY.*/",'oracle_escape_group_by_alias_callback',$query);
-		}
+		$newquery = preg_replace_callback('/^(SELECT (.*?) FROM.*)GROUP BY (.*?)(HAVING|ORDER BY)(.*?)$/is', "oracle_escape_group_by_alias_callback", $query);
 	}
 	
 	return $query;
