$db = $this->getDB();
$revQuery = MediaWikiServices::getInstance()->getRevisionStore()->getQueryInfo( [ 'page' ] );
- $this->addTables( $revQuery['tables'] );
- $this->addJoinConds( $revQuery['joins'] );
- $this->addFields( $revQuery['fields'] );
if ( $wgActorTableSchemaMigrationStage & SCHEMA_COMPAT_READ_NEW ) {
$revWhere = ActorMigration::newMigration()->getWhere( $db, 'rev_user', $users );
$userField = $this->orderBy === 'actor' ? 'revactor_actor' : 'actor_name';
$tsField = 'revactor_timestamp';
$idField = 'revactor_rev';
+
+ // T221511: MySQL/MariaDB (10.1.37) can sometimes irrationally decide that querying `actor`
+ // before `revision_actor_temp` and filesorting is somehow better than querying $limit+1 rows
+ // from `revision_actor_temp`. Tell it not to reorder the query (and also reorder it ourselves
+ // because as generated by RevisionStore it'll have `revision` first rather than
+ // `revision_actor_temp`). But not when uctag is used, as it seems as likely to be harmed as
+ // helped in that case, and not when there's only one User because in that case it fetches
+ // the one `actor` row as a constant and doesn't filesort.
+ if ( count( $users ) > 1 && !isset( $this->params['tag'] ) ) {
+ $revQuery['joins']['revision'] = $revQuery['joins']['temp_rev_user'];
+ unset( $revQuery['joins']['temp_rev_user'] );
+ $this->addOption( 'STRAIGHT_JOIN' );
+ // It isn't actually necesssary to reorder $revQuery['tables'] as Database does the right thing
+ // when join conditions are given for all joins, but Gergő is wary of relying on that so pull
+ // `revision_actor_temp` to the start.
+ $revQuery['tables'] =
+ [ 'temp_rev_user' => $revQuery['tables']['temp_rev_user'] ] + $revQuery['tables'];
+ }
} else {
// If we're dealing with user names (rather than IDs) in read-old mode,
// pass false for ActorMigration::getWhere()'s $useId parameter so
$idField = 'rev_id';
}
+ $this->addTables( $revQuery['tables'] );
+ $this->addJoinConds( $revQuery['joins'] );
+ $this->addFields( $revQuery['fields'] );
$this->addWhere( $revWhere['conds'] );
// Handle continue parameter
// Don't include any revisions where we're not supposed to be able to
// see the username.
$user = $this->getUser();
- if ( !$user->isAllowed( 'deletedhistory' ) ) {
+ if ( !$this->getPermissionManager()->userHasRight( $user, 'deletedhistory' ) ) {
$bitmask = RevisionRecord::DELETED_USER;
} elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
$bitmask = RevisionRecord::DELETED_USER | RevisionRecord::DELETED_RESTRICTED;
if ( isset( $this->params['tag'] ) ) {
$this->addTables( 'change_tag' );
$this->addJoinConds(
- [ 'change_tag' => [ 'INNER JOIN', [ $idField . ' = ct_rev_id' ] ] ]
+ [ 'change_tag' => [ 'JOIN', [ $idField . ' = ct_rev_id' ] ] ]
);
$changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
try {
if ( $this->fld_ids ) {
$vals['pageid'] = (int)$row->rev_page;
$vals['revid'] = (int)$row->rev_id;
- // $vals['textid'] = (int)$row->rev_text_id; // todo: Should this field be exposed?
if ( !is_null( $row->rev_parent_id ) ) {
$vals['parentid'] = (int)$row->rev_parent_id;