#653926: Range directives of sub-queries are not honored. From: Damien Tournoud --- database/select.inc | 9 ++++----- simpletest/tests/database_test.test | 28 +++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git includes/database/select.inc includes/database/select.inc index dbc0e13..f8aa1e9 100644 --- includes/database/select.inc +++ includes/database/select.inc @@ -1085,10 +1085,6 @@ class SelectQuery extends Query implements SelectQueryInterface { } $args = $this->getArguments(); - - if (!empty($this->range)) { - return $this->connection->queryRange((string)$this, $this->range['start'], $this->range['length'], $args, $this->queryOptions); - } return $this->connection->query((string)$this, $args, $this->queryOptions); } @@ -1358,7 +1354,10 @@ class SelectQuery extends Query implements SelectQueryInterface { $query .= implode(', ', $fields); } - // RANGE is database specific, so we can't do it here. + // RANGE + if (!empty($this->range)) { + $query .= "\nLIMIT " . $this->range['length'] . " OFFSET " . $this->range['start']; + } // UNION is a little odd, as the select queries to combine are passed into // this query, but syntactically they all end up on the same level. diff --git modules/simpletest/tests/database_test.test modules/simpletest/tests/database_test.test index 0f4cc71..033bb5c 100644 --- modules/simpletest/tests/database_test.test +++ modules/simpletest/tests/database_test.test @@ -1532,7 +1532,33 @@ class DatabaseSelectSubqueryTestCase extends DatabaseTestCase { } /** - * Test that we can use a subquery in a FROM clause. + * Test that we can use a subquery in a FROM clause with a limit. + */ + function testFromSubquerySelectWithLimit() { + // Create a subquery, which is just a normal query object. + $subquery = db_select('test_task', 'tt'); + $subquery->addField('tt', 'pid', 'pid'); + $subquery->addField('tt', 'task', 'task'); + $subquery->orderBy('priority', 'DESC'); + $subquery->range(0, 1); + + // Create another query that joins against the virtual table resulting + // from the subquery. + $select = db_select($subquery, 'tt2'); + $select->join('test', 't', 't.id=tt2.pid'); + $select->addField('t', 'name'); + + // The resulting query should be equivalent to: + // SELECT t.name + // FROM (SELECT tt.pid AS pid, tt.task AS task FROM test_task tt ORDER BY priority DESC LIMIT 1 OFFSET 0) tt + // INNER JOIN test t ON t.id=tt.pid + $people = $select->execute()->fetchCol(); + + $this->assertEqual(count($people), 1, t('Returned the correct number of rows.')); + } + + /** + * Test that we can use a subquery in a WHERE clause. */ function testConditionSubquerySelect() { // Create a subquery, which is just a normal query object.