diff --git a/src/Database/Drivers/OciDriver.php b/src/Database/Drivers/OciDriver.php index 5bec181a0..5c0351372 100644 --- a/src/Database/Drivers/OciDriver.php +++ b/src/Database/Drivers/OciDriver.php @@ -89,8 +89,8 @@ public function applyLimit(string &$sql, ?int $limit, ?int $offset): void } elseif ($offset) { // see http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html $sql = 'SELECT * FROM (SELECT t.*, ROWNUM AS "__rnum" FROM (' . $sql . ') t ' - . ($limit !== null ? 'WHERE ROWNUM <= ' . ($offset + $limit) : '') - . ') WHERE "__rnum" > ' . $offset; + . ') WHERE "__rnum" > ' . $offset + . ($limit !== null ? ' AND "__rnum" <= ' . ($offset + $limit) : ''); } elseif ($limit !== null) { $sql = 'SELECT * FROM (' . $sql . ') WHERE ROWNUM <= ' . $limit; diff --git a/tests/Database/Drivers/OciDriver.applyLimit.phpt b/tests/Database/Drivers/OciDriver.applyLimit.phpt index c446108f5..040303267 100644 --- a/tests/Database/Drivers/OciDriver.applyLimit.phpt +++ b/tests/Database/Drivers/OciDriver.applyLimit.phpt @@ -11,11 +11,11 @@ $driver = new Nette\Database\Drivers\OciDriver; $query = 'SELECT 1 FROM t'; $driver->applyLimit($query, 10, 20); -Assert::same('SELECT * FROM (SELECT t.*, ROWNUM AS "__rnum" FROM (SELECT 1 FROM t) t WHERE ROWNUM <= 30) WHERE "__rnum" > 20', $query); +Assert::same('SELECT * FROM (SELECT t.*, ROWNUM AS "__rnum" FROM (SELECT 1 FROM t) t ) WHERE "__rnum" > 20 AND "__rnum" <= 30', $query); $query = 'SELECT 1 FROM t'; $driver->applyLimit($query, 0, 20); -Assert::same('SELECT * FROM (SELECT t.*, ROWNUM AS "__rnum" FROM (SELECT 1 FROM t) t WHERE ROWNUM <= 20) WHERE "__rnum" > 20', $query); +Assert::same('SELECT * FROM (SELECT t.*, ROWNUM AS "__rnum" FROM (SELECT 1 FROM t) t ) WHERE "__rnum" > 20 AND "__rnum" <= 20', $query); $query = 'SELECT 1 FROM t'; $driver->applyLimit($query, 10, 0);