summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2008-09-27 20:10:26 +0000
committerDries Buytaert <dries@buytaert.net>2008-09-27 20:10:26 +0000
commitb2a734fdf73fea4593819725ee02782923c3ae6d (patch)
treed9f69c65442def68397c351b2e4bb7c18dd8d254
parent42dda57f964f3e5936cfda941aecd21c51c99d7d (diff)
downloadbrdo-b2a734fdf73fea4593819725ee02782923c3ae6d.tar.gz
brdo-b2a734fdf73fea4593819725ee02782923c3ae6d.tar.bz2
- Patch #301501 by markus_petrux: optimize db_merge() in MySQL by taking advantage of ODKU syntax.
-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);