Stop accessing wcf1_tag_to_object.languageID during DELETE in TagEngine
authorTim Düsterhus <duesterhus@woltlab.com>
Wed, 27 Jan 2021 10:35:04 +0000 (11:35 +0100)
committerMatthias Schmidt <gravatronics@live.com>
Fri, 29 Jan 2021 15:49:31 +0000 (16:49 +0100)
This stops accessing the redundant `languageID` column that is functionally
dependent on the tagID (see #3803).

wcfsetup/install/files/lib/system/tagging/TagEngine.class.php

index f8961ee6f65bf95d48a61b1ba3fadc44433ebb0c..1a9e9aa05c4f13151521fc0c3a8a9f45753df9a9 100644 (file)
@@ -41,10 +41,13 @@ class TagEngine extends SingletonFactory
 
         // remove tags prior to apply the new ones (prevents duplicate entries)
         if ($replace) {
-            $sql = "DELETE FROM wcf" . WCF_N . "_tag_to_object
-                    WHERE       objectTypeID = ?
-                            AND objectID = ?
-                            AND languageID = ?";
+            $sql = "DELETE      tag_to_object
+                    FROM        wcf" . WCF_N . "_tag_to_object tag_to_object
+                    INNER JOIN  wcf" . WCF_N . "_tag tag
+                            ON  tag.tagID = tag_to_object.tagID
+                    WHERE       tag_to_object.objectTypeID = ?
+                            AND tag_to_object.objectID = ?
+                            AND tag.languageID = ?";
             $statement = WCF::getDB()->prepareStatement($sql);
             $statement->execute([
                 $objectTypeID,
@@ -111,10 +114,13 @@ class TagEngine extends SingletonFactory
     {
         $objectTypeID = $this->getObjectTypeID($objectType);
 
-        $sql = "DELETE FROM wcf" . WCF_N . "_tag_to_object
-                WHERE       objectTypeID = ?
-                        AND objectID = ?
-                        " . ($languageID !== null ? "AND languageID = ?" : "");
+        $sql = "DELETE      tag_to_object
+                FROM        wcf" . WCF_N . "_tag_to_object tag_to_object
+                INNER JOIN  wcf" . WCF_N . "_tag tag
+                        ON  tag.tagID = tag_to_object.tagID
+                WHERE       tag_to_object.objectTypeID = ?
+                        AND tag_to_object.objectID = ?
+                        " . ($languageID !== null ? "AND tag.languageID = ?" : "");
         $statement = WCF::getDB()->prepareStatement($sql);
         $parameters = [
             $objectTypeID,