I've only seen this issue once (on Ansaikuropedia, during a MW 1.31.1 -> MW 1.35 upgrade), but a wiki with invalid data in the table can cause maintenance/rebuildtextindex.php to fail with an error by pointing to an invalid namespace.
On the affected wiki, php maintenance/rebuildtextindex.php abnormally ended with:
MWException from line 160 of .../includes/page/WikiPage.php: Invalid or virtual namespace -1 given. #0 .../includes/page/WikiPage.php(223): WikiPage::factory() #1 .../includes/page/WikiPage.php(208): WikiPage::newFromRow() #2 .../includes/deferred/SearchUpdate.php(189): WikiPage::newFromID() #3 .../includes/deferred/SearchUpdate.php(94): SearchUpdate->getLatestPage() #4 .../maintenance/rebuildtextindex.php(114): SearchUpdate->doUpdate() #5 .../maintenance/rebuildtextindex.php(68): RebuildTextIndex->populateSearchIndex() #6 .../maintenance/doMaintenance.php(107): RebuildTextIndex->execute() #7 .../maintenance/rebuildtextindex.php(162): require_once('/var/www/wiki13...') #8 {main}
That left the site in an incompletely-updated state where every search would fail with errors, ie: a search for https://ansaikuropedia.org/index.php?search=Jimmy+Hoffa+Sr.&title=%E7%89%B9%E5%88%A5%3A%E6%A4%9C%E7%B4%A2&uselang=en&profile=default&fulltext=1 failed with:
[0319025be0e9dc8c66f11450] /index.php?search=Jimmy+Hoffa+Sr.&title=%E7%89%B9%E5%88%A5%3A%E6%A4%9C%E7%B4%A2&profile=default&fulltext=1 Wikimedia\Rdbms\DBQueryError from line 1699 of .../includes/libs/rdbms/database/Database.php: A database query error has occurred. Did you forget to run your application's database schema updater after upgrading? Error 1191: Can't find FULLTEXT index matching the column list (localhost) Function: SearchMySQL::searchInternal Query: SELECT page_id,page_namespace,page_title FROM `page`,`searchindex` WHERE (page_id=si_page) AND ( MATCH(si_title) AGAINST('+jimmy +hoffa +sru800. ' IN BOOLEAN MODE) ) AND page_namespace = 0 ORDER BY MATCH(si_title) AGAINST('+jimmy +hoffa +sru800. ' IN NATURAL LANGUAGE MODE) DESC LIMIT 21 Backtrace: #0 .../includes/libs/rdbms/database/Database.php(1683): Wikimedia\Rdbms\Database->getQueryException() #1 .../includes/libs/rdbms/database/Database.php(1658): Wikimedia\Rdbms\Database->getQueryExceptionAndLog() #2 .../includes/libs/rdbms/database/Database.php(1227): Wikimedia\Rdbms\Database->reportQueryError() #3 .../includes/libs/rdbms/database/Database.php(1907): Wikimedia\Rdbms\Database->query() #4 .../includes/libs/rdbms/database/DBConnRef.php(68): Wikimedia\Rdbms\Database->select() #5 .../includes/libs/rdbms/database/DBConnRef.php(313): Wikimedia\Rdbms\DBConnRef->__call() #6 .../includes/search/SearchMySQL.php(193): Wikimedia\Rdbms\DBConnRef->select() #7 .../includes/search/SearchMySQL.php(179): SearchMySQL->searchInternal() #8 .../includes/search/SearchDatabase.php(74): SearchMySQL->doSearchTitleInDB() #9 .../includes/search/SearchEngine.php(156): SearchDatabase->doSearchTitle() #10 .../includes/search/SearchEngine.php(187): SearchEngine->{closure}() #11 .../includes/search/SearchEngine.php(157): SearchEngine->maybePaginate() #12 .../includes/specials/SpecialSearch.php(387): SearchEngine->searchTitle() #13 .../includes/specials/SpecialSearch.php(179): SpecialSearch->showResults() #14 .../includes/specialpage/SpecialPage.php(600): SpecialSearch->execute() #15 .../includes/specialpage/SpecialPageFactory.php(635): SpecialPage->run() #16 .../includes/MediaWiki.php(307): MediaWiki\SpecialPage\SpecialPageFactory->executePath() #17 .../includes/MediaWiki.php(940): MediaWiki->performRequest() #18 .../includes/MediaWiki.php(543): MediaWiki->main() #19 .../index.php(53): MediaWiki->run() #20 .../index.php(46): wfIndexMain() #21 {main}
I tried editing includes/deferred/SearchUpdate.php to check for this condition, replacing
public function doUpdate() { $services = MediaWikiServices::getInstance(); $config = $services->getSearchEngineConfig(); if ( $config->getConfig()->get( 'DisableSearchUpdate' ) || !$this->id ) { return; } $seFactory = $services->getSearchEngineFactory(); foreach ( $config->getSearchTypes() as $type ) {
with
public function doUpdate() { $services = MediaWikiServices::getInstance(); $config = $services->getSearchEngineConfig(); if ( $config->getConfig()->get( 'DisableSearchUpdate' ) || !$this->id ) { return; } $seFactory = $services->getSearchEngineFactory(); foreach ( $config->getSearchTypes() as $type ) if ($this->title->mNamespace >= 0) // 2020-11-24 : kludge to prevent -1 as namespace (a fatal exception): {
and run the maintenance/rebuildtextindex.php script again. With this one-line addition (of a sanity check), the script completes without incident. Try the search again and it works:
Search results Jump to navigation Jump to search Content pages Multimedia Everything Advanced Create the page "Jimmy Hoffa Sr." on this wiki! There were no results matching the query.
So we're still no closer to finding mista Hoffa, but at least this bog is no longer messing with my machine, capiche?
That still doesn't explain how the bad data got into the table in the first place, but it seems like a trivial enough one line change to check for this condition and skip anything with invalid (<0) namespaces?