From ad244e2cb8a23b767907a5e33a2d675d251b248a Mon Sep 17 00:00:00 2001 From: David Rothstein <drothstein@gmail.com> Date: Wed, 27 Feb 2013 16:55:30 -0500 Subject: [PATCH] Issue #1792380 by theo_: Fixed DatabaseCondition not cloning SelectQuery value object. --- includes/database/query.inc | 9 +++-- modules/simpletest/tests/database_test.test | 39 +++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/includes/database/query.inc b/includes/database/query.inc index 612985e025e7..8beeef1e8602 100644 --- a/includes/database/query.inc +++ b/includes/database/query.inc @@ -1898,8 +1898,13 @@ public function __toString() { function __clone() { $this->changed = TRUE; foreach ($this->conditions as $key => $condition) { - if ($key !== '#conjunction' && $condition['field'] instanceOf QueryConditionInterface) { - $this->conditions[$key]['field'] = clone($condition['field']); + if ($key !== '#conjunction') { + if ($condition['field'] instanceOf QueryConditionInterface) { + $this->conditions[$key]['field'] = clone($condition['field']); + } + if ($condition['value'] instanceOf SelectQueryInterface) { + $this->conditions[$key]['value'] = clone($condition['value']); + } } } } diff --git a/modules/simpletest/tests/database_test.test b/modules/simpletest/tests/database_test.test index 0b2b1c699406..e7ce14f7acbe 100644 --- a/modules/simpletest/tests/database_test.test +++ b/modules/simpletest/tests/database_test.test @@ -281,6 +281,45 @@ class DatabaseConnectionTestCase extends DatabaseTestCase { } } +/** + * Test cloning Select queries. + */ +class DatabaseSelectCloneTest extends DatabaseTestCase { + + public static function getInfo() { + return array( + 'name' => 'Select tests, cloning', + 'description' => 'Test cloning Select queries.', + 'group' => 'Database', + ); + } + + /** + * Test that subqueries as value within conditions are cloned properly. + */ + function testSelectConditionSubQueryCloning() { + $subquery = db_select('test', 't'); + $subquery->addField('t', 'id', 'id'); + $subquery->condition('age', 28, '<'); + + $query = db_select('test', 't'); + $query->addField('t', 'name', 'name'); + $query->condition('id', $subquery, 'IN'); + + $clone = clone $query; + // Cloned query should not be altered by the following modification + // happening on original query. + $subquery->condition('age', 25, '>'); + + $clone_result = $clone->countQuery()->execute()->fetchField(); + $query_result = $query->countQuery()->execute()->fetchField(); + + // Make sure the cloned query has not been modified + $this->assertEqual(3, $clone_result, 'The cloned query returns the expected number of rows'); + $this->assertEqual(2, $query_result, 'The query returns the expected number of rows'); + } +} + /** * Test fetch actions, part 1. * -- GitLab