diff --git a/includes/database/query.inc b/includes/database/query.inc index 993275749bc74437a35a6667ad96ce4895aff49b..9205fe4a2f6eecef36ef8fdd16f65effbc28352a 100644 --- a/includes/database/query.inc +++ b/includes/database/query.inc @@ -925,6 +925,7 @@ public function __toString() { $query = 'DELETE FROM {' . $this->connection->escapeTable($this->table) . '} '; if (count($this->condition)) { + $this->condition->compile($this->connection, $this); $query .= "\nWHERE " . $this->condition; } @@ -1234,6 +1235,8 @@ public function compile(DatabaseConnection $connection, QueryPlaceholderInterfac } else { // It's a structured condition, so parse it out accordingly. + // Note that $condition['field'] will only be an object for a dependent + // DatabaseCondition object, not for a dependent subquery. if ($condition['field'] instanceof QueryConditionInterface) { // Compile the sub-condition recursively and add it to the list. $condition['field']->compile($connection, $queryPlaceholder); @@ -1257,7 +1260,8 @@ public function compile(DatabaseConnection $connection, QueryPlaceholderInterfac $operator += $operator_defaults; $placeholders = array(); - if ($condition['value'] instanceof SelectQuery) { + if ($condition['value'] instanceof SelectQueryInterface) { + $condition['value']->compile($connection, $queryPlaceholder); $placeholders[] = (string)$condition['value']; $arguments += $condition['value']->arguments(); } @@ -1275,7 +1279,6 @@ public function compile(DatabaseConnection $connection, QueryPlaceholderInterfac } } $condition_fragments[] = ' (' . $condition['field'] . ' ' . $operator['operator'] . ' ' . $operator['prefix'] . implode($operator['delimiter'], $placeholders) . $operator['postfix'] . ') '; - } } } diff --git a/modules/simpletest/tests/database_test.test b/modules/simpletest/tests/database_test.test index 8970224c420e6dd24eee176bad7f50e65ce94fc3..43f97d2919a706294eec798a39f933d19824fcc4 100644 --- a/modules/simpletest/tests/database_test.test +++ b/modules/simpletest/tests/database_test.test @@ -944,6 +944,27 @@ class DatabaseDeleteTruncateTestCase extends DatabaseTestCase { ); } + /** + * Confirm that we can use a subselect in a delete successfully. + */ + function testSubselectDelete() { + $num_records_before = db_query('SELECT COUNT(*) FROM {test_task}')->fetchField(); + $pid_to_delete = db_query("SELECT * FROM {test_task} WHERE task = 'sleep'")->fetchField(); + + $subquery = db_select('test', 't') + ->fields('t', array('id')) + ->condition('t.id', array($pid_to_delete), 'IN'); + $delete = db_delete('test_task') + ->condition('task', 'sleep') + ->condition('pid', $subquery, 'IN'); + + $num_deleted = $delete->execute(); + $this->assertEqual($num_deleted, 1, t("Deleted 1 record.")); + + $num_records_after = db_query('SELECT COUNT(*) FROM {test_task}')->fetchField(); + $this->assertEqual($num_records_before, $num_records_after + $num_deleted, t('Deletion adds up.')); + } + /** * Confirm that we can delete a single record successfully. */