From da9d5c218855e0b2b60eafc384898a009c51ebbe Mon Sep 17 00:00:00 2001 From: Amir Sarabadani Date: Tue, 28 Aug 2018 23:32:55 +0200 Subject: [PATCH] Schema change for reading ct_tag_id instead of ct_tag Adding unique index on ct_tag_id and making indexes on ct_tag non unique Bug: T193874 Change-Id: I24609c57e47308d1330a97527f4ea374d0d307ba --- includes/DefaultSettings.php | 2 +- includes/installer/MssqlUpdater.php | 3 ++ includes/installer/MysqlUpdater.php | 5 ++- includes/installer/OracleUpdater.php | 3 ++ includes/installer/PostgresUpdater.php | 3 ++ includes/installer/SqliteUpdater.php | 5 ++- .../patch-change_tag-change_tag_rc_tag_id.sql | 16 +++++++++ .../patch-change_tag-change_tag_rc_tag_id.sql | 16 +++++++++ maintenance/mssql/tables.sql | 13 ++++--- .../patch-change_tag-change_tag_rc_tag_id.sql | 18 ++++++++++ maintenance/oracle/tables.sql | 16 ++++++--- maintenance/populateChangeTagDef.php | 24 +++++++++++-- .../patch-change_tag-change_tag_rc_tag_id.sql | 16 +++++++++ maintenance/postgres/tables.sql | 14 +++++--- .../patch-change_tag-change_tag_rc_tag_id.sql | 34 +++++++++++++++++++ maintenance/tables.sql | 12 ++++--- .../maintenance/populateChangeTagDefTest.php | 3 +- 17 files changed, 179 insertions(+), 24 deletions(-) create mode 100644 maintenance/archives/patch-change_tag-change_tag_rc_tag_id.sql create mode 100644 maintenance/mssql/patch-change_tag-change_tag_rc_tag_id.sql create mode 100644 maintenance/oracle/archives/patch-change_tag-change_tag_rc_tag_id.sql create mode 100644 maintenance/postgres/archives/patch-change_tag-change_tag_rc_tag_id.sql create mode 100644 maintenance/sqlite/archives/patch-change_tag-change_tag_rc_tag_id.sql diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 928d875423..761e92830f 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -9028,7 +9028,7 @@ $wgExpiryWidgetNoDatePicker = false; * @since 1.32 * @var int One of the MIGRATION_* constants */ -$wgChangeTagsSchemaMigrationStage = MIGRATION_OLD; +$wgChangeTagsSchemaMigrationStage = MIGRATION_WRITE_BOTH; /** * Temporarily flag to use change_tag_def table as backend of change tag statistics. diff --git a/includes/installer/MssqlUpdater.php b/includes/installer/MssqlUpdater.php index 0181ab224b..84427136cf 100644 --- a/includes/installer/MssqlUpdater.php +++ b/includes/installer/MssqlUpdater.php @@ -146,6 +146,9 @@ class MssqlUpdater extends DatabaseUpdater { [ 'addIndex', 'site_identifiers', 'PRIMARY', 'patch-site_identifiers-pk.sql' ], [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ], [ 'dropTable', 'transcache' ], + [ 'runMaintenance', PopulateChangeTagDef::class, 'maintenance/populateChangeTagDef.php' ], + [ 'addIndex', 'change_tag', 'change_tag_rc_tag_id', + 'patch-change_tag-change_tag_rc_tag_id.sql' ], ]; } diff --git a/includes/installer/MysqlUpdater.php b/includes/installer/MysqlUpdater.php index c33103cc7a..8afec4a481 100644 --- a/includes/installer/MysqlUpdater.php +++ b/includes/installer/MysqlUpdater.php @@ -169,7 +169,7 @@ class MysqlUpdater extends DatabaseUpdater { [ 'doLogUsertextPopulation' ], [ 'doLogSearchPopulation' ], [ 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ], - [ 'addIndex', 'change_tag', 'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ], + [ 'addIndex', 'tag_summary', 'tag_summary_rc_id', 'patch-change_tag-indexes.sql' ], [ 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ], [ 'doUpdateMimeMinorField' ], @@ -366,6 +366,9 @@ class MysqlUpdater extends DatabaseUpdater { 'patch-site_identifiers-fix-pk.sql' ], [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ], [ 'dropTable', 'transcache' ], + [ 'runMaintenance', PopulateChangeTagDef::class, 'maintenance/populateChangeTagDef.php' ], + [ 'addIndex', 'change_tag', 'change_tag_rc_tag_id', + 'patch-change_tag-change_tag_rc_tag_id.sql' ], ]; } diff --git a/includes/installer/OracleUpdater.php b/includes/installer/OracleUpdater.php index aa23d2c75a..020c687b94 100644 --- a/includes/installer/OracleUpdater.php +++ b/includes/installer/OracleUpdater.php @@ -157,6 +157,9 @@ class OracleUpdater extends DatabaseUpdater { [ 'populateContentTables' ], [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ], [ 'dropTable', 'transcache' ], + [ 'runMaintenance', PopulateChangeTagDef::class, 'maintenance/populateChangeTagDef.php' ], + [ 'addIndex', 'change_tag', 'change_tag_i03', + 'patch-change_tag-change_tag_rc_tag_id.sql' ], // KEEP THIS AT THE BOTTOM!! [ 'doRebuildDuplicateFunction' ], diff --git a/includes/installer/PostgresUpdater.php b/includes/installer/PostgresUpdater.php index 1be837ad2b..8336d6a91c 100644 --- a/includes/installer/PostgresUpdater.php +++ b/includes/installer/PostgresUpdater.php @@ -592,6 +592,9 @@ class PostgresUpdater extends DatabaseUpdater { [ 'addIndex', 'site_identifiers', 'site_identifiers_pkey', 'patch-site_identifiers-pk.sql' ], [ 'addPgIndex', 'recentchanges', 'rc_this_oldid', '(rc_this_oldid)' ], [ 'dropTable', 'transcache' ], + [ 'runMaintenance', PopulateChangeTagDef::class, 'maintenance/populateChangeTagDef.php' ], + [ 'addIndex', 'change_tag', 'change_tag_rc_tag_id', + 'patch-change_tag-change_tag_rc_tag_id.sql' ], ]; } diff --git a/includes/installer/SqliteUpdater.php b/includes/installer/SqliteUpdater.php index b48ac9b5ce..e5e88aaf20 100644 --- a/includes/installer/SqliteUpdater.php +++ b/includes/installer/SqliteUpdater.php @@ -54,7 +54,7 @@ class SqliteUpdater extends DatabaseUpdater { [ 'doLogUsertextPopulation' ], [ 'doLogSearchPopulation' ], [ 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ], - [ 'addIndex', 'change_tag', 'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ], + [ 'addIndex', 'tag_summary', 'tag_summary_rc_id', 'patch-change_tag-indexes.sql' ], [ 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ], [ 'sqliteSetupSearchindex' ], @@ -231,6 +231,9 @@ class SqliteUpdater extends DatabaseUpdater { 'patch-site_identifiers-fix-pk.sql' ], [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ], [ 'dropTable', 'transcache' ], + [ 'runMaintenance', PopulateChangeTagDef::class, 'maintenance/populateChangeTagDef.php' ], + [ 'addIndex', 'change_tag', 'change_tag_rc_tag_id', + 'patch-change_tag-change_tag_rc_tag_id.sql' ], ]; } diff --git a/maintenance/archives/patch-change_tag-change_tag_rc_tag_id.sql b/maintenance/archives/patch-change_tag-change_tag_rc_tag_id.sql new file mode 100644 index 0000000000..23f7779155 --- /dev/null +++ b/maintenance/archives/patch-change_tag-change_tag_rc_tag_id.sql @@ -0,0 +1,16 @@ +-- T193874: Add new indexes to change_tag table using ct_tag_id instead of ct_tag + +CREATE UNIQUE INDEX /*i*/change_tag_rc_tag_id ON /*_*/change_tag (ct_rc_id,ct_tag_id); +CREATE UNIQUE INDEX /*i*/change_tag_log_tag_id ON /*_*/change_tag (ct_log_id,ct_tag_id); +CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_tag_id); + +CREATE INDEX /*i*/change_tag_rc_tag_nonuniq ON /*_*/change_tag (ct_rc_id,ct_tag); +CREATE INDEX /*i*/change_tag_log_tag_nonuniq ON /*_*/change_tag (ct_log_id,ct_tag); +CREATE INDEX /*i*/change_tag_rev_tag_nonuniq ON /*_*/change_tag (ct_rev_id,ct_tag); + +DROP INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag; +DROP INDEX /*i*/change_tag_log_tag ON /*_*/change_tag; +DROP INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag; + +ALTER TABLE /*i*/change_tag + ALTER COLUMN ct_tag SET DEFAULT ''; \ No newline at end of file diff --git a/maintenance/mssql/patch-change_tag-change_tag_rc_tag_id.sql b/maintenance/mssql/patch-change_tag-change_tag_rc_tag_id.sql new file mode 100644 index 0000000000..e276afd95d --- /dev/null +++ b/maintenance/mssql/patch-change_tag-change_tag_rc_tag_id.sql @@ -0,0 +1,16 @@ +-- T193874: Add new indexes to change_tag table using ct_tag_id instead of ct_tag + +CREATE UNIQUE INDEX /*i*/change_tag_rc_tag_id ON /*_*/change_tag (ct_rc_id,ct_tag_id); +CREATE UNIQUE INDEX /*i*/change_tag_log_tag_id ON /*_*/change_tag (ct_log_id,ct_tag_id); +CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_tag_id); + +CREATE INDEX /*i*/change_tag_rc_tag_nonuniq ON /*_*/change_tag (ct_rc_id,ct_tag); +CREATE INDEX /*i*/change_tag_log_tag_nonuniq ON /*_*/change_tag (ct_log_id,ct_tag); +CREATE INDEX /*i*/change_tag_rev_tag_nonuniq ON /*_*/change_tag (ct_rev_id,ct_tag); + +DROP INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag; +DROP INDEX /*i*/change_tag_log_tag ON /*_*/change_tag; +DROP INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag; + +ALTER TABLE /*i*/change_tag + ADD CONSTRAINT DF_ct_tag DEFAULT '' FOR ct_tag; \ No newline at end of file diff --git a/maintenance/mssql/tables.sql b/maintenance/mssql/tables.sql index c9a1d12326..91bd9413e4 100644 --- a/maintenance/mssql/tables.sql +++ b/maintenance/mssql/tables.sql @@ -1387,16 +1387,21 @@ CREATE TABLE /*_*/change_tag ( -- REVID for the change ct_rev_id int NULL REFERENCES /*_*/revision(rev_id), -- Tag applied - ct_tag nvarchar(255) NOT NULL, + ct_tag nvarchar(255) NOT NULL default '', -- Parameters for the tag, presently unused ct_params nvarchar(max) NULL, -- Foreign key to change_tag_def row ct_tag_id int NULL CONSTRAINT ctd_tag_id__fk FOREIGN KEY REFERENCES /*_*/change_tag_def(ctd_id) ); -CREATE UNIQUE INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag (ct_rc_id,ct_tag); -CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag); -CREATE UNIQUE INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag (ct_rev_id,ct_tag); +CREATE INDEX /*i*/change_tag_rc_tag_nonuniq ON /*_*/change_tag (ct_rc_id,ct_tag); +CREATE INDEX /*i*/change_tag_log_tag_nonuniq ON /*_*/change_tag (ct_log_id,ct_tag); +CREATE INDEX /*i*/change_tag_rev_tag_nonuniq ON /*_*/change_tag (ct_rev_id,ct_tag); + +CREATE UNIQUE INDEX /*i*/change_tag_rc_tag_id ON /*_*/change_tag (ct_rc_id,ct_tag_id); +CREATE UNIQUE INDEX /*i*/change_tag_log_tag_id ON /*_*/change_tag (ct_log_id,ct_tag_id); +CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_tag_id); + -- Covering index, so we can pull all the info only out of the index. CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id); CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id); diff --git a/maintenance/oracle/archives/patch-change_tag-change_tag_rc_tag_id.sql b/maintenance/oracle/archives/patch-change_tag-change_tag_rc_tag_id.sql new file mode 100644 index 0000000000..65d5b3501a --- /dev/null +++ b/maintenance/oracle/archives/patch-change_tag-change_tag_rc_tag_id.sql @@ -0,0 +1,18 @@ +-- T193874: Add new indexes to change_tag table using ct_tag_id instead of ct_tag + +define mw_prefix='{$wgDBprefix}'; + +CREATE UNIQUE INDEX &mw_prefix.change_tag_u04 ON &mw_prefix.change_tag (ct_rc_id,ct_tag_id); +CREATE UNIQUE INDEX &mw_prefix.change_tag_u05 ON &mw_prefix.change_tag (ct_log_id,ct_tag_id); +CREATE UNIQUE INDEX &mw_prefix.change_tag_u06 ON &mw_prefix.change_tag (ct_rev_id,ct_tag_id); + +CREATE INDEX &mw_prefix.change_tag_i03 ON &mw_prefix.change_tag (ct_rc_id,ct_tag); +CREATE INDEX &mw_prefix.change_tag_i04 ON &mw_prefix.change_tag (ct_log_id,ct_tag); +CREATE INDEX &mw_prefix.change_tag_i05 ON &mw_prefix.change_tag (ct_rev_id,ct_tag); + +DROP INDEX &mw_prefix.change_tag_u01; +DROP INDEX &mw_prefix.change_tag_u02; +DROP INDEX &mw_prefix.change_tag_u03; + +ALTER TABLE &mw_prefix.change_tag + MODIFY ct_tag DEFAULT '///invalid///'; \ No newline at end of file diff --git a/maintenance/oracle/tables.sql b/maintenance/oracle/tables.sql index 3763d194ee..b491b98b27 100644 --- a/maintenance/oracle/tables.sql +++ b/maintenance/oracle/tables.sql @@ -935,14 +935,20 @@ CREATE TABLE &mw_prefix.change_tag ( ct_rc_id NUMBER NULL, ct_log_id NUMBER NULL, ct_rev_id NUMBER NULL, - ct_tag VARCHAR2(255) NOT NULL, + ct_tag VARCHAR2(255) DEFAULT '///invalid///' NOT NULL, ct_params BLOB NULL, - ct_tag_id NUMBER NULL, + ct_tag_id NUMBER NULL ); ALTER TABLE &mw_prefix.change_tag ADD CONSTRAINT &mw_prefix.change_tag_pk PRIMARY KEY (ct_id); -CREATE UNIQUE INDEX &mw_prefix.change_tag_u01 ON &mw_prefix.change_tag (ct_rc_id,ct_tag); -CREATE UNIQUE INDEX &mw_prefix.change_tag_u02 ON &mw_prefix.change_tag (ct_log_id,ct_tag); -CREATE UNIQUE INDEX &mw_prefix.change_tag_u03 ON &mw_prefix.change_tag (ct_rev_id,ct_tag); + +CREATE INDEX &mw_prefix.change_tag_i03 ON &mw_prefix.change_tag (ct_rc_id,ct_tag); +CREATE INDEX &mw_prefix.change_tag_i04 ON &mw_prefix.change_tag (ct_log_id,ct_tag); +CREATE INDEX &mw_prefix.change_tag_i05 ON &mw_prefix.change_tag (ct_rev_id,ct_tag); + +CREATE UNIQUE INDEX &mw_prefix.change_tag_u04 ON &mw_prefix.change_tag (ct_rc_id,ct_tag_id); +CREATE UNIQUE INDEX &mw_prefix.change_tag_u05 ON &mw_prefix.change_tag (ct_log_id,ct_tag_id); +CREATE UNIQUE INDEX &mw_prefix.change_tag_u06 ON &mw_prefix.change_tag (ct_rev_id,ct_tag_id); + CREATE INDEX &mw_prefix.change_tag_i01 ON &mw_prefix.change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id); CREATE INDEX &mw_prefix.change_tag_i02 ON &mw_prefix.change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id); diff --git a/maintenance/populateChangeTagDef.php b/maintenance/populateChangeTagDef.php index b06ac2b822..b11b95fd72 100644 --- a/maintenance/populateChangeTagDef.php +++ b/maintenance/populateChangeTagDef.php @@ -23,7 +23,7 @@ require_once __DIR__ . '/Maintenance.php'; * * @ingroup Maintenance */ -class PopulateChangeTagDef extends Maintenance { +class PopulateChangeTagDef extends LoggedUpdateMaintenance { /** @var Wikimedia\Rdbms\ILBFactory */ protected $lbFactory; @@ -43,11 +43,24 @@ class PopulateChangeTagDef extends Maintenance { public function execute() { global $wgChangeTagsSchemaMigrationStage; + if ( $wgChangeTagsSchemaMigrationStage === MIGRATION_OLD ) { + // Return "success", but don't flag it as done so the next run will retry + $this->output( '... Not run, $wgChangeTagsSchemaMigrationStage === MIGRATION_OLD' . "\n" ); + return true; + } + return parent::execute(); + } + + protected function doDBUpdates() { $this->lbFactory = MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); $this->setBatchSize( $this->getOption( 'batch-size', $this->getBatchSize() ) ); - $this->countDown( 5 ); - if ( $wgChangeTagsSchemaMigrationStage < MIGRATION_NEW ) { + if ( $this->lbFactory->getMainLB()->getConnection( DB_REPLICA )->fieldExists( + 'change_tag', + 'ct_tag', + __METHOD__ + ) + ) { if ( !$this->hasOption( 'populate-only' ) ) { $this->updateCountTag(); } @@ -58,6 +71,8 @@ class PopulateChangeTagDef extends Maintenance { // TODO: Implement // $this->cleanZeroCountRows(); + + return true; } private function updateCountTagId() { @@ -195,6 +210,9 @@ class PopulateChangeTagDef extends Maintenance { $this->output( "Finished adding ct_tag_id = {$tagId} for ct_tag = {$tagName}\n" ); } + protected function getUpdateKey() { + return __CLASS__; + } } $maintClass = PopulateChangeTagDef::class; diff --git a/maintenance/postgres/archives/patch-change_tag-change_tag_rc_tag_id.sql b/maintenance/postgres/archives/patch-change_tag-change_tag_rc_tag_id.sql new file mode 100644 index 0000000000..5194755161 --- /dev/null +++ b/maintenance/postgres/archives/patch-change_tag-change_tag_rc_tag_id.sql @@ -0,0 +1,16 @@ +-- T193874: Add new indexes to change_tag table using ct_tag_id instead of ct_tag + +CREATE UNIQUE INDEX /*i*/change_tag_rc_tag_id ON /*_*/change_tag (ct_rc_id,ct_tag_id); +CREATE UNIQUE INDEX /*i*/change_tag_log_tag_id ON /*_*/change_tag (ct_log_id,ct_tag_id); +CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_tag_id); + +CREATE INDEX /*i*/change_tag_rc_tag_nonuniq ON /*_*/change_tag (ct_rc_id,ct_tag); +CREATE INDEX /*i*/change_tag_log_tag_nonuniq ON /*_*/change_tag (ct_log_id,ct_tag); +CREATE INDEX /*i*/change_tag_rev_tag_nonuniq ON /*_*/change_tag (ct_rev_id,ct_tag); + +DROP INDEX /*i*/change_tag_rc_tag; +DROP INDEX /*i*/change_tag_log_tag; +DROP INDEX /*i*/change_tag_rev_tag; + +ALTER TABLE /*i*/change_tag + ALTER COLUMN ct_tag SET DEFAULT ''; \ No newline at end of file diff --git a/maintenance/postgres/tables.sql b/maintenance/postgres/tables.sql index 1a594f08c8..942a05b957 100644 --- a/maintenance/postgres/tables.sql +++ b/maintenance/postgres/tables.sql @@ -802,14 +802,20 @@ CREATE TABLE change_tag ( ct_rc_id INTEGER NULL, ct_log_id INTEGER NULL, ct_rev_id INTEGER NULL, - ct_tag TEXT NOT NULL, + ct_tag TEXT NOT NULL DEFAULT '', ct_params TEXT NULL, ct_tag_id INTEGER NULL ); ALTER SEQUENCE change_tag_ct_id_seq OWNED BY change_tag.ct_id; -CREATE UNIQUE INDEX change_tag_rc_tag ON change_tag(ct_rc_id,ct_tag); -CREATE UNIQUE INDEX change_tag_log_tag ON change_tag(ct_log_id,ct_tag); -CREATE UNIQUE INDEX change_tag_rev_tag ON change_tag(ct_rev_id,ct_tag); + +CREATE INDEX change_tag_rc_tag_nonuniq ON change_tag(ct_rc_id,ct_tag); +CREATE INDEX change_tag_log_tag_nonuniq ON change_tag(ct_log_id,ct_tag); +CREATE INDEX change_tag_rev_tag_nonuniq ON change_tag(ct_rev_id,ct_tag); + +CREATE UNIQUE INDEX change_tag_rc_tag_id ON change_tag(ct_rc_id,ct_tag_id); +CREATE UNIQUE INDEX change_tag_log_tag_id ON change_tag(ct_log_id,ct_tag_id); +CREATE UNIQUE INDEX change_tag_rev_tag_id ON change_tag(ct_rev_id,ct_tag_id); + CREATE INDEX change_tag_tag_id ON change_tag(ct_tag,ct_rc_id,ct_rev_id,ct_log_id); CREATE INDEX change_tag_tag_id_id ON change_tag(ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id); diff --git a/maintenance/sqlite/archives/patch-change_tag-change_tag_rc_tag_id.sql b/maintenance/sqlite/archives/patch-change_tag-change_tag_rc_tag_id.sql new file mode 100644 index 0000000000..37db8c2927 --- /dev/null +++ b/maintenance/sqlite/archives/patch-change_tag-change_tag_rc_tag_id.sql @@ -0,0 +1,34 @@ +-- T193874: Add new indexes to change_tag table using ct_tag_id instead of ct_tag +BEGIN TRANSACTION; + +DROP TABLE IF EXISTS /*_*/change_tag_tmp; + +CREATE TABLE /*_*/change_tag_tmp ( + ct_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, + ct_rc_id int NULL, + ct_log_id int unsigned NULL, + ct_rev_id int unsigned NULL, + ct_tag varchar(255) NOT NULL default '', + ct_params blob NULL, + ct_tag_id int unsigned NULL +) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024; + +INSERT OR IGNORE INTO /*_*/change_tag_tmp (ct_id, ct_rc_id, ct_log_id, ct_rev_id, ct_tag, ct_params, ct_tag_id) + SELECT + ct_id, ct_rc_id, ct_log_id, ct_rev_id, ct_tag, ct_params, ct_tag_id + FROM /*_*/change_tag; + +DROP TABLE /*_*/change_tag; + +ALTER TABLE /*_*/change_tag_tmp RENAME TO /*_*/change_tag; + +CREATE INDEX /*i*/change_tag_rc_tag_nonuniq ON /*_*/change_tag (ct_rc_id,ct_tag); +CREATE INDEX /*i*/change_tag_log_tag_nonuniq ON /*_*/change_tag (ct_log_id,ct_tag); +CREATE INDEX /*i*/change_tag_rev_tag_nonuniq ON /*_*/change_tag (ct_rev_id,ct_tag); +CREATE UNIQUE INDEX /*i*/change_tag_rc_tag_id ON /*_*/change_tag (ct_rc_id,ct_tag_id); +CREATE UNIQUE INDEX /*i*/change_tag_log_tag_id ON /*_*/change_tag (ct_log_id,ct_tag_id); +CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_tag_id); +CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id); +CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id); + +COMMIT; \ No newline at end of file diff --git a/maintenance/tables.sql b/maintenance/tables.sql index 245f35c739..409fbd7173 100644 --- a/maintenance/tables.sql +++ b/maintenance/tables.sql @@ -1837,16 +1837,20 @@ CREATE TABLE /*_*/change_tag ( -- REVID for the change ct_rev_id int unsigned NULL, -- Tag applied, this will go away and be replaced with ct_tag_id - ct_tag varchar(255) NOT NULL, + ct_tag varchar(255) NOT NULL default '', -- Parameters for the tag; used by some extensions ct_params blob NULL, -- Foreign key to change_tag_def row, this will be "NOT NULL" once populated ct_tag_id int unsigned NULL ) /*$wgDBTableOptions*/; -CREATE UNIQUE INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag (ct_rc_id,ct_tag); -CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag); -CREATE UNIQUE INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag (ct_rev_id,ct_tag); +CREATE INDEX /*i*/change_tag_rc_tag_nonuniq ON /*_*/change_tag (ct_rc_id,ct_tag); +CREATE INDEX /*i*/change_tag_log_tag_nonuniq ON /*_*/change_tag (ct_log_id,ct_tag); +CREATE INDEX /*i*/change_tag_rev_tag_nonuniq ON /*_*/change_tag (ct_rev_id,ct_tag); + +CREATE UNIQUE INDEX /*i*/change_tag_rc_tag_id ON /*_*/change_tag (ct_rc_id,ct_tag_id); +CREATE UNIQUE INDEX /*i*/change_tag_log_tag_id ON /*_*/change_tag (ct_log_id,ct_tag_id); +CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_tag_id); -- Covering index, so we can pull all the info only out of the index. CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id); CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id); diff --git a/tests/phpunit/maintenance/populateChangeTagDefTest.php b/tests/phpunit/maintenance/populateChangeTagDefTest.php index 719b46bcb0..8a88f196dd 100644 --- a/tests/phpunit/maintenance/populateChangeTagDefTest.php +++ b/tests/phpunit/maintenance/populateChangeTagDefTest.php @@ -16,7 +16,7 @@ class PopulateChangeTagDefTest extends MaintenanceBaseTestCase { public function setUp() { parent::setUp(); - $this->tablesUsed = [ 'change_tag', 'change_tag_def' ]; + $this->tablesUsed = [ 'change_tag', 'change_tag_def', 'updatelog' ]; $this->cleanChangeTagTables(); $this->insertChangeTagData(); @@ -25,6 +25,7 @@ class PopulateChangeTagDefTest extends MaintenanceBaseTestCase { private function cleanChangeTagTables() { wfGetDB( DB_MASTER )->delete( 'change_tag', '*' ); wfGetDB( DB_MASTER )->delete( 'change_tag_def', '*' ); + wfGetDB( DB_MASTER )->delete( 'updatelog', '*' ); } private function insertChangeTagData() { -- 2.20.1