Fix RevisionDeleteUser rev_actor query for MySQL
authorBrad Jorsch <bjorsch@wikimedia.org>
Wed, 28 Nov 2018 18:09:28 +0000 (13:09 -0500)
committerBrad Jorsch <bjorsch@wikimedia.org>
Thu, 29 Nov 2018 16:24:57 +0000 (11:24 -0500)
MySQL uses an extremely bad plan for the update with subquery here.
For the time being let's split out the subquery.

This'll break if the user has too many revision rows, but on the other
hand all the existing queries here will probably break in the same way
so let's leave that for later.

Bug: T210628
Change-Id: Ia3eb41b43b96c506349279e19743c41530969636

includes/revisiondelete/RevisionDeleteUser.php

index a8bf814..19fe0c3 100644 (file)
@@ -120,14 +120,17 @@ class RevisionDeleteUser {
                        $actorId = $dbw->selectField( 'actor', 'actor_id', [ 'actor_name' => $name ], __METHOD__ );
                        if ( $actorId ) {
                                # Hide name from live edits
-                               $subquery = $dbw->selectSQLText(
+                               $ids = $dbw->selectFieldValues(
                                        'revision_actor_temp', 'revactor_rev', [ 'revactor_actor' => $actorId ], __METHOD__
                                );
-                               $dbw->update(
-                                       'revision',
-                                       [ self::buildSetBitDeletedField( 'rev_deleted', $op, $delUser, $dbw ) ],
-                                       [ "rev_id IN ($subquery)" ],
-                                       __METHOD__ );
+                               if ( $ids ) {
+                                       $dbw->update(
+                                               'revision',
+                                               [ self::buildSetBitDeletedField( 'rev_deleted', $op, $delUser, $dbw ) ],
+                                               [ 'rev_id' => $ids ],
+                                               __METHOD__
+                                       );
+                               }
 
                                # Hide name from deleted edits
                                $dbw->update(