From 8eb5874e645941473e31525e76d8ce55b39f0135 Mon Sep 17 00:00:00 2001
From: Angie Byron <webchick@24967.no-reply.drupal.org>
Date: Wed, 22 Dec 2010 01:16:43 +0000
Subject: [PATCH] #1004060 by dmitrig01, chx: Fixed SQLite update queries with
 expression failing

---
 includes/database/sqlite/query.inc          |  2 +-
 modules/simpletest/tests/database_test.test | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/includes/database/sqlite/query.inc b/includes/database/sqlite/query.inc
index 158da3d0a649..7b1af8114fa1 100644
--- a/includes/database/sqlite/query.inc
+++ b/includes/database/sqlite/query.inc
@@ -97,7 +97,7 @@ public function execute() {
     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)) {
diff --git a/modules/simpletest/tests/database_test.test b/modules/simpletest/tests/database_test.test
index b80f55231e90..65d84c18075f 100644
--- a/modules/simpletest/tests/database_test.test
+++ b/modules/simpletest/tests/database_test.test
@@ -776,6 +776,25 @@ class DatabaseUpdateTestCase extends DatabaseTestCase {
     $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('Number of affected rows are returned.'));
+  }
 }
 
 /**
-- 
GitLab