Browse Source

Remove offset from cloned queries used in subquery loads.

Having an offset in a subquery causes SQL errors in MySQL. Also
include a test to ensure HAVING is not an issue.

Fixes #4465
mark_story 11 years ago
parent
commit
89a56a4db3

+ 1 - 0
src/ORM/Association/SelectableAssociationTrait.php

@@ -161,6 +161,7 @@ trait SelectableAssociationTrait {
 	protected function _buildSubquery($query) {
 	protected function _buildSubquery($query) {
 		$filterQuery = clone $query;
 		$filterQuery = clone $query;
 		$filterQuery->limit(null);
 		$filterQuery->limit(null);
+		$filterQuery->offset(null);
 		$filterQuery->order([], true);
 		$filterQuery->order([], true);
 		$filterQuery->contain([], true);
 		$filterQuery->contain([], true);
 		$joins = $filterQuery->join();
 		$joins = $filterQuery->join();

+ 20 - 1
tests/TestCase/ORM/QueryRegressionTest.php

@@ -39,7 +39,8 @@ class QueryRegressionTest extends TestCase {
 		'core.tag',
 		'core.tag',
 		'core.articles_tag',
 		'core.articles_tag',
 		'core.author',
 		'core.author',
-		'core.special_tag'
+		'core.special_tag',
+		'core.translate',
 	];
 	];
 
 
 /**
 /**
@@ -405,4 +406,22 @@ class QueryRegressionTest extends TestCase {
 		$this->assertNotEmpty($resultA->articles_tag->author);
 		$this->assertNotEmpty($resultA->articles_tag->author);
 	}
 	}
 
 
+/**
+ * Test that offset/limit are elided from subquery loads.
+ *
+ * @return void
+ */
+	public function testAssociationSubQueryNoOffset() {
+		$table = TableRegistry::get('Articles');
+		$table->addBehavior('Translate', ['fields' => ['title', 'body']]);
+		$table->locale('eng');
+		$query = $table->find('translations')->limit(10)->offset(1);
+		$result = $query->toArray();
+		$this->assertCount(2, $result);
+
+		$query = $table->find('translations')->having(['Articles.id >' => 1]);
+		$result = $query->toArray();
+		$this->assertCount(2, $result);
+	}
+
 }
 }