mirror of
https://github.com/dg/dibi.git
synced 2025-08-04 21:28:02 +02:00
SqlsrvDriver: added support for LIMIT & OFFSET on SQL Server 2012
This commit is contained in:
@@ -40,6 +40,9 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
|||||||
/** @var int|FALSE Affected rows */
|
/** @var int|FALSE Affected rows */
|
||||||
private $affectedRows = FALSE;
|
private $affectedRows = FALSE;
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
|
private $version;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws Dibi\NotSupportedException
|
* @throws Dibi\NotSupportedException
|
||||||
@@ -80,6 +83,7 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
|||||||
$info = sqlsrv_errors();
|
$info = sqlsrv_errors();
|
||||||
throw new Dibi\DriverException($info[0]['message'], $info[0]['code']);
|
throw new Dibi\DriverException($info[0]['message'], $info[0]['code']);
|
||||||
}
|
}
|
||||||
|
$this->version = sqlsrv_server_info($this->connection)['SQLServerVersion'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -297,13 +301,18 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
|||||||
*/
|
*/
|
||||||
public function applyLimit(& $sql, $limit, $offset)
|
public function applyLimit(& $sql, $limit, $offset)
|
||||||
{
|
{
|
||||||
// offset support is missing
|
if (version_compare($this->version, 11, '<')) { // 11 == SQL Server 2012
|
||||||
if ($limit >= 0) {
|
if ($offset) {
|
||||||
$sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ') AS T ';
|
throw new Dibi\NotSupportedException('Offset is not supported by this database.');
|
||||||
}
|
|
||||||
|
|
||||||
if ($offset) {
|
} elseif ($limit !== NULL) {
|
||||||
throw new Dibi\NotImplementedException('Offset is not implemented.');
|
$sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ') t';
|
||||||
|
}
|
||||||
|
|
||||||
|
} elseif ($limit !== NULL || $offset) {
|
||||||
|
// requires ORDER BY, see https://technet.microsoft.com/en-us/library/gg699618(v=sql.110).aspx
|
||||||
|
$sql .= ' OFFSET ' . (int) $offset . ' ROWS '
|
||||||
|
. 'FETCH NEXT ' . (int) $limit . ' ROWS ONLY';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -40,28 +40,28 @@ $fluent = $conn->select('*')
|
|||||||
->orderBy('customer_id');
|
->orderBy('customer_id');
|
||||||
|
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP 1 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) AS T '),
|
reformat('SELECT TOP 1 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
||||||
(string) $fluent
|
(string) $fluent
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
$fluent->fetch();
|
$fluent->fetch();
|
||||||
Assert::same(
|
Assert::same(
|
||||||
'SELECT TOP 1 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) AS T ',
|
'SELECT TOP 1 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) t',
|
||||||
dibi::$sql
|
dibi::$sql
|
||||||
);
|
);
|
||||||
$fluent->fetchSingle();
|
$fluent->fetchSingle();
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP 1 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) AS T '),
|
reformat('SELECT TOP 1 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
||||||
dibi::$sql
|
dibi::$sql
|
||||||
);
|
);
|
||||||
$fluent->fetchAll(0, 3);
|
$fluent->fetchAll(0, 3);
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP 3 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) AS T '),
|
reformat('SELECT TOP 3 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
||||||
dibi::$sql
|
dibi::$sql
|
||||||
);
|
);
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP 1 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) AS T '),
|
reformat('SELECT TOP 1 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
||||||
(string) $fluent
|
(string) $fluent
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -69,16 +69,16 @@ Assert::same(
|
|||||||
$fluent->limit(0);
|
$fluent->limit(0);
|
||||||
$fluent->fetch();
|
$fluent->fetch();
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP 0 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) AS T '),
|
reformat('SELECT TOP 0 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
||||||
dibi::$sql
|
dibi::$sql
|
||||||
);
|
);
|
||||||
$fluent->fetchSingle();
|
$fluent->fetchSingle();
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP 0 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) AS T '),
|
reformat('SELECT TOP 0 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
||||||
dibi::$sql
|
dibi::$sql
|
||||||
);
|
);
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP 0 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) AS T '),
|
reformat('SELECT TOP 0 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
||||||
(string) $fluent
|
(string) $fluent
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -87,12 +87,12 @@ $fluent->removeClause('limit');
|
|||||||
$fluent->removeClause('offset');
|
$fluent->removeClause('offset');
|
||||||
$fluent->fetch();
|
$fluent->fetch();
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP 1 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) AS T '),
|
reformat('SELECT TOP 1 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
||||||
dibi::$sql
|
dibi::$sql
|
||||||
);
|
);
|
||||||
$fluent->fetchSingle();
|
$fluent->fetchSingle();
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP 1 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) AS T '),
|
reformat('SELECT TOP 1 * FROM ( SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
||||||
dibi::$sql
|
dibi::$sql
|
||||||
);
|
);
|
||||||
Assert::same(
|
Assert::same(
|
||||||
|
Reference in New Issue
Block a user