+
+ // 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'];
+ }