Blob Blame Raw
From 5893fde69518d70904d2b96e13800c7432b4e4c4 Mon Sep 17 00:00:00 2001
From: Maik Qualmann <metzpinguin@gmail.com>
Date: Mon, 15 Jan 2018 20:24:41 +0100
Subject: [PATCH 04/32] fix schema update from V7/8 to V9 with temporary tables
 BUGS: 388977 BUGS: 388867 BUGS: 388824 FIXED-IN: 5.9.0

---
 NEWS                                |   6 +-
 data/database/dbconfig.xml.cmake.in | 154 +++++++++++++++++++++++++++++-------
 2 files changed, 128 insertions(+), 32 deletions(-)

diff --git a/data/database/dbconfig.xml.cmake.in b/data/database/dbconfig.xml.cmake.in
index a315361218..2c5008fe38 100644
--- a/data/database/dbconfig.xml.cmake.in
+++ b/data/database/dbconfig.xml.cmake.in
@@ -1992,8 +1992,6 @@
                         END IF;
                     END;
                 </statement>
-                <statement mode="plain">SET SESSION OLD_ALTER_TABLE=1;</statement>
-                <statement mode="plain">SET SESSION FOREIGN_KEY_CHECKS=0;</statement>
                 <statement mode="plain">DROP TRIGGER IF EXISTS delete_image;</statement>
                 <statement mode="plain">DROP TRIGGER IF EXISTS delete_tag;</statement>
                 <statement mode="plain">DROP TRIGGER IF EXISTS move_tagstree;</statement>
@@ -2064,85 +2062,181 @@
                 <statement mode="plain">ALTER TABLE TagProperties MODIFY COLUMN value LONGTEXT CHARACTER SET utf8 COLLATE utf8_general_ci;</statement>
                 <statement mode="plain">ALTER TABLE ImageTagProperties MODIFY COLUMN property TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;</statement>
                 <statement mode="plain">ALTER TABLE ImageTagProperties MODIFY COLUMN value LONGTEXT CHARACTER SET utf8 COLLATE utf8_general_ci;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE AlbumRoots
