Query::_adduser() called without $tableAlias throws error 'rev_actor' field is ambiguous
DynamicPageList3 version: 3.5.1 MediaWiki version: 1.39.4 PHP version: 7.4.33 MariaDB: 10.6.11
List of steps to reproduce (step by step, including full links if applicable):
- I'm not too sure, but I don't think our DPL code is that unusual:
<dpl>
titlematch=MER Tag %
replaceintitle=$MER Tag $,
namespace=Category
notcategory=Candidates for deletion
shownamespace=false
columns=3
rowcolformat=width=100%
mode=userformat
format=,\n* [[%PAGE%|%TITLE%]],,
</dpl>
What happens?:
Query::buildAndSelect() calls Query::_adduser() via a variable function on line 184, which doesn't supply a $tableAlias param. This throws the error below:
Error 1052: Column 'rev_actor' in field list is ambiguous
Function: MediaWiki\Extension\DynamicPageList3\Query::buildAndSelect - Science:Math_Exam_Resources
Query: SET STATEMENT max_statement_time=10 FOR SELECT DISTINCT rev.rev_timestamp,rev_actor,`page`.page_len AS `page_len`,SUM(ABS(rc.rc_new_len - rc.rc_old_len)) AS `contribution`,rc.rc_actor AS `contributor`,`page`.page_namespace AS `page_namespace`,`page`.page_id AS `page_id`,`page`.page_title AS `page_title` FROM `revision` `rev`,`revision` `revision`,`recentchanges` `rc`,`page` WHERE ((`page`.page_title like'MER%')) AND (`page`.page_id = rev.rev_page) AND (rev.rev_timestamp = (SELECT MAX(rev_aux.rev_timestamp) FROM `revision` AS rev_aux WHERE rev_aux.rev_page = rev.rev_page)) AND `page`.page_is_redirect = 0 AND `page`.page_namespace = 130 AND (revision.rev_minor_edit = 0) AND (`page`.page_id = rc.rc_cur_id) AND (`page`.page_id = rev.rev_page) GROUP BY rc.rc_cur_id ORDER BY rev.rev_timestamp DESC LIMIT 3
Looking at the query, it seems that the revision table is getting two aliases: rev and revision, resulting in this ambiguity. The revision alias seems to be used only in Query::_minoredits(). Changing Query::_minoredits() to also use the rev alias seems to fix it for our use case. I'm wondering if that's a safe change to make generally?
What should have happened instead?:
Page renders without error.
Browser information, screenshots and other applicable information:
Full stacktrace:
Backtrace:
from /var/www/html/includes/libs/rdbms/database/Database.php(1618)
#0 /var/www/html/includes/libs/rdbms/database/Database.php(1602): Wikimedia\Rdbms\Database->getQueryException(string, integer, string, string)
#1 /var/www/html/includes/libs/rdbms/database/Database.php(1576): Wikimedia\Rdbms\Database->getQueryExceptionAndLog(string, integer, string, string)
#2 /var/www/html/includes/libs/rdbms/database/Database.php(952): Wikimedia\Rdbms\Database->reportQueryError(string, integer, string, string, boolean)
#3 /var/www/html/includes/libs/rdbms/database/Database.php(1711): Wikimedia\Rdbms\Database->query(string, string, integer)
#4 /var/www/html/includes/libs/rdbms/database/DBConnRef.php(103): Wikimedia\Rdbms\Database->select(array, array, array, string, array, array)
#5 /var/www/html/includes/libs/rdbms/database/DBConnRef.php(326): Wikimedia\Rdbms\DBConnRef->__call(string, array)
#6 /var/www/html/extensions/DynamicPageList3/includes/Query.php(382): Wikimedia\Rdbms\DBConnRef->select(array, array, array, string, array, array)
#7 /var/www/html/includes/poolcounter/PoolCounterWorkViaCallback.php(74): MediaWiki\Extension\DynamicPageList3\Query::MediaWiki\Extension\DynamicPageList3\{closure}()
#8 /var/www/html/includes/poolcounter/PoolCounterWork.php(162): PoolCounterWorkViaCallback->doWork()
#9 /var/www/html/extensions/DynamicPageList3/includes/Query.php(410): PoolCounterWork->execute()
#10 /var/www/html/includes/libs/objectcache/wancache/WANObjectCache.php(1689): MediaWiki\Extension\DynamicPageList3\Query::MediaWiki\Extension\DynamicPageList3\{closure}(boolean, integer, array, NULL, array)
#11 /var/www/html/includes/libs/objectcache/wancache/WANObjectCache.php(1522): WANObjectCache->fetchOrRegenerate(string, integer, Closure, array, array)
#12 /var/www/html/extensions/DynamicPageList3/includes/Query.php(423): WANObjectCache->getWithSetCallback(string, integer, Closure, array)
#13 /var/www/html/extensions/DynamicPageList3/includes/Parse.php(212): MediaWiki\Extension\DynamicPageList3\Query->buildAndSelect(boolean, NULL, string)
#14 /var/www/html/extensions/DynamicPageList3/includes/Hooks.php(275): MediaWiki\Extension\DynamicPageList3\Parse->parse(string, Parser, NULL, NULL, boolean)
#15 /var/www/html/includes/parser/Parser.php(3437): MediaWiki\Extension\DynamicPageList3\Hooks::dplParserFunction(Parser, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string)
#16 /var/www/html/includes/parser/Parser.php(3122): Parser->callParserFunction(PPTemplateFrame_Hash, string, array)
#17 /var/www/html/includes/parser/PPFrame_Hash.php(275): Parser->braceSubstitution(array, PPTemplateFrame_Hash)
#18 /var/www/html/includes/parser/PPTemplateFrame_Hash.php(97): PPFrame_Hash->expand(PPNode_Hash_Tree, integer)
#19 /var/www/html/includes/parser/Parser.php(3310): PPTemplateFrame_Hash->cachedExpand(string, PPNode_Hash_Tree)
#20 /var/www/html/includes/parser/PPFrame_Hash.php(275): Parser->braceSubstitution(array, PPFrame_Hash)
#21 /var/www/html/includes/parser/Parser.php(2951): PPFrame_Hash->expand(PPNode_Hash_Tree, integer)
#22 /var/www/html/includes/parser/Parser.php(1609): Parser->replaceVariables(string)
#23 /var/www/html/includes/parser/Parser.php(723): Parser->internalParse(string)
#24 /var/www/html/extensions/DynamicPageList3/includes/Parse.php(912): Parser->parse(string, Title, ParserOptions)
#25 /var/www/html/extensions/DynamicPageList3/includes/Parse.php(336): MediaWiki\Extension\DynamicPageList3\Parse->triggerEndResets(string, NULL, NULL, boolean, Parser)
#26 /var/www/html/extensions/DynamicPageList3/includes/Hooks.php(212): MediaWiki\Extension\DynamicPageList3\Parse->parse(string, Parser, NULL, NULL, boolean)
#27 /var/www/html/extensions/DynamicPageList3/includes/Hooks.php(191): MediaWiki\Extension\DynamicPageList3\Hooks::executeTag(string, array, Parser, PPTemplateFrame_Hash)
#28 /var/www/html/includes/parser/Parser.php(4017): MediaWiki\Extension\DynamicPageList3\Hooks::dplTag(string, array, Parser, PPTemplateFrame_Hash)
#29 /var/www/html/includes/parser/PPFrame_Hash.php(353): Parser->extensionSubstitution(array, PPTemplateFrame_Hash, boolean)
#30 /var/www/html/includes/parser/PPTemplateFrame_Hash.php(97): PPFrame_Hash->expand(PPNode_Hash_Tree, integer)
#31 /var/www/html/includes/parser/Parser.php(3310): PPTemplateFrame_Hash->cachedExpand(string, PPNode_Hash_Tree)
#32 /var/www/html/includes/parser/PPFrame_Hash.php(275): Parser->braceSubstitution(array, PPFrame_Hash)
#33 /var/www/html/includes/parser/Parser.php(2951): PPFrame_Hash->expand(PPNode_Hash_Tree, integer)
#34 /var/www/html/includes/parser/Parser.php(1609): Parser->replaceVariables(string)
#35 /var/www/html/includes/parser/Parser.php(723): Parser->internalParse(string)
#36 /var/www/html/includes/content/WikitextContentHandler.php(301): Parser->parse(string, Title, ParserOptions, boolean, boolean, integer)
#37 /var/www/html/includes/content/ContentHandler.php(1721): WikitextContentHandler->fillParserOutput(WikitextContent, MediaWiki\Content\Renderer\ContentParseParams, ParserOutput)
#38 /var/www/html/includes/content/Renderer/ContentRenderer.php(47): ContentHandler->getParserOutput(WikitextContent, MediaWiki\Content\Renderer\ContentParseParams)
#39 /var/www/html/includes/Revision/RenderedRevision.php(266): MediaWiki\Content\Renderer\ContentRenderer->getParserOutput(WikitextContent, Title, integer, ParserOptions, boolean)
#40 /var/www/html/includes/Revision/RenderedRevision.php(237): MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached(WikitextContent, boolean)
#41 /var/www/html/includes/Revision/RevisionRenderer.php(221): MediaWiki\Revision\RenderedRevision->getSlotParserOutput(string, array)
#42 /var/www/html/includes/Revision/RevisionRenderer.php(158): MediaWiki\Revision\RevisionRenderer->combineSlotOutput(MediaWiki\Revision\RenderedRevision, array)
#43 [internal function]: MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}(MediaWiki\Revision\RenderedRevision, array)
#44 /var/www/html/includes/Revision/RenderedRevision.php(199): call_user_func(Closure, MediaWiki\Revision\RenderedRevision, array)
#45 /var/www/html/includes/poolcounter/PoolWorkArticleView.php(91): MediaWiki\Revision\RenderedRevision->getRevisionParserOutput()
#46 /var/www/html/includes/poolcounter/PoolWorkArticleViewCurrent.php(97): PoolWorkArticleView->renderRevision()
#47 /var/www/html/includes/poolcounter/PoolCounterWork.php(162): PoolWorkArticleViewCurrent->doWork()
#48 /var/www/html/includes/page/ParserOutputAccess.php(299): PoolCounterWork->execute()
#49 /var/www/html/includes/page/Article.php(714): MediaWiki\Page\ParserOutputAccess->getParserOutput(WikiPage, ParserOptions, MediaWiki\Revision\RevisionStoreCacheRecord, integer)
#50 /var/www/html/includes/page/Article.php(528): Article->generateContentOutput(User, ParserOptions, integer, OutputPage, array)
#51 /var/www/html/includes/actions/ViewAction.php(78): Article->view()
#52 /var/www/html/includes/MediaWiki.php(542): ViewAction->show()
#53 /var/www/html/includes/MediaWiki.php(322): MediaWiki->performAction(Article, Title)
#54 /var/www/html/includes/MediaWiki.php(904): MediaWiki->performRequest()
#55 /var/www/html/includes/MediaWiki.php(562): MediaWiki->main()
#56 /var/www/html/index.php(50): MediaWiki->run()
#57 /var/www/html/index.php(46): wfIndexMain()
#58 {main}