mirror of
https://github.com/dg/dibi.git
synced 2025-08-05 05:37:39 +02:00
DibiPdoDriver: added support for MsSql2012 Offset
Since MsSql2012 allow using of OFFSET, I added this option to the driver for PDO. Driver will automaticly recognize this is proper version and use the new offset.
This commit is contained in:
@@ -38,6 +38,9 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
/** @var string */
|
/** @var string */
|
||||||
private $driverName;
|
private $driverName;
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
|
private $serverVersion;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws DibiNotSupportedException
|
* @throws DibiNotSupportedException
|
||||||
@@ -75,6 +78,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->driverName = $this->connection->getAttribute(PDO::ATTR_DRIVER_NAME);
|
$this->driverName = $this->connection->getAttribute(PDO::ATTR_DRIVER_NAME);
|
||||||
|
$this->serverVersion = $this->connection->getAttribute(PDO::ATTR_SERVER_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -396,10 +400,19 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'odbc':
|
|
||||||
case 'dblib':
|
|
||||||
case 'mssql':
|
case 'mssql':
|
||||||
case 'sqlsrv':
|
case 'sqlsrv':
|
||||||
|
case 'dblib':
|
||||||
|
if (version_compare($this->serverVersion, '11.0') >= 0) {
|
||||||
|
if ($offset >= 0 || $limit >= 0) {
|
||||||
|
$sql .= ' OFFSET ' . (int) $offset . ' ROWS'
|
||||||
|
. ($limit > 0 ? ' FETCH NEXT ' . (int) $limit . ' ROWS ONLY' : '');
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// intentionally break omitted
|
||||||
|
|
||||||
|
case 'odbc':
|
||||||
if ($offset < 1) {
|
if ($offset < 1) {
|
||||||
$sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ') t';
|
$sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ') t';
|
||||||
break;
|
break;
|
||||||
|
80
tests/dibi/PdoMssql.limits.phpt
Normal file
80
tests/dibi/PdoMssql.limits.phpt
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider ../databases.ini
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Tester\Assert;
|
||||||
|
|
||||||
|
require __DIR__ . '/bootstrap.php';
|
||||||
|
|
||||||
|
if ($config['system'] !== 'mssql' || $config['driver'] !== 'pdo') {
|
||||||
|
Tester\Environment::skip("Not supported system '$config[system]'.");
|
||||||
|
}
|
||||||
|
|
||||||
|
$tests = function($conn){
|
||||||
|
$version = $conn->getDriver()->getResource()->getAttribute(PDO::ATTR_SERVER_VERSION);
|
||||||
|
|
||||||
|
// MsSQL2012+
|
||||||
|
if(version_compare($version, '11.0') >= 0) {
|
||||||
|
// Limit and offset
|
||||||
|
Assert::same(
|
||||||
|
'SELECT 1 OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY',
|
||||||
|
$conn->translate('SELECT 1 %ofs %lmt', 10, 10)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Limit only
|
||||||
|
Assert::same(
|
||||||
|
'SELECT 1 OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY',
|
||||||
|
$conn->translate('SELECT 1 %lmt', 10)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Offset only
|
||||||
|
Assert::same(
|
||||||
|
'SELECT 1 OFFSET 10 ROWS',
|
||||||
|
$conn->translate('SELECT 1 %ofs', 10)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Offset invalid
|
||||||
|
Assert::same(
|
||||||
|
'SELECT 1',
|
||||||
|
$conn->translate('SELECT 1 %ofs', -10)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Limit invalid
|
||||||
|
Assert::same(
|
||||||
|
'SELECT 1',
|
||||||
|
$conn->translate('SELECT 1 %lmt', -10)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Limit invalid, offset valid
|
||||||
|
Assert::same(
|
||||||
|
'SELECT 1',
|
||||||
|
$conn->translate('SELECT 1 %ofs %lmt', 10, -10)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Limit valid, offset invalid
|
||||||
|
Assert::same(
|
||||||
|
'SELECT 1',
|
||||||
|
$conn->translate('SELECT 1 %ofs %lmt', -10, 10)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
Assert::same(
|
||||||
|
'SELECT TOP 1 * FROM (SELECT 1) t',
|
||||||
|
$conn->translate('SELECT 1 %lmt', 1)
|
||||||
|
);
|
||||||
|
|
||||||
|
Assert::same(
|
||||||
|
'SELECT 1',
|
||||||
|
$conn->translate('SELECT 1 %lmt', -10)
|
||||||
|
);
|
||||||
|
|
||||||
|
Assert::exception(
|
||||||
|
$conn->translate('SELECT 1 %ofs %lmt', 10, 10),
|
||||||
|
'DibiNotSupportedException'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$conn = new DibiConnection($config);
|
||||||
|
$tests($conn);
|
Reference in New Issue
Block a user