+
+                <statement mode="plain">RENAME TABLE AlbumRoots TO AlbumRoots_old;</statement>
+                <statement mode="plain">CREATE TABLE AlbumRoots LIKE AlbumRoots_old;</statement>
+                <statement mode="plain">ALTER TABLE AlbumRoots
                                         ADD UNIQUE (identifier(127), specificPath(128)),
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE Albums
+                <statement mode="plain">INSERT IGNORE INTO AlbumRoots SELECT * FROM AlbumRoots_old;</statement>
+
+                <statement mode="plain">RENAME TABLE Albums TO Albums_old;</statement>
+                <statement mode="plain">CREATE TABLE Albums LIKE Albums_old;</statement>
+                <statement mode="plain">ALTER TABLE Albums
                                         ADD CONSTRAINT Albums_AlbumRoots FOREIGN KEY (albumRoot) REFERENCES AlbumRoots (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ADD UNIQUE (albumRoot, relativePath(255)),
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE Images
+                <statement mode="plain">INSERT IGNORE INTO Albums SELECT * FROM Albums_old;</statement>
+                <statement mode="plain">UPDATE Albums SET icon = NULL WHERE icon = 0;</statement>
+
+                <statement mode="plain">RENAME TABLE Images TO Images_old;</statement>
+                <statement mode="plain">CREATE TABLE Images LIKE Images_old;</statement>
+                <statement mode="plain">ALTER TABLE Images
                                         ADD CONSTRAINT Images_Albums FOREIGN KEY (album) REFERENCES Albums (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ADD UNIQUE (album, name(255)),
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">UPDATE Albums SET icon = NULL WHERE icon = 0;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE Albums
+                <statement mode="plain">INSERT IGNORE INTO Images SELECT * FROM Images_old;</statement>
+
+                <statement mode="plain">ALTER TABLE Albums
                                         ADD CONSTRAINT Albums_Images FOREIGN KEY (icon) REFERENCES Images (id) ON DELETE SET NULL ON UPDATE CASCADE;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE ImageHaarMatrix
+
+                <statement mode="plain">RENAME TABLE ImageHaarMatrix TO ImageHaarMatrix_old;</statement>
+                <statement mode="plain">CREATE TABLE ImageHaarMatrix LIKE ImageHaarMatrix_old;</statement>
+                <statement mode="plain">ALTER TABLE ImageHaarMatrix
                                         ADD CONSTRAINT ImageHaarMatrix_Images FOREIGN KEY (imageid) REFERENCES Images (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE ImageInformation
+                <statement mode="plain">INSERT IGNORE INTO ImageHaarMatrix SELECT * FROM ImageHaarMatrix_old;</statement>
+
+                <statement mode="plain">RENAME TABLE ImageInformation TO ImageInformation_old;</statement>
+                <statement mode="plain">CREATE TABLE ImageInformation LIKE ImageInformation_old;</statement>
+                <statement mode="plain">ALTER TABLE ImageInformation
                                         ADD CONSTRAINT ImageInformation_Images FOREIGN KEY (imageid) REFERENCES Images (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE ImageMetadata
+                <statement mode="plain">INSERT IGNORE INTO ImageInformation SELECT * FROM ImageInformation_old;</statement>
+
+                <statement mode="plain">RENAME TABLE ImageMetadata TO ImageMetadata_old;</statement>
+                <statement mode="plain">CREATE TABLE ImageMetadata LIKE ImageMetadata_old;</statement>
+                <statement mode="plain">ALTER TABLE ImageMetadata
                                         ADD CONSTRAINT ImageMetadata_Images FOREIGN KEY (imageid) REFERENCES Images (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE VideoMetadata
+                <statement mode="plain">INSERT IGNORE INTO ImageMetadata SELECT * FROM ImageMetadata_old;</statement>
+
+                <statement mode="plain">RENAME TABLE VideoMetadata TO VideoMetadata_old;</statement>
+                <statement mode="plain">CREATE TABLE VideoMetadata LIKE VideoMetadata_old;</statement>
+                <statement mode="plain">ALTER TABLE VideoMetadata
                                         ADD CONSTRAINT VideoMetadata_Images FOREIGN KEY (imageid) REFERENCES Images (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE ImagePositions
+                <statement mode="plain">INSERT IGNORE INTO VideoMetadata SELECT * FROM VideoMetadata_old;</statement>
+
+                <statement mode="plain">RENAME TABLE ImagePositions TO ImagePositions_old;</statement>
+                <statement mode="plain">CREATE TABLE ImagePositions LIKE ImagePositions_old;</statement>
+                <statement mode="plain">ALTER TABLE ImagePositions
                                         ADD CONSTRAINT ImagePositions_Images FOREIGN KEY (imageid) REFERENCES Images (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE ImageComments
+                <statement mode="plain">INSERT IGNORE INTO ImagePositions SELECT * FROM ImagePositions_old;</statement>
+
+                <statement mode="plain">RENAME TABLE ImageComments TO ImageComments_old;</statement>
+                <statement mode="plain">CREATE TABLE ImageComments LIKE ImageComments_old;</statement>
+                <statement mode="plain">ALTER TABLE ImageComments
                                         ADD CONSTRAINT ImageComments_Images FOREIGN KEY (imageid) REFERENCES Images (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ADD UNIQUE(imageid, type, language, author(202)),
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE ImageCopyright
+                <statement mode="plain">INSERT IGNORE INTO ImageComments SELECT * FROM ImageComments_old;</statement>
+
+                <statement mode="plain">RENAME TABLE ImageCopyright TO ImageCopyright_old;</statement>
+                <statement mode="plain">CREATE TABLE ImageCopyright LIKE ImageCopyright_old;</statement>
+                <statement mode="plain">ALTER TABLE ImageCopyright
                                         ADD CONSTRAINT ImageCopyright_Images FOREIGN KEY (imageid) REFERENCES Images (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ADD UNIQUE(imageid, property(110), value(111), extraValue(111)),
                                         ENGINE InnoDB;</statement>
+                <statement mode="plain">INSERT IGNORE INTO ImageCopyright SELECT * FROM ImageCopyright_old;</statement>
+
+                <statement mode="plain">RENAME TABLE Tags TO Tags_old;</statement>
+                <statement mode="plain">CREATE TABLE Tags LIKE Tags_old;</statement>
+                <statement mode="plain">ALTER TABLE Tags
+                                        ADD CONSTRAINT Tags_Images FOREIGN KEY (icon) REFERENCES Images (id) ON DELETE SET NULL ON UPDATE CASCADE,
+                                        ADD UNIQUE(pid, name(100)),
+                                        ENGINE InnoDB;</statement>
+                <statement mode="plain">INSERT IGNORE INTO Tags SELECT * FROM Tags_old;</statement>
                 <statement mode="plain">SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO';</statement>
                 <statement mode="plain">REPLACE INTO Tags (id, pid, name, icon, iconkde, lft, rgt) VALUES (0, -1, '_Digikam_root_tag_', NULL, NULL,
                                         (SELECT MIN(tl.lft) FROM Tags AS tl),
                                         (SELECT MAX(tr.rgt) FROM Tags AS tr));</statement>
                 <statement mode="plain">SET SQL_MODE=@OLD_SQL_MODE;</statement>
-                <statement mode="plain">UPDATE Tags set icon = NULL WHERE icon = 0;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE Tags
-                                        ADD CONSTRAINT Tags_Images FOREIGN KEY (icon) REFERENCES Images (id) ON DELETE SET NULL ON UPDATE CASCADE,
-                                        ADD UNIQUE(pid, name(100)),
-                                        ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE ImageTags
+                <statement mode="plain">UPDATE Tags SET icon = NULL WHERE icon = 0;</statement>
+
+                <statement mode="plain">RENAME TABLE ImageTags TO ImageTags_old;</statement>
+                <statement mode="plain">CREATE TABLE ImageTags LIKE ImageTags_old;</statement>
+                <statement mode="plain">ALTER TABLE ImageTags
                                         ADD CONSTRAINT ImageTags_Images FOREIGN KEY (imageid) REFERENCES Images (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ADD CONSTRAINT ImageTags_Tags FOREIGN KEY (tagid) REFERENCES Tags (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE ImageProperties
+                <statement mode="plain">INSERT IGNORE INTO ImageTags SELECT * FROM ImageTags_old;</statement>
+
+                <statement mode="plain">RENAME TABLE ImageProperties TO ImageProperties_old;</statement>
+                <statement mode="plain">CREATE TABLE ImageProperties LIKE ImageProperties_old;</statement>
+                <statement mode="plain">ALTER TABLE ImageProperties
                                         ADD CONSTRAINT ImageProperties_Images FOREIGN KEY (imageid) REFERENCES Images (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ADD UNIQUE (imageid, property(255)),
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE Searches
+                <statement mode="plain">INSERT IGNORE INTO ImageProperties SELECT * FROM ImageProperties_old;</statement>
+
+                <statement mode="plain">ALTER TABLE Searches
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE DownloadHistory
+
+                <statement mode="plain">RENAME TABLE DownloadHistory TO DownloadHistory_old;</statement>
+                <statement mode="plain">CREATE TABLE DownloadHistory LIKE DownloadHistory_old;</statement>
+                <statement mode="plain">ALTER TABLE DownloadHistory
                                         ADD UNIQUE(identifier(164), filename(165), filesize, filedate),
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE Settings
+                <statement mode="plain">INSERT IGNORE INTO DownloadHistory SELECT * FROM DownloadHistory_old;</statement>
+
+                <statement mode="plain">RENAME TABLE Settings TO Settings_old;</statement>
+                <statement mode="plain">CREATE TABLE Settings LIKE Settings_old;</statement>
+                <statement mode="plain">ALTER TABLE Settings
                                         ADD UNIQUE(keyword(255)),
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE ImageHistory
+                <statement mode="plain">INSERT IGNORE INTO Settings SELECT * FROM Settings_old;</statement>
+
+                <statement mode="plain">RENAME TABLE ImageHistory TO ImageHistory_old;</statement>
+                <statement mode="plain">CREATE TABLE ImageHistory LIKE ImageHistory_old;</statement>
+                <statement mode="plain">ALTER TABLE ImageHistory
                                         ADD CONSTRAINT ImageHistory_Images FOREIGN KEY (imageid) REFERENCES Images (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE ImageRelations
+                <statement mode="plain">INSERT IGNORE INTO ImageHistory SELECT * FROM ImageHistory_old;</statement>
+
+                <statement mode="plain">RENAME TABLE ImageRelations TO ImageRelations_old;</statement>
+                <statement mode="plain">CREATE TABLE ImageRelations LIKE ImageRelations_old;</statement>
+                <statement mode="plain">ALTER TABLE ImageRelations
                                         ADD CONSTRAINT ImageRelations_ImagesS FOREIGN KEY (subject) REFERENCES Images (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ADD CONSTRAINT ImageRelations_ImagesO FOREIGN KEY (object) REFERENCES Images (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE TagProperties
+                <statement mode="plain">INSERT IGNORE INTO ImageRelations SELECT * FROM ImageRelations_old;</statement>
+
+                <statement mode="plain">RENAME TABLE TagProperties TO TagProperties_old;</statement>
+                <statement mode="plain">CREATE TABLE TagProperties LIKE TagProperties_old;</statement>
+                <statement mode="plain">ALTER TABLE TagProperties
                                         ADD CONSTRAINT TagProperties_Tags FOREIGN KEY (tagid) REFERENCES Tags (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">ALTER IGNORE TABLE ImageTagProperties
+                <statement mode="plain">INSERT IGNORE INTO TagProperties SELECT * FROM TagProperties_old;</statement>
+
+                <statement mode="plain">RENAME TABLE ImageTagProperties TO ImageTagProperties_old;</statement>
+                <statement mode="plain">CREATE TABLE ImageTagProperties LIKE ImageTagProperties_old;</statement>
+                <statement mode="plain">ALTER TABLE ImageTagProperties
                                         ADD CONSTRAINT ImageTagProperties_Images FOREIGN KEY (imageid) REFERENCES Images (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ADD CONSTRAINT ImageTagProperties_Tags FOREIGN KEY (tagid) REFERENCES Tags (id) ON DELETE CASCADE ON UPDATE CASCADE,
                                         ENGINE InnoDB;</statement>
-                <statement mode="plain">SET SESSION FOREIGN_KEY_CHECKS=1;</statement>
-                <statement mode="plain">SET SESSION OLD_ALTER_TABLE=0;</statement>
+                <statement mode="plain">INSERT IGNORE INTO ImageTagProperties SELECT * FROM ImageTagProperties_old;</statement>
+
+                <statement mode="plain">DROP TABLE ImageTagProperties_old;</statement>
+                <statement mode="plain">DROP TABLE TagProperties_old;</statement>
+                <statement mode="plain">DROP TABLE ImageRelations_old;</statement>
+                <statement mode="plain">DROP TABLE ImageHistory_old;</statement>
+                <statement mode="plain">DROP TABLE Settings_old;</statement>
+                <statement mode="plain">DROP TABLE DownloadHistory_old;</statement>
+                <statement mode="plain">DROP TABLE ImageProperties_old;</statement>
+                <statement mode="plain">DROP TABLE ImageTags_old;</statement>
+                <statement mode="plain">DROP TABLE Tags_old;</statement>
+                <statement mode="plain">DROP TABLE ImageCopyright_old;</statement>
+                <statement mode="plain">DROP TABLE ImageComments_old;</statement>
+                <statement mode="plain">DROP TABLE ImagePositions_old;</statement>
+                <statement mode="plain">DROP TABLE VideoMetadata_old;</statement>
+                <statement mode="plain">DROP TABLE ImageMetadata_old;</statement>
+                <statement mode="plain">DROP TABLE ImageInformation_old;</statement>
+                <statement mode="plain">DROP TABLE ImageHaarMatrix_old;</statement>
+                <statement mode="plain">DROP TABLE Images_old;</statement>
+                <statement mode="plain">DROP TABLE Albums_old;</statement>
+                <statement mode="plain">DROP TABLE AlbumRoots_old;</statement>
             </dbaction>
 
             <dbaction name="UpdateThumbnailsDBSchemaFromV1ToV2" mode="transaction">
-- 
2.14.3