From 9ba99f344ccac2082ed22872712fa750ba25da7b Mon Sep 17 00:00:00 2001 From: Ryan Boren Date: Wed, 26 Aug 2009 22:46:33 +0000 Subject: [PATCH] Make option_name the primary key for the options table. Props Denis-de-Bernardy. fixes #2699 git-svn-id: https://develop.svn.wordpress.org/trunk@11883 602fd350-edb4-49c9-b593-d223f7449a82 --- wp-admin/includes/schema.php | 4 ++-- wp-admin/includes/upgrade.php | 36 ++++++++++++++++++++++++++++++++--- wp-includes/functions.php | 4 ++-- wp-includes/version.php | 2 +- 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/wp-admin/includes/schema.php b/wp-admin/includes/schema.php index 53ec246d72..f735c9e4b1 100644 --- a/wp-admin/includes/schema.php +++ b/wp-admin/includes/schema.php @@ -99,8 +99,8 @@ CREATE TABLE $wpdb->options ( option_name varchar(64) NOT NULL default '', option_value longtext NOT NULL, autoload varchar(20) NOT NULL default 'yes', - PRIMARY KEY (option_id,blog_id,option_name), - KEY option_name (option_name) + PRIMARY KEY (option_name), + KEY option_id (option_id) ) $charset_collate; CREATE TABLE $wpdb->postmeta ( meta_id bigint(20) unsigned NOT NULL auto_increment, diff --git a/wp-admin/includes/upgrade.php b/wp-admin/includes/upgrade.php index a4d5abaece..d6062cd717 100644 --- a/wp-admin/includes/upgrade.php +++ b/wp-admin/includes/upgrade.php @@ -269,6 +269,7 @@ function wp_upgrade() { wp_check_mysql_version(); wp_cache_flush(); + pre_schema_upgrade(); make_db_current_silent(); upgrade_all(); wp_cache_flush(); @@ -554,8 +555,10 @@ function upgrade_130() { if ( 1 != $option->dupes ) { // Could this be done in the query? $limit = $option->dupes - 1; $dupe_ids = $wpdb->get_col( $wpdb->prepare("SELECT option_id FROM $wpdb->options WHERE option_name = %s LIMIT %d", $option->option_name, $limit) ); - $dupe_ids = join($dupe_ids, ','); - $wpdb->query("DELETE FROM $wpdb->options WHERE option_id IN ($dupe_ids)"); + if ( $dupe_ids ) { + $dupe_ids = join($dupe_ids, ','); + $wpdb->query("DELETE FROM $wpdb->options WHERE option_id IN ($dupe_ids)"); + } } } @@ -1656,4 +1659,31 @@ function maybe_disable_automattic_widgets() { } } -?> +/** + * Runs before the schema is upgraded. + */ +function pre_schema_upgrade() { + global $wp_current_db_version, $wp_db_version, $wpdb; + + // Only run if less than 2.9 + if ( $wp_current_db_version >= 11557 ) + return; + + // Delete duplicate options. Keep the option with the highest option_id. + $delete_options = $wpdb->get_col("SELECT o1.option_id FROM $wpdb->options AS o1 JOIN $wpdb->options AS o2 ON o2.option_name = o1.option_name AND o2.option_id > o1.option_id"); + if ( !empty($delete_options) ) { + $delete_options = implode("', '", $delete_options); + $wpdb->query("DELETE FROM $wpdb->options WHERE option_id IN ($delete_options)"); + } + + // Add an index on option_id to satisfy the auto_increment requirement + $wpdb->query("ALTER TABLE $wpdb->options ADD INDEX option_id (option_id)"); + + // Drop the old primary key. The new primary will be created by dbDelta() + $wpdb->query("ALTER TABLE $wpdb->options DROP PRIMARY KEY"); + + // Drop the old option_name index. dbDelta() doesn't do the drop. + $wpdb->query("ALTER TABLE $wpdb->options DROP INDEX option_name"); +} + +?> \ No newline at end of file diff --git a/wp-includes/functions.php b/wp-includes/functions.php index b04e1edcbc..9bf745248b 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -621,8 +621,8 @@ function delete_option( $name ) { // Get the ID, if no ID then return // expected_slashed ($name) - $option = $wpdb->get_row( "SELECT option_id, autoload FROM $wpdb->options WHERE option_name = '$name'" ); - if ( is_null($option) || !$option->option_id ) + $option = $wpdb->get_row( "SELECT autoload FROM $wpdb->options WHERE option_name = '$name'" ); + if ( is_null($option) ) return false; // expected_slashed ($name) $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name = '$name'" ); diff --git a/wp-includes/version.php b/wp-includes/version.php index 76e92e6cdc..5bc2b2c648 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -15,7 +15,7 @@ $wp_version = '2.9-rare'; * * @global int $wp_db_version */ -$wp_db_version = 11548; +$wp_db_version = 11557; /** * Holds the TinyMCE version