Browse Source

Fix additional failing tests under old SQLServer

The query transformation process requires decorators to be applied to
the original results when replacing the query with a copy as the
original query is what the end developer has access to.
mark_story 12 years ago
parent
commit
db1663034f

+ 10 - 3
src/Database/Dialect/SqlserverDialectTrait.php

@@ -64,7 +64,7 @@ trait SqlserverDialectTrait {
 			$query->order($query->newExpr()->add('SELECT NULL'));
 		}
 
-		if ($this->_version() < 11 && $offset) {
+		if ($this->_version() < 11 && $offset !== null) {
 			return $this->_pagingSubquery($query, $limit, $offset);
 		}
 
@@ -91,9 +91,10 @@ trait SqlserverDialectTrait {
  * @param int $offset The number of rows to offset.
  * @return \Cake\Database\Query Modified query object.
  */
-	protected function _pagingSubquery($query, $limit, $offset) {
+	protected function _pagingSubquery($original, $limit, $offset) {
 		$field = '_cake_paging_._cake_page_rownum_';
 
+		$query = clone $original;
 		$order = $query->clause('order') ?: new OrderByExpression('NULL');
 		$query->select([
 				'_cake_page_rownum_' => new UnaryExpression($order, [], 'ROW_NUMBER() OVER')
@@ -104,18 +105,24 @@ trait SqlserverDialectTrait {
 		$outer = new Query($query->connection());
 		$outer->select('*')
 			->from(['_cake_paging_' => $query]);
+
 		if ($offset) {
 			$outer->where(["$field >" => $offset]);
 		}
 		if ($limit) {
 			$outer->where(["$field <=" => (int)$offset + (int)$limit]);
 		}
-		return $outer->decorateResults(function ($row) {
+
+		// Decorate the original query as that is what the
+		// end developer will be calling execute() on originally.
+		$original->decorateResults(function ($row) {
 			if (isset($row['_cake_page_rownum_'])) {
 				unset($row['_cake_page_rownum_']);
 			}
 			return $row;
 		});
+
+		return $outer;
 	}
 
 /**

+ 6 - 3
tests/TestCase/Database/QueryTest.php

@@ -1374,7 +1374,9 @@ class QueryTest extends TestCase {
 		$query = new Query($this->connection);
 		$result = $query->select('id')->from('comments')
 			->limit(1)
-			->offset(0)->execute();
+			->offset(0)
+			->order(['id' => 'ASC'])
+			->execute();
 		$this->assertCount(1, $result);
 		$this->assertEquals(['id' => 1], $result->fetch('assoc'));
 
@@ -1396,9 +1398,10 @@ class QueryTest extends TestCase {
 
 		$query = new Query($this->connection);
 		$result = $query->select('id')->from('articles')
-			->order(['id' => 'desc'])
+			->order(['id' => 'DESC'])
 			->limit(1)
-			->offset(0)->execute();
+			->offset(0)
+			->execute();
 		$this->assertCount(1, $result);
 		$this->assertEquals(['id' => 3], $result->fetch('assoc'));