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 ec7b600
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 15 deletions.
27 changes: 13 additions & 14 deletions lib/Doctrine/DBAL/Platforms/SQLAnywherePlatform.php
Original file line number Diff line number Diff line change
Expand Up @@ -1308,25 +1308,24 @@ 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);
}

/**
* @param int|null $limit
* @param int|null $offset
*/
private function getTopClauseSQL($limit, $offset) : string
{
if ($offset > 0) {
if ($limit === 0) {
$limitOffsetClause = 'TOP ALL ';
}

$limitOffsetClause .= 'START AT ' . ($offset + 1) . ' ';
return sprintf('TOP %s START AT %d', $limit === null ? 'ALL' : $limit, $offset + 1);
}

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

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 ec7b600

Please sign in to comment.