diff --git a/includes/database/sqlite/query.inc b/includes/database/sqlite/query.inc index 158da3d0a6495d138487ce118a2f8acd494e0066..7b1af8114fa19af8fb6b2857f0e65cef541897a4 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 b80f55231e9069c799d2e92eb201df02d73e669f..65d84c18075f638d218696bc21d96851155247a2 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.')); + } } /**