From: Jeff Date: Tue, 12 Aug 2014 06:35:35 +0000 (-0700) Subject: PostgreSQL: Fix text search on moved pages X-Git-Tag: 1.31.0-rc.0~10701^2 X-Git-Url: https://git.cyclocoop.org/%27.%24link.%27?a=commitdiff_plain;h=c1371e7f54e0f42d9c367a58121adee0259799fd;p=lhc%2Fweb%2Fwiklou.git PostgreSQL: Fix text search on moved pages When a page is updated under PostgreSQL, there is code to de-index all but the most recent version of the page. But when a page is moved, it was accidentally de-indexing the most recent version as well, because rev_text_id is not incremented in that case. A simple tweak to the SQL fixes that. I added code to the update script to find pages previously corrupted by this problem and reindex them. Bug: 66650 Change-Id: I52e1bbbd8592be5e7c7383c225e6b4c19bbe5b9e --- diff --git a/includes/installer/PostgresUpdater.php b/includes/installer/PostgresUpdater.php index 9e412765cc..f2f2a26dca 100644 --- a/includes/installer/PostgresUpdater.php +++ b/includes/installer/PostgresUpdater.php @@ -409,6 +409,8 @@ class PostgresUpdater extends DatabaseUpdater { array( 'addPgField', 'mwuser', 'user_password_expires', 'TIMESTAMPTZ NULL' ), array( 'changeFieldPurgeTable', 'l10n_cache', 'lc_value', 'bytea', "replace(lc_value,'\','\\\\')::bytea" ), + // 1.23.9 + array( 'rebuildTextSearch'), // 1.24 array( 'addPgField', 'page_props', 'pp_sortkey', 'float NULL' ), @@ -949,4 +951,12 @@ END; $this->applyPatch( 'patch-tsearch2funcs.sql', false, "Rewriting tsearch2 triggers" ); } } + + protected function rebuildTextSearch() { + if ( $this->updateRowExists( 'patch-textsearch_bug66650.sql' ) ) { + $this->output( "...bug 66650 already fixed or not applicable.\n" ); + return true; + }; + $this->applyPatch( 'patch-textsearch_bug66650.sql', false, "Rebuilding text search for bug 66650" ); + } } diff --git a/includes/search/SearchPostgres.php b/includes/search/SearchPostgres.php index bda10b0bda..71e3b63505 100644 --- a/includes/search/SearchPostgres.php +++ b/includes/search/SearchPostgres.php @@ -186,7 +186,7 @@ class SearchPostgres extends SearchDatabase { function update( $pageid, $title, $text ) { ## We don't want to index older revisions $sql = "UPDATE pagecontent SET textvector = NULL WHERE textvector IS NOT NULL and old_id IN " . - "(SELECT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) . + "(SELECT DISTINCT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) . " ORDER BY rev_text_id DESC OFFSET 1)"; $this->db->query( $sql ); return true; diff --git a/maintenance/postgres/archives/patch-textsearch_bug66650.sql b/maintenance/postgres/archives/patch-textsearch_bug66650.sql new file mode 100644 index 0000000000..e4f5681c45 --- /dev/null +++ b/maintenance/postgres/archives/patch-textsearch_bug66650.sql @@ -0,0 +1,5 @@ +UPDATE /*_*/pagecontent SET textvector=to_tsvector(old_text) +WHERE textvector IS NULL AND old_id IN +(SELECT max(rev_text_id) FROM revision GROUP BY rev_page); + +INSERT INTO /*_*/updatelog(ul_key) VALUES ('patch-textsearch_bug66650.sql'); diff --git a/maintenance/postgres/update-keys.sql b/maintenance/postgres/update-keys.sql index 7761d0c5bd..b8585515a1 100644 --- a/maintenance/postgres/update-keys.sql +++ b/maintenance/postgres/update-keys.sql @@ -27,3 +27,8 @@ INSERT INTO /*_*/updatelog (ul_key, ul_value) VALUES( 'user_former_groups-ufg_group-patch-ufg_group-length-increase-255.sql', null ); INSERT INTO /*_*/updatelog (ul_key, ul_value) VALUES( 'user_properties-up_property-patch-up_property.sql', null ); + +-- PostgreSQL-specific patches. + +INSERT INTO /*_*/updatelog (ul_key, ul_value) + VALUES( 'patch-textsearch_bug66650.sql', null );