? .DS_Store
? asdf.patch
? databasecondition_multiple_queries.patch
? databasecondition_multiple_queries.patch.1
? foo.patch
? head.db
? sqlite_more_broken.patch
? sqlite_update_query_expression.patch
? test_only.patch
? includes/database/.DS_Store
? includes/database/mysqlbigint
? includes/database/sqlite/.DS_Store
? modules/.DS_Store
? modules/field/modules/.DS_Store
? modules/simpletest/.DS_Store
? modules/simpletest/tests/.DS_Store
? sites/all/.DS_Store
? sites/all/contributions
? sites/all/modules/.DS_Store
? sites/all/modules/devel
? sites/all/modules/multiple_email
? sites/all/modules/multiple_email.tgz
? sites/default/files
? sites/default/settings.php
Index: includes/database/query.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database/query.inc,v
retrieving revision 1.59
diff -u -p -r1.59 query.inc
--- includes/database/query.inc	15 Dec 2010 06:52:54 -0000	1.59
+++ includes/database/query.inc	22 Dec 2010 01:16:44 -0000
@@ -1540,6 +1540,12 @@ class DatabaseCondition implements Query
   protected $changed = TRUE;
 
   /**
+   * The query to which this object was compiled. This ensures that a condition
+   * compiled for a certain query will be recompiled for a different query.
+   */
+ protected $queryPlaceholder = NULL;
+
+  /**
    * Constructs a DataBaseCondition object.
    *
    * @param string $conjunction
@@ -1636,7 +1642,7 @@ class DatabaseCondition implements Query
    * Implements QueryConditionInterface::compile().
    */
   public function compile(DatabaseConnection $connection, QueryPlaceholderInterface $queryPlaceholder = NULL) {
-    if ($this->changed) {
+    if ($this->changed || $this->queryPlaceholder != spl_object_hash($queryPlaceholder)) {
       $condition_fragments = array();
       $arguments = array();
 
@@ -1703,6 +1709,7 @@ class DatabaseCondition implements Query
       }
 
       $this->changed = FALSE;
+      $this->queryPlaceholder = spl_object_hash($queryPlaceholder);
       $this->stringVersion = implode($conjunction, $condition_fragments);
       $this->arguments = $arguments;
     }
Index: includes/database/sqlite/query.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database/sqlite/query.inc,v
retrieving revision 1.14
diff -u -p -r1.14 query.inc
--- includes/database/sqlite/query.inc	29 Nov 2010 04:45:11 -0000	1.14
+++ includes/database/sqlite/query.inc	22 Dec 2010 01:16:44 -0000
@@ -97,7 +97,7 @@ class UpdateQuery_sqlite extends UpdateQ
     foreach ($fields as $field => $data) {
       if (is_array($data)) {
         // The field is an expression.
-        $condition->condition($field, $data['expression'], '<>');
+        $condition->where($field . ' <> ' . $data['expression']);
         $condition->isNull($field);
       }
       elseif (!isset($data)) {
Index: modules/simpletest/tests/database_test.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/database_test.test,v
retrieving revision 1.105
diff -u -p -r1.105 database_test.test
--- modules/simpletest/tests/database_test.test	15 Dec 2010 06:52:54 -0000	1.105
+++ modules/simpletest/tests/database_test.test	22 Dec 2010 01:16:44 -0000
@@ -776,6 +776,25 @@ class DatabaseUpdateTestCase extends Dat
     $this->assertIdentical($num_matches, '1', t('Updated fields successfully.'));
   }
 
+  /**
+   * Test updating with expressions.
+   */
+  function testExpressionUpdate() {
+    // Set age = 1 for a single row for this test to work.
+    db_update('test')
+      ->condition('id', 1)
+      ->fields(array('age' => 1))
+      ->execute();
+
+    // Ensure that expressions are handled properly.  This should set every
+    // record's age to a square of itself, which will change only three of the
+    // four records in the table since 1*1 = 1. That means only three records
+    // are modified, so we should get back 3, not 4, from execute().
+    $num_rows = db_update('test')
+      ->expression('age', 'age * age')
+      ->execute();
+    $this->assertIdentical($num_rows, 3, t('Expression entered as straight SQL.'));
+  }
 }
 
 /**
