diff --git a/lib/Doctrine/Expression.php b/lib/Doctrine/Expression.php index 9983ff06b..9ced16eb0 100644 --- a/lib/Doctrine/Expression.php +++ b/lib/Doctrine/Expression.php @@ -661,4 +661,15 @@ class Doctrine_Expression extends Doctrine_Connection_Module { throw new Doctrine_Expression_Exception('method not implemented'); } + /** + * __call + * + * for all native RDBMS functions the function name itself is returned + */ + public function __call($m, $a) + { + if ($this->conn->getAttribute(Doctrine::ATTR_PORTABILITY) & Doctrine::PORTABILITY_EXPR) { + throw new Doctrine_Expression_Exception('Unknown expression ' . $m); + } + } } diff --git a/lib/Doctrine/Query.php b/lib/Doctrine/Query.php index 6e99257e7..9bfe99b9d 100644 --- a/lib/Doctrine/Query.php +++ b/lib/Doctrine/Query.php @@ -235,52 +235,50 @@ class Doctrine_Query extends Doctrine_Hydrate implements Countable { $pos = strpos($func, '('); $name = substr($func, 0, $pos); - - if(method_exists($this->conn->expression, $name)) { - + try { $argStr = substr($func, ($pos + 1), -1); $args = explode(',', $argStr); - + $func = call_user_func_array(array($this->conn->expression, $name), $args); - + if(substr($func, 0, 1) !== '(') { $pos = strpos($func, '('); $name = substr($func, 0, $pos); } else { $name = $func; } - + $e2 = explode(' ', $args[0]); - + $distinct = ''; if(count($e2) > 1) { if(strtoupper($e2[0]) == 'DISTINCT') $distinct = 'DISTINCT '; - + $args[0] = $e2[1]; } - - - + + + $parts = explode('.', $args[0]); $owner = $parts[0]; $alias = (isset($e[1])) ? $e[1] : $name; - + $e3 = explode('.', $alias); - + if(count($e3) > 1) { $alias = $e3[1]; $owner = $e3[0]; } - + // a function without parameters eg. RANDOM() if ($owner === '') { $owner = 0; } - + $this->pendingAggregates[$owner][] = array($name, $args, $distinct, $alias); - } else { - throw new Doctrine_Query_Exception('Unknown function '.$name); + } catch(Doctrine_Expression_Exception $e) { + throw new Doctrine_Query_Exception('Unknown function ' . $func . '.'); } } public function processPendingSubqueries()