From 0a5894fcd89b77ba634db58f5ecbc5cc0c076552 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Sun, 13 Jul 2014 21:35:35 -0400 Subject: [PATCH] Fixes #4299 --- framework/db/mssql/QueryBuilder.php | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/framework/db/mssql/QueryBuilder.php b/framework/db/mssql/QueryBuilder.php index d6181bde816..efb5959af0f 100644 --- a/framework/db/mssql/QueryBuilder.php +++ b/framework/db/mssql/QueryBuilder.php @@ -135,13 +135,6 @@ public function build($query, $params = []) $params = empty($params) ? $query->params : array_merge($params, $query->params); - if (empty($query->orderBy) && ($this->hasLimit($query->limit) || $this->hasOffset($query->offset)) && $this->isOldMssql()) { - // hack so LIMIT will work because ROW_NUMBER requires an ORDER BY clause - $orderBy = 'ORDER BY (SELECT NULL)'; - } else { - $orderBy = $this->buildOrderBy($query->orderBy); - } - $clauses = [ $this->buildSelect($query->select, $params, $query->distinct, $query->selectOption), $this->buildFrom($query->from, $params), @@ -149,7 +142,7 @@ public function build($query, $params = []) $this->buildWhere($query->where, $params), $this->buildGroupBy($query->groupBy), $this->buildHaving($query->having, $params), - $orderBy, + $this->buildOrderBy($query->orderBy), $this->isOldMssql() ? '' : $this->buildLimit($query->limit, $query->offset), ]; @@ -209,6 +202,12 @@ private function rewriteLimitOffsetSql($sql, $limit, $offset, $query) } } $sql = str_replace($originalOrdering, '', $sql); + + if ($originalOrdering === '') { + // hack so LIMIT will work because ROW_NUMBER requires an ORDER BY clause + $originalOrdering = 'ORDER BY (SELECT NULL)'; + } + $sql = preg_replace('/^([\s(])*SELECT( DISTINCT)?(?!\s*TOP\s*\()/i', "\\1SELECT\\2 rowNum = ROW_NUMBER() over ({$originalOrdering}),", $sql); $sql = "SELECT TOP {$limit} {$select} FROM ($sql) sub WHERE rowNum > {$offset}"; return $sql;