X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiQueryLogEvents.php;h=962d9561300c0ff60f8c62e08cc9263e1a02516b;hb=8963110d01b0f376d900171fe7506fed5df80cf8;hp=ba04193b33b167e8e3c85981d87321d8aa3b54f4;hpb=32542f66db7821660d3683e74a572ec3ab1e76f2;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiQueryLogEvents.php b/includes/api/ApiQueryLogEvents.php index ba04193b33..962d956130 100644 --- a/includes/api/ApiQueryLogEvents.php +++ b/includes/api/ApiQueryLogEvents.php @@ -42,8 +42,6 @@ class ApiQueryLogEvents extends ApiQueryBase { $fld_details = false, $fld_tags = false; public function execute() { - global $wgChangeTagsSchemaMigrationStage; - $params = $this->extractRequestParams(); $db = $this->getDB(); $this->commentStore = CommentStore::getStore(); @@ -114,18 +112,14 @@ class ApiQueryLogEvents extends ApiQueryBase { if ( !is_null( $params['tag'] ) ) { $this->addTables( 'change_tag' ); - $this->addJoinConds( [ 'change_tag' => [ 'INNER JOIN', + $this->addJoinConds( [ 'change_tag' => [ 'JOIN', [ 'log_id=ct_log_id' ] ] ] ); - if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) { - $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore(); - try { - $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) ); - } catch ( NameTableAccessException $exception ) { - // Return nothing. - $this->addWhere( '1=0' ); - } - } else { - $this->addWhereFld( 'ct_tag', $params['tag'] ); + $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore(); + try { + $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) ); + } catch ( NameTableAccessException $exception ) { + // Return nothing. + $this->addWhere( '1=0' ); } } @@ -189,6 +183,10 @@ class ApiQueryLogEvents extends ApiQueryBase { $db, 'log_user', User::newFromName( $params['user'], false ) ); $this->addWhere( $q['conds'] ); + + // T71222: MariaDB's optimizer, at least 10.1.37 and .38, likes to choose a wildly bad plan for + // some reason for this code path. Tell it not to use the wrong index it wants to pick. + $this->addOption( 'IGNORE INDEX', [ 'logging' => [ 'times' ] ] ); } $title = $params['title']; @@ -240,6 +238,14 @@ class ApiQueryLogEvents extends ApiQueryBase { } } + // T220999: MySQL/MariaDB (10.1.37) can sometimes irrationally decide that querying `actor` before + // `logging` and filesorting is somehow better than querying $limit+1 rows from `logging`. + // Tell it not to reorder the query. But not when `letag` was used, as it seems as likely + // to be harmed as helped in that case. + if ( $params['tag'] === null ) { + $this->addOption( 'STRAIGHT_JOIN' ); + } + $count = 0; $res = $this->select( __METHOD__ ); $result = $this->getResult(); @@ -270,7 +276,7 @@ class ApiQueryLogEvents extends ApiQueryBase { $user = $this->getUser(); if ( $this->fld_ids ) { - $vals['logid'] = intval( $row->log_id ); + $vals['logid'] = (int)$row->log_id; } if ( $this->fld_title || $this->fld_parsedcomment ) { @@ -287,8 +293,8 @@ class ApiQueryLogEvents extends ApiQueryBase { ApiQueryBase::addTitleInfo( $vals, $title ); } if ( $this->fld_ids ) { - $vals['pageid'] = intval( $row->page_id ); - $vals['logpage'] = intval( $row->log_page ); + $vals['pageid'] = (int)$row->page_id; + $vals['logpage'] = (int)$row->log_page; } if ( $this->fld_details ) { $vals['params'] = LogFormatter::newFromEntry( $logEntry )->formatParametersForApi(); @@ -311,7 +317,7 @@ class ApiQueryLogEvents extends ApiQueryBase { $vals['user'] = $row->user_name ?? $row->log_user_text; } if ( $this->fld_userid ) { - $vals['userid'] = intval( $row->log_user ); + $vals['userid'] = (int)$row->log_user; } if ( !$row->log_user ) {