Skip to content
This repository has been archived by the owner on May 16, 2018. It is now read-only.

Commit

Permalink
Merge pull request #441 from Mayflower/nested-sql-functions
Browse files Browse the repository at this point in the history
Loosen regex to allow nested function calls in SQL
  • Loading branch information
froschdesign committed Jan 5, 2015
2 parents e5c1deb + c630cda commit e78669d
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 3 deletions.
6 changes: 3 additions & 3 deletions library/Zend/Db/Select.php
Original file line number Diff line number Diff line change
Expand Up @@ -509,7 +509,7 @@ public function group($spec)
}

foreach ($spec as $val) {
if (preg_match('/^[\w]*\([^\)]*\)$/', (string) $val)) {
if (preg_match('/^([\w]*\(([^\)]|(?1))*\))$/', (string) $val)) {
$val = new Zend_Db_Expr($val);
}
$this->_parts[self::GROUP][] = $val;
Expand Down Expand Up @@ -601,7 +601,7 @@ public function order($spec)
$val = trim($matches[1]);
$direction = $matches[2];
}
if (preg_match('/^[\w]*\([^\)]*\)$/', $val)) {
if (preg_match('/^([\w]*\(([^\)]|(?1))*\))$/', (string) $val)) {
$val = new Zend_Db_Expr($val);
}
$this->_parts[self::ORDER][] = array($val, $direction);
Expand Down Expand Up @@ -943,7 +943,7 @@ protected function _tableCols($correlationName, $cols, $afterCorrelationName = n
$alias = $m[2];
}
// Check for columns that look like functions and convert to Zend_Db_Expr
if (preg_match('/^[\w]*\([^\)]*\)$/', $col)) {
if (preg_match('/^([\w]*\(([^\)]|(?1))*\))$/', (string) $col)) {
$col = new Zend_Db_Expr($col);
} elseif (preg_match('/(.+)\.(.+)/', $col, $m)) {
$currentCorrelationName = $m[1];
Expand Down
20 changes: 20 additions & 0 deletions tests/Zend/Db/Select/StaticTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -854,6 +854,26 @@ public function testSqlInjectionInColumn()
$this->assertEquals('SELECT "p"."MD5(1); drop table products; -- )" FROM "products" AS "p"', $select->assemble());
}

public function testIfInColumn()
{
$select = $this->_db->select();
$select->from('table1', '*');
$select->join(array('table2'),
'table1.id = table2.id',
array('bar' => 'IF(table2.id IS NOT NULL, 1, 0)'));
$this->assertEquals("SELECT \"table1\".*, IF(table2.id IS NOT NULL, 1, 0) AS \"bar\" FROM \"table1\"\n INNER JOIN \"table2\" ON table1.id = table2.id", $select->assemble());
}

public function testNestedIfInColumn()
{
$select = $this->_db->select();
$select->from('table1', '*');
$select->join(array('table2'),
'table1.id = table2.id',
array('bar' => 'IF(table2.id IS NOT NULL, IF(table2.id2 IS NOT NULL, 1, 2), 0)'));
$this->assertEquals("SELECT \"table1\".*, IF(table2.id IS NOT NULL, IF(table2.id2 IS NOT NULL, 1, 2), 0) AS \"bar\" FROM \"table1\"\n INNER JOIN \"table2\" ON table1.id = table2.id", $select->assemble());
}

/**
* @group ZF-378
*/
Expand Down

0 comments on commit e78669d

Please sign in to comment.