From b2a734fdf73fea4593819725ee02782923c3ae6d Mon Sep 17 00:00:00 2001 From: Dries Buytaert Date: Sat, 27 Sep 2008 20:10:26 +0000 Subject: - Patch #301501 by markus_petrux: optimize db_merge() in MySQL by taking advantage of ODKU syntax. --- includes/database/mysql/query.inc | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'includes/database') 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); -- cgit v1.2.3