List of steps to reproduce (step by step, including full links if applicable):
- Install Extension:Arrays and Extension:CirrusSearch
- Create a page with this content:
{{#arraydefine:s|,t,|,|unique}}
What happens?:
- CirrusSearch parses the page in the JobQueue and throws an exception
ErrorException from line 155 of /path/to/wiki/extensions/Arrays/ExtArrays.php: PHP Notice: Undefined offset: 0
Which is the following if
if ( count( $array ) === 1 && $array[0] === '' ) { $array = []; }
What should have happened instead?:
The page should get parser without exception.
Software version (if not a Wikimedia wiki), browser information, screenshots, other information, etc:
Possible fix:
The array_unique() function in the same file
protected static function array_unique( array $array ) { return array_filter( array_unique( $array ), static function ( $value ) { return $value !== ''; } ); }
uses array_filter() which breaks the assumption that an array with 1 element would have an element with index 0, wrapping it in array_values() should fix this without changing any behavior of the extension.
Full Trace:
ErrorException from line 155 of /path/to/wiki/extensions/Arrays/ExtArrays.php: PHP Notice: Undefined offset: 0 #0 /path/to/wiki/extensions/Arrays/ExtArrays.php(155): MWExceptionHandler::handleError(integer, string, string, integer, array) #1 /path/to/wiki/includes/parser/Parser.php(3340): ExtArrays::pf_arraydefine(Parser, string, string, string, string) #2 /path/to/wiki/includes/parser/Parser.php(3047): Parser->callParserFunction(PPFrame_Hash, string, array) #3 /path/to/wiki/includes/parser/PPFrame_Hash.php(253): Parser->braceSubstitution(array, PPFrame_Hash) #4 /path/to/wiki/includes/parser/Parser.php(2887): PPFrame_Hash->expand(PPNode_Hash_Tree, integer) #5 /path/to/wiki/includes/parser/Parser.php(1556): Parser->replaceVariables(string) #6 /path/to/wiki/includes/parser/Parser.php(651): Parser->internalParse(string) #7 /path/to/wiki/includes/content/WikitextContent.php(374): Parser->parse(string, Title, ParserOptions, boolean, boolean, integer) #8 /path/to/wiki/includes/content/AbstractContent.php(590): WikitextContent->fillParserOutput(Title, integer, ParserOptions, boolean, ParserOutput) #9 /path/to/wiki/includes/Revision/RenderedRevision.php(263): AbstractContent->getParserOutput(Title, integer, ParserOptions, boolean) #10 /path/to/wiki/includes/Revision/RenderedRevision.php(235): MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached(WikitextContent, boolean) #11 /path/to/wiki/includes/Revision/RevisionRenderer.php(215): MediaWiki\Revision\RenderedRevision->getSlotParserOutput(string) #12 /path/to/wiki/includes/Revision/RevisionRenderer.php(152): MediaWiki\Revision\RevisionRenderer->combineSlotOutput(MediaWiki\Revision\RenderedRevision, array) #13 [internal function]: MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}(MediaWiki\Revision\RenderedRevision, array) #14 /path/to/wiki/includes/Revision/RenderedRevision.php(197): call_user_func(Closure, MediaWiki\Revision\RenderedRevision, array) #15 /path/to/wiki/includes/content/ContentHandler.php(1425): MediaWiki\Revision\RenderedRevision->getRevisionParserOutput() #16 /path/to/wiki/extensions/CirrusSearch/includes/BuildDocument/ParserOutputPageProperties.php(80): ContentHandler->getParserOutputForIndexing(WikiPage, ParserCache) #17 /path/to/wiki/extensions/CirrusSearch/includes/BuildDocument/ParserOutputPageProperties.php(63): CirrusSearch\BuildDocument\ParserOutputPageProperties->finalizeReal(Elastica\Document, WikiPage, ParserCache, CirrusSearch\CirrusSearch) #18 /path/to/wiki/extensions/CirrusSearch/includes/BuildDocument/BuildDocument.php(160): CirrusSearch\BuildDocument\ParserOutputPageProperties->finalize(Elastica\Document, Title) #19 /path/to/wiki/extensions/CirrusSearch/includes/DataSender.php(167): CirrusSearch\BuildDocument\BuildDocument->finalize(Elastica\Document) #20 /path/to/wiki/extensions/CirrusSearch/includes/Job/ElasticaWrite.php(136): CirrusSearch\DataSender->sendData(string, array) #21 /path/to/wiki/extensions/CirrusSearch/includes/Job/JobTraits.php(137): CirrusSearch\Job\ElasticaWrite->doJob() #22 /path/to/wiki/includes/jobqueue/JobRunner.php(372): CirrusSearch\Job\CirrusGenericJob->run() #23 /path/to/wiki/includes/jobqueue/JobRunner.php(333): JobRunner->doExecuteJob(CirrusSearch\Job\ElasticaWrite) #24 /path/to/wiki/includes/jobqueue/JobRunner.php(244): JobRunner->executeJob(CirrusSearch\Job\ElasticaWrite) #25 /path/to/wiki/maintenance/runJobs.php(92): JobRunner->run(array) #26 /path/to/wiki/maintenance/doMaintenance.php(107): RunJobs->execute() #27 /path/to/wiki/maintenance/runJobs.php(129): require_once(string) #28 {main}