summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/database/mysql/query.inc19
1 files changed, 12 insertions, 7 deletions
diff --git a/includes/database/mysql/query.inc b/includes/database/mysql/query.inc
index ed32411a4..58fc8eb22 100644
--- a/includes/database/mysql/query.inc
+++ b/includes/database/mysql/query.inc
@@ -81,11 +81,10 @@ class MergeQuery_mysql extends MergeQuery {
$update_fields = $this->updateFields;
}
else {
- $update_fields = $this->insertFields;
- // If there are no exclude fields, this is a no-op.
- foreach ($this->excludeFields as $exclude_field) {
- unset($update_fields[$exclude_field]);
- }
+ // When update fields are derived from insert fields, we don't need
+ // placeholders since we can tell MySQL to reuse insert supplied
+ // values using the VALUES(col_name) function.
+ $update_fields = array();
}
$insert_fields = $this->insertFields + $this->keyFields;
@@ -123,7 +122,6 @@ class MergeQuery_mysql extends MergeQuery {
public function __toString() {
// Set defaults.
- $update_fields = array();
if ($this->updateFields) {
$update_fields = $this->updateFields;
}
@@ -157,8 +155,15 @@ class MergeQuery_mysql extends MergeQuery {
unset($update_fields[$field]);
}
+ // Build update fields clauses based on caller supplied list, or derived
+ // from insert supplied values using the VALUES(col_name) function.
foreach ($update_fields as $field => $value) {
- $update[] = ($field . '=:db_update_placeholder_' . $max_placeholder++);
+ if ($this->updateFields) {
+ $update[] = ($field . '=:db_update_placeholder_' . $max_placeholder++);
+ }
+ else {
+ $update[] = ($field . '=VALUES(' . $field . ')');
+ }
}
$query .= implode(', ', $update);