Index: includes/database/query.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database/query.inc,v
retrieving revision 1.33
diff -u -p -r1.33 query.inc
--- includes/database/query.inc	26 Oct 2009 04:46:37 -0000	1.33
+++ includes/database/query.inc	19 Nov 2009 01:49:23 -0000
@@ -204,6 +204,16 @@ interface QueryAlterableInterface {
  */
 interface QueryPlaceholderInterface {
   /**
+   * Returns the current placeholder value.
+   */
+  function getNextPlaceholder();
+
+  /**
+   * Sets the placeholder value.
+   */
+  function setNextPlaceholder($nextPlaceholder);
+
+  /**
    * Returns the next placeholder for the query.
    */
   function nextPlaceholder();
@@ -255,6 +265,15 @@ abstract class Query implements QueryPla
    */
   abstract public function __toString();
 
+  public function getNextPlaceholder() {
+    return $this->nextPlaceholder;
+  }
+
+  public function setNextPlaceholder($nextPlaceholder) {
+    $this->nextPlaceholder = $nextPlaceholder;
+    return $this;
+  }
+
   public function nextPlaceholder() {
     return $this->nextPlaceholder++;
   }
@@ -1258,8 +1277,10 @@ class DatabaseCondition implements Query
 
             $placeholders = array();
             if ($condition['value'] instanceof SelectQuery) {
+              $condition['value']->setNextPlaceholder($queryPlaceholder->getNextPlaceholder());
               $placeholders[] = (string)$condition['value'];
               $arguments += $condition['value']->arguments();
+              $queryPlaceholder->setNextPlaceholder($condition['value']->getNextPlaceholder());
             }
             // We assume that if there is a delimiter, then the value is an
             // array. If not, it is a scalar. For simplicity, we first convert
Index: includes/database/schema.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database/schema.inc,v
retrieving revision 1.22
diff -u -p -r1.22 schema.inc
--- includes/database/schema.inc	8 Oct 2009 02:44:54 -0000	1.22
+++ includes/database/schema.inc	19 Nov 2009 01:49:24 -0000
@@ -160,6 +160,15 @@ abstract class DatabaseSchema implements
     $this->connection = $connection;
   }
 
+  public function getNextPlaceholder() {
+    return $this->nextPlaceholder;
+  }
+
+  public function setNextPlaceholder($nextPlaceholder) {
+    $this->nextPlaceholder = $nextPlaceholder;
+    return $this;
+  }
+  
   public function nextPlaceholder() {
     return $this->placeholder++;
   }
Index: includes/database/select.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database/select.inc,v
retrieving revision 1.28
diff -u -p -r1.28 select.inc
--- includes/database/select.inc	10 Nov 2009 22:15:24 -0000	1.28
+++ includes/database/select.inc	19 Nov 2009 01:49:24 -0000
@@ -482,6 +482,15 @@ class SelectQueryExtender implements Sel
 
   /* Implementations of QueryPlaceholderInterface. */
 
+  public function getNextPlaceholder() {
+    return $this->nextPlaceholder;
+  }
+
+  public function setNextPlaceholder($nextPlaceholder) {
+    $this->nextPlaceholder = $nextPlaceholder;
+    return $this;
+  }
+
   public function nextPlaceholder() {
     return $this->placeholder++;
   }
Index: modules/simpletest/tests/database_test.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/database_test.test,v
retrieving revision 1.72
diff -u -p -r1.72 database_test.test
--- modules/simpletest/tests/database_test.test	26 Oct 2009 04:46:38 -0000	1.72
+++ modules/simpletest/tests/database_test.test	19 Nov 2009 01:49:24 -0000
@@ -945,6 +945,26 @@ class DatabaseDeleteTruncateTestCase ext
   }
 
   /**
+   * Confirm that we can use a subselect in a delete successfully.
+   */
+  function testSubselectDelete() {
+    $num_records_before = db_query('SELECT COUNT(*) FROM {test_task}')->fetchField();
+    $test_task_to_delete = db_query("SELECT * FROM {test_task} WHERE task = 'sleep'")->fetchObject();
+
+    $subquery = db_select('test', 't')
+      ->fields('t', array('id'))
+      ->condition('t.id', array($test_task_to_delete->pid), 'IN');
+    $num_deleted = db_delete('test_task')
+      ->condition('task', 'sleep')
+      ->condition('pid', $subquery, 'IN')
+      ->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.
    */
   function testSimpleDelete() {
