Merge "Add SPARQL client to core"
[lhc/web/wiklou.git] / includes / changetags / ChangeTags.php
index db1f599..7e4dd00 100644 (file)
@@ -135,7 +135,7 @@ class ChangeTags {
         * exists, provided it is not disabled. If the message is disabled,
         * we consider the tag hidden, and return false.
         *
-        * @param string $tag Tag
+        * @param string $tag
         * @param IContextSource $context
         * @return string|bool Tag description or false if tag is to be hidden.
         * @since 1.25 Returns false if tag is to be hidden.
@@ -162,7 +162,7 @@ class ChangeTags {
         * or if message is disabled, returns false. Otherwise, returns the message object
         * for the long description.
         *
-        * @param string $tag Tag
+        * @param string $tag
         * @param IContextSource $context
         * @return Message|bool Message object of the tag long description or false if
         *  there is no description.
@@ -408,19 +408,24 @@ class ChangeTags {
                sort( $prevTags );
                sort( $newTags );
                if ( $prevTags == $newTags ) {
-                       // No change.
                        return false;
                }
 
                if ( !$newTags ) {
-                       // no tags left, so delete the row altogether
+                       // No tags left, so delete the row altogether
                        $dbw->delete( 'tag_summary', $tsConds, __METHOD__ );
                } else {
-                       $dbw->replace( 'tag_summary',
-                               [ 'ts_rev_id', 'ts_rc_id', 'ts_log_id' ],
-                               array_filter( array_merge( $tsConds, [ 'ts_tags' => implode( ',', $newTags ) ] ) ),
-                               __METHOD__
-                       );
+                       // Specify the non-DEFAULT value columns in the INSERT/REPLACE clause
+                       $row = array_filter( [ 'ts_tags' => implode( ',', $newTags ) ] + $tsConds );
+                       // Check the unique keys for conflicts, ignoring any NULL *_id values
+                       $uniqueKeys = [];
+                       foreach ( [ 'ts_rev_id', 'ts_rc_id', 'ts_log_id' ] as $uniqueColumn ) {
+                               if ( isset( $row[$uniqueColumn] ) ) {
+                                       $uniqueKeys[] = [ $uniqueColumn ];
+                               }
+                       }
+
+                       $dbw->replace( 'tag_summary', $uniqueKeys, $row, __METHOD__ );
                }
 
                return true;