$fld_details = false, $fld_tags = false;
public function execute() {
- global $wgChangeTagsSchemaMigrationStage;
-
$params = $this->extractRequestParams();
$db = $this->getDB();
$this->commentStore = CommentStore::getStore();
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' );
}
}
$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'];
}
}
+ // 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();
$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 ) {
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();
$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 ) {