From 3d21ef8dddd1dd432e438f2e980cbfbd33441263 Mon Sep 17 00:00:00 2001
From: Aaron Schulz <aschulz@wikimedia.org>
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 a 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

Change-Id: If3a74de13ea841d9d94ae05532cc8dadb0e40867
---
 includes/page/WikiPage.php | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/includes/page/WikiPage.php b/includes/page/WikiPage.php
index e1d9f99..26f8cb6 100644
--- a/includes/page/WikiPage.php
+++ b/includes/page/WikiPage.php
@@ -2912,9 +2912,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, [ 'rev_deleted' => $bitfield ] ),
 			[ 'rev_page' => $id ],
 			__METHOD__,
 			'FOR UPDATE'
@@ -2937,7 +2938,7 @@ class WikiPage implements Page, IDBAccessObject {
 				'ar_flags'      => '',
 				'ar_len'        => $row->rev_len,
 				'ar_page_id'    => $id,
-				'ar_deleted'    => $bitfield,
+				'ar_deleted'    => $row->rev_deleted,
 				'ar_sha1'       => $row->rev_sha1,
 			];
 			if ( $wgContentHandlerUseDB ) {
-- 
2.8.3.windows.1

