Skip to content
Snippets Groups Projects
Commit de7f4bae authored by Angie Byron's avatar Angie Byron
Browse files

Issue #1266572 by znerol: Fixed Workaround in UpdateQuery_sqlite() for...

Issue #1266572 by znerol: Fixed Workaround in UpdateQuery_sqlite() for affected rows count causes certain updates to be suppressed.
parent d89a17dc
No related branches found
No related tags found
No related merge requests found
......@@ -19,41 +19,18 @@
* we don't select those rows.
*
* A query like this one:
* UPDATE test SET name = 'newname' WHERE tid = 1
* UPDATE test SET col1 = 'newcol1', col2 = 'newcol2' WHERE tid = 1
* will become:
* UPDATE test SET name = 'newname' WHERE tid = 1 AND name <> 'newname'
* UPDATE test SET col1 = 'newcol1', col2 = 'newcol2' WHERE tid = 1 AND (col1 <> 'newcol1' OR col2 <> 'newcol2')
*/
class Update extends QueryUpdate {
/**
* Helper function that removes the fields that are already in a condition.
*
* @param $fields
* The fields.
* @param QueryConditionInterface $condition
* A database condition.
*/
protected function removeFieldsInCondition(&$fields, ConditionInterface $condition) {
foreach ($condition->conditions() as $child_condition) {
if (isset($child_condition['field'])) {
if ($child_condition['field'] instanceof ConditionInterface) {
$this->removeFieldsInCondition($fields, $child_condition['field']);
}
else {
unset($fields[$child_condition['field']]);
}
}
}
}
public function execute() {
if (!empty($this->queryOptions['sqlite_return_matched_rows'])) {
return parent::execute();
}
// Get the fields used in the update query, and remove those that are already
// in the condition.
// Get the fields used in the update query.
$fields = $this->expressionFields + $this->fields;
$this->removeFieldsInCondition($fields, $this->condition);
// Add the inverse of the fields to the condition.
$condition = new Condition('OR');
......
......@@ -125,4 +125,18 @@ function testExpressionUpdate() {
->execute();
$this->assertIdentical($num_rows, 3, 'Number of affected rows are returned.');
}
/**
* Confirm that we can update the primary key of a record successfully.
*/
function testPrimaryKeyUpdate() {
$num_updated = db_update('test')
->fields(array('id' => 42, 'name' => 'John'))
->condition('id', 1)
->execute();
$this->assertIdentical($num_updated, 1, t('Updated 1 record.'));
$saved_name= db_query('SELECT name FROM {test} WHERE id = :id', array(':id' => 42))->fetchField();
$this->assertIdentical($saved_name, 'John', t('Updated primary key successfully.'));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment