Fix deletion handling of rev_deleted
authorAaron Schulz <aschulz@wikimedia.org>
Thu, 1 Sep 2016 12:42:01 +0000 (05:42 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Fri, 2 Sep 2016 21:56:48 +0000 (14:56 -0700)
When the suppress button was not used, and some live
revisions had rev_deleted set, the query would try to
write the literal string "rev_deleted" as rev_deleted,
which was not noticed in default non-strict MySQL and
was casted to 0.

Follow-up to 673371e2c7

Bug: T144484
Change-Id: If3a74de13ea841d9d94ae05532cc8dadb0e40867

includes/page/WikiPage.php

index e1d9f99..5459629 100644 (file)
@@ -2900,8 +2900,9 @@ class WikiPage implements Page, IDBAccessObject {
                        $bitfield |= Revision::DELETED_COMMENT;
                        $bitfield |= Revision::DELETED_USER;
                        $bitfield |= Revision::DELETED_RESTRICTED;
+                       $deletionFields = [ $dbw->addQuotes( $bitfield ) . ' AS deleted' ];
                } else {
-                       $bitfield = 'rev_deleted';
+                       $deletionFields = [ 'rev_deleted AS deleted' ];
                }
 
                // For now, shunt the revision data into the archive table.
@@ -2912,9 +2913,10 @@ class WikiPage implements Page, IDBAccessObject {
                // the rev_deleted field, which is reserved for this purpose.
 
                // Get all of the page revisions
+               $fields = array_diff( Revision::selectFields(), [ 'rev_deleted' ] );
                $res = $dbw->select(
                        'revision',
-                       Revision::selectFields(),
+                       array_merge( $fields, $deletionFields ),
                        [ 'rev_page' => $id ],
                        __METHOD__,
                        'FOR UPDATE'
@@ -2937,7 +2939,7 @@ class WikiPage implements Page, IDBAccessObject {
                                'ar_flags'      => '',
                                'ar_len'        => $row->rev_len,
                                'ar_page_id'    => $id,
-                               'ar_deleted'    => $bitfield,
+                               'ar_deleted'    => $row->deleted,
                                'ar_sha1'       => $row->rev_sha1,
                        ];
                        if ( $wgContentHandlerUseDB ) {