Skip to content

Commit

Permalink
fix query limit values "0" and "null" on SQL Anywhere
Browse files Browse the repository at this point in the history
  • Loading branch information
deeky666 committed Dec 4, 2018
1 parent 777994b commit 0f60b8f
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 15 deletions.
23 changes: 9 additions & 14 deletions lib/Doctrine/DBAL/Platforms/SQLAnywherePlatform.php
Original file line number Diff line number Diff line change
Expand Up @@ -1308,25 +1308,20 @@ protected function _getTransactionIsolationLevelSQL($level)
*/
protected function doModifyLimitQuery($query, $limit, $offset)
{
$limitOffsetClause = '';
$limitOffsetClause = $this->getTopClauseSQL($limit, $offset);

if ($limit > 0) {
$limitOffsetClause = 'TOP ' . $limit . ' ';
}
return $limitOffsetClause === ''
? $query
: preg_replace('/^\s*(SELECT\s+(DISTINCT\s+)?)/i', '\1' . $limitOffsetClause . ' ', $query);
}

private function getTopClauseSQL(?int $limit, ?int $offset) : string
{
if ($offset > 0) {
if ($limit === 0) {
$limitOffsetClause = 'TOP ALL ';
}

$limitOffsetClause .= 'START AT ' . ($offset + 1) . ' ';
}

if ($limitOffsetClause) {
return preg_replace('/^\s*(SELECT\s+(DISTINCT\s+)?)/i', '\1' . $limitOffsetClause, $query);
return sprintf('TOP %s START AT %d', $limit === null ? 'ALL' : $limit, $offset + 1);
}

return $query;
return $limit === null ? '' : 'TOP ' . $limit;
}

/**
Expand Down
10 changes: 9 additions & 1 deletion tests/Doctrine/Tests/DBAL/Platforms/SQLAnywherePlatformTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -646,7 +646,7 @@ public function testModifiesLimitQueryWithOffset()
$this->platform->modifyLimitQuery('SELECT * FROM user', 10, 5)
);
self::assertEquals(
'SELECT TOP ALL START AT 6 * FROM user',
'SELECT TOP 0 START AT 6 * FROM user',
$this->platform->modifyLimitQuery('SELECT * FROM user', 0, 5)
);
}
Expand All @@ -659,6 +659,14 @@ public function testModifiesLimitQueryWithSubSelect()
);
}

public function testModifiesLimitQueryWithoutLimit()
{
self::assertEquals(
'SELECT TOP ALL START AT 11 n FROM Foo',
$this->platform->modifyLimitQuery('SELECT n FROM Foo', null, 10)
);
}

public function testPrefersIdentityColumns()
{
self::assertTrue($this->platform->prefersIdentityColumns());
Expand Down

0 comments on commit 0f60b8f

Please sign in to comment.