From 37812d7184fa2ad6fa4fc6194827785d5503f80e Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Thu, 1 Sep 2016 05:42:01 -0700 Subject: [PATCH] Fix deletion handling of rev_deleted 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 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/includes/page/WikiPage.php b/includes/page/WikiPage.php index e1d9f99ed6..54596298a5 100644 --- a/includes/page/WikiPage.php +++ b/includes/page/WikiPage.php @@ -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 ) { -- 2.20.1