diff options
-rw-r--r-- | includes/database/query.inc | 2 | ||||
-rw-r--r-- | modules/simpletest/tests/database_test.test | 17 |
2 files changed, 18 insertions, 1 deletions
diff --git a/includes/database/query.inc b/includes/database/query.inc index f3270a041..5ecc8ce6e 100644 --- a/includes/database/query.inc +++ b/includes/database/query.inc @@ -1032,7 +1032,7 @@ class DatabaseCondition implements QueryConditionInterface, Countable { if ($condition['field'] instanceof QueryConditionInterface) { // Compile the sub-condition recursively and add it to the list. $condition['field']->compile($connection); - $condition_fragments[] = (string)$condition['field']; + $condition_fragments[] = '(' . (string)$condition['field'] . ')'; $arguments += $condition['field']->arguments(); } else { diff --git a/modules/simpletest/tests/database_test.test b/modules/simpletest/tests/database_test.test index 752b772f8..5656dc740 100644 --- a/modules/simpletest/tests/database_test.test +++ b/modules/simpletest/tests/database_test.test @@ -1416,6 +1416,23 @@ class DatabaseSelectComplexTestCase extends DatabaseTestCase { $this->assertTrue(FALSE, $e->getMessage()); } } + + /** + * Confirm that we can properly nest conditional clauses. + */ + function testNestedConditions() { + // This query should translate to: + // "SELECT job FROM {test} WHERE name = 'Paul' AND (age = 26 OR age = 27)" + // That should find only one record. Yes it's a non-optimal way of writing + // that query but that's not the point! + $query = db_select('test'); + $query->addField('test', 'job'); + $query->condition('name', 'Paul'); + $query->condition(db_or()->condition('age', 26)->condition('age', 27)); + + $job = $query->execute()->fetchField(); + $this->assertEqual($job, 'Songwriter', t('Correct data retrieved.')); + } } /** |