mirror of
https://github.com/dg/dibi.git
synced 2025-08-06 14:16:39 +02:00
Merge pull request #160 from milo/pull-pglike
Fix DibiPostgreDriver::escapeLike()
This commit is contained in:
@@ -318,8 +318,9 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
||||||
|
|
||||||
case 'pgsql':
|
case 'pgsql':
|
||||||
|
$bs = substr($this->connection->quote('\\', PDO::PARAM_STR), 1, -1); // standard_conforming_strings = on/off
|
||||||
$value = substr($this->connection->quote($value, PDO::PARAM_STR), 1, -1);
|
$value = substr($this->connection->quote($value, PDO::PARAM_STR), 1, -1);
|
||||||
$value = strtr($value, array( '%' => '\\\\%', '_' => '\\\\_'));
|
$value = strtr($value, array('%' => $bs . '%', '_' => $bs . '_', '\\' => '\\\\'));
|
||||||
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
||||||
|
|
||||||
case 'sqlite':
|
case 'sqlite':
|
||||||
|
@@ -310,8 +310,9 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
*/
|
*/
|
||||||
public function escapeLike($value, $pos)
|
public function escapeLike($value, $pos)
|
||||||
{
|
{
|
||||||
|
$bs = pg_escape_string($this->connection, '\\'); // standard_conforming_strings = on/off
|
||||||
$value = pg_escape_string($this->connection, $value);
|
$value = pg_escape_string($this->connection, $value);
|
||||||
$value = strtr($value, array( '%' => '\\\\%', '_' => '\\\\_'));
|
$value = strtr($value, array('%' => $bs . '%', '_' => $bs . '_', '\\' => '\\\\'));
|
||||||
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -198,15 +198,36 @@ Assert::same(
|
|||||||
|
|
||||||
|
|
||||||
// like
|
// like
|
||||||
if ($config['driver'] !== 'sqlite') { // sqlite2
|
$args = array(
|
||||||
|
"SELECT * FROM products WHERE (title LIKE %like~ AND title LIKE %~like) OR title LIKE %~like~",
|
||||||
|
'C',
|
||||||
|
'r',
|
||||||
|
"a\n%_\\'\""
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($config['system'] === 'pgsql') {
|
||||||
|
$conn->query('SET escape_string_warning = off'); // do not log warnings
|
||||||
|
|
||||||
|
$conn->query('SET standard_conforming_strings = off');
|
||||||
|
Assert::same(
|
||||||
|
"SELECT * FROM products WHERE (title LIKE 'C%' AND title LIKE '%r') OR title LIKE '%a\n\\\\%\\\\_\\\\\\\\''\"%'",
|
||||||
|
$conn->translate($args[0], $args[1], $args[2], $args[3])
|
||||||
|
);
|
||||||
|
|
||||||
|
$conn->query('SET standard_conforming_strings = on');
|
||||||
|
Assert::same(
|
||||||
|
"SELECT * FROM products WHERE (title LIKE 'C%' AND title LIKE '%r') OR title LIKE '%a\n\\%\\_\\\\''\"%'",
|
||||||
|
$conn->translate($args[0], $args[1], $args[2], $args[3])
|
||||||
|
);
|
||||||
|
|
||||||
|
} elseif ($config['driver'] !== 'sqlite') { // sqlite2
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat(array(
|
reformat(array(
|
||||||
'sqlite' => "SELECT * FROM products WHERE (title LIKE 'C%' ESCAPE '\\' AND title LIKE '%r' ESCAPE '\\') OR title LIKE '%a\n\\%\\_\\\\''\"%' ESCAPE '\\'",
|
'sqlite' => "SELECT * FROM products WHERE (title LIKE 'C%' ESCAPE '\\' AND title LIKE '%r' ESCAPE '\\') OR title LIKE '%a\n\\%\\_\\\\''\"%' ESCAPE '\\'",
|
||||||
'odbc' => "SELECT * FROM products WHERE (title LIKE 'C%' AND title LIKE '%r') OR title LIKE '%a\n[%][_]\\''\"%'",
|
'odbc' => "SELECT * FROM products WHERE (title LIKE 'C%' AND title LIKE '%r') OR title LIKE '%a\n[%][_]\\''\"%'",
|
||||||
'pgsql' => "SELECT * FROM products WHERE (title LIKE 'C%' AND title LIKE '%r') OR title LIKE '%a\n\\\\%\\\\_\\''\"%'",
|
|
||||||
"SELECT * FROM products WHERE (title LIKE 'C%' AND title LIKE '%r') OR title LIKE '%a\\n\\%\\_\\\\\\\\\'\"%'",
|
"SELECT * FROM products WHERE (title LIKE 'C%' AND title LIKE '%r') OR title LIKE '%a\\n\\%\\_\\\\\\\\\'\"%'",
|
||||||
)),
|
)),
|
||||||
$conn->translate("SELECT * FROM products WHERE (title LIKE %like~ AND title LIKE %~like) OR title LIKE %~like~", 'C', 'r', "a\n%_\\'\"")
|
$conn->translate($args[0], $args[1], $args[2], $args[3])
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
34
tests/dibi/Postgre.like.phpt
Normal file
34
tests/dibi/Postgre.like.phpt
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider ../databases.ini
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Tester\Assert;
|
||||||
|
|
||||||
|
require __DIR__ . '/bootstrap.php';
|
||||||
|
|
||||||
|
if ($config['system'] !== 'pgsql') {
|
||||||
|
Tester\Environment::skip("Not supported system '$config[system]'.");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$tests = function($conn) {
|
||||||
|
Assert::false($conn->query("SELECT 'AAxBB' LIKE %~like~", 'A_B')->fetchSingle());
|
||||||
|
Assert::true( $conn->query("SELECT 'AA_BB' LIKE %~like~", 'A_B')->fetchSingle());
|
||||||
|
|
||||||
|
Assert::false($conn->query("SELECT 'AAxBB' LIKE %~like~", 'A%B')->fetchSingle());
|
||||||
|
Assert::true( $conn->query("SELECT 'AA%BB' LIKE %~like~", 'A%B')->fetchSingle());
|
||||||
|
|
||||||
|
Assert::same('AA\\BB', $conn->query("SELECT 'AA\\BB'")->fetchSingle());
|
||||||
|
Assert::false($conn->query("SELECT 'AAxBB' LIKE %~like~", 'A\\B')->fetchSingle());
|
||||||
|
Assert::true( $conn->query("SELECT 'AA\\BB' LIKE %~like~", 'A\\B')->fetchSingle());
|
||||||
|
};
|
||||||
|
|
||||||
|
$conn = new DibiConnection($config);
|
||||||
|
$conn->query('SET escape_string_warning = off'); // do not log warnings
|
||||||
|
|
||||||
|
$conn->query('SET standard_conforming_strings = on');
|
||||||
|
$tests($conn);
|
||||||
|
$conn->query('SET standard_conforming_strings = off');
|
||||||
|
$tests($conn);
|
Reference in New Issue
Block a user