Skip to content

Commit

Permalink
Database: implemented placeholder for delimited table name [closes ne…
Browse files Browse the repository at this point in the history
  • Loading branch information
hrach committed Dec 30, 2013
1 parent 7a1a4a3 commit d05c7d9
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 5 deletions.
10 changes: 7 additions & 3 deletions Nette/Database/SqlPreprocessor.php
Expand Up @@ -79,7 +79,7 @@ public function process($params)
} else {
$res[] = Nette\Utils\Strings::replace(
$param,
'~\'.*?\'|".*?"|\?|\b(?:INSERT|REPLACE|UPDATE|WHERE|HAVING|ORDER BY|GROUP BY)\b|/\*.*?\*/|--[^\n]*~si',
'~\'.*?\'|".*?"|\?i?|\b(?:INSERT|REPLACE|UPDATE|WHERE|HAVING|ORDER BY|GROUP BY)\b|/\*.*?\*/|--[^\n]*~si',
array($this, 'callback')
);
}
Expand All @@ -96,11 +96,15 @@ public function callback($m)
if ($m[0] === "'" || $m[0] === '"' || $m[0] === '/' || $m[0] === '-') { // string or comment
return $m;

} elseif ($m === '?') { // placeholder
} elseif ($m === '?' || $m === '?i') { // placeholder
if ($this->counter >= count($this->params)) {
throw new Nette\InvalidArgumentException('There are more placeholders than passed parameters.');
}
return $this->formatValue($this->params[$this->counter++]);
if ($m === '?') {
return $this->formatValue($this->params[$this->counter++]);
} else {
return $this->driver->delimite($this->params[$this->counter++]);
}

} else { // command
$this->arrayMode = $this->arrayModes[strtoupper($m)];
Expand Down
4 changes: 2 additions & 2 deletions Nette/Database/Table/SqlBuilder.php
Expand Up @@ -478,8 +478,8 @@ protected function buildQueryEnd()
protected function tryDelimite($s)
{
$driver = $this->driver;
return preg_replace_callback('#(?<=[^\w`"\[]|^)[a-z_][a-z0-9_]*(?=[^\w`"(\]]|\z)#i', function($m) use ($driver) {
return strtoupper($m[0]) === $m[0] ? $m[0] : $driver->delimite($m[0]);
return preg_replace_callback('#(?<=[^\w`"\[]|^)(?:[a-z_][a-z0-9_]*|\?i)(?=[^\w`"(\]]|\z)#i', function($m) use ($driver) {
return $m[0] === '?i' || strtoupper($m[0]) === $m[0] ? $m[0] : $driver->delimite($m[0]);
}, $s);
}

Expand Down
9 changes: 9 additions & 0 deletions tests/Nette/Database/SqlBuilder.addWhere().phpt
Expand Up @@ -31,6 +31,15 @@ test(function() use ($connection, $reflection) { // test paramateres with NULL
});


test(function() use ($connection, $reflection) {
$sqlBuilder = new SqlBuilder('book', $connection, $reflection);
$sqlBuilder->addWhere('?i ?', 'id', 3);
$sqlBuilder->addWhere('?i = ?', 'number', 4);
$sqlBuilder->addWhere('?i ?', 'number', NULL);
Assert::same(reformat('SELECT * FROM [book] WHERE (?i = ?) AND (?i = ?) AND (?i IS NULL)'), $sqlBuilder->buildSelectQuery());
});


test(function() use ($dao, $connection, $reflection) { // test Selection as a parameter
$sqlBuilder = new SqlBuilder('book', $connection, $reflection);
$sqlBuilder->addWhere('id', $dao->table('book'));
Expand Down
7 changes: 7 additions & 0 deletions tests/Nette/Database/SqlPreprocessor.phpt
Expand Up @@ -58,6 +58,13 @@ test(function() use ($preprocessor) {
});


test(function() use ($preprocessor) {
list($sql, $params) = $preprocessor->process(array('SELECT id FROM author WHERE ?i = ? OR ?i = ?', 'id', 12, 'number', 23));
Assert::same( reformat('SELECT id FROM author WHERE [id] = 12 OR [number] = 23'), $sql );
Assert::same( array(), $params );
});


test(function() use ($preprocessor) { // comments
list($sql, $params) = $preprocessor->process(array("SELECT id --?\nFROM author WHERE id = ?", 11));
Assert::same( "SELECT id --?\nFROM author WHERE id = 11", $sql );
Expand Down

0 comments on commit d05c7d9

Please sign in to comment.