]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#1698] MySQL upgrade 9.6: a more simpler check
authorAndrei Pavel <andrei@isc.org>
Mon, 22 Feb 2021 15:32:20 +0000 (17:32 +0200)
committerAndrei Pavel <andrei@isc.org>
Mon, 22 Feb 2021 15:58:31 +0000 (17:58 +0200)
use a simpler select to check for column existence rather than
functions and procedures that may wind up in the database after the upgrade

src/share/database/scripts/mysql/dhcpdb_create.mysql
src/share/database/scripts/mysql/upgrade_9.5_to_9.6.sh.in

index 06edf336a8c2d1ad13f29fe7308d688dc1044088..b7b9173c32967846e236f1c21781259e6bf66939 100644 (file)
@@ -3077,12 +3077,6 @@ ALTER TABLE dhcp6_shared_network
     ADD COLUMN cache_threshold FLOAT DEFAULT NULL,
     ADD COLUMN cache_max_age INT(10) DEFAULT NULL;
 
-# Update the schema version number.
-UPDATE schema_version
-    SET version = '9', minor = '6';
-
-# This line concludes database upgrade to version 9.6.
-
 # Add an auto-increment ID as primary key to support Percona.
 ALTER TABLE logs
     ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY;
index b808e51b545591bd7e80e2c13499cec3b2c4e984..717730b40bfcc17396767c3dfb60fb89c52d04b2 100644 (file)
@@ -25,64 +25,39 @@ else
     . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
 fi
 
-version=$(mysql_version "$@")
-
+# Check version.
+version=$(mysql_version "${@}")
 if test "${version}" != "9.5"; then
     printf 'This script upgrades 9.5 to 9.6. '
     printf 'Reported version is %s. Skipping upgrade.\n' "${version}"
     exit 0
 fi
 
-mysql "$@" <<EOF
-# Temporary function to check if column exists.
-CREATE FUNCTION columnExists(table_name_parameter TEXT, column_name_parameter TEXT)
-RETURNS INT
-RETURN (
-  SELECT COUNT(column_name)
-  FROM information_schema.columns
-  WHERE table_schema = DATABASE()
-  AND table_name = table_name_parameter
-  AND column_name = column_name_parameter
-);
+# Add column only if it doesn't exist to work around the 1.9.4 leak of
+# cache_threshold and cache_max_age column alters in subnet and shared network
+# tables in schema version 9.5.
+if ! mysql "${@}" -e 'SELECT cache_threshold FROM dhcp4_subnet LIMIT 1' &> /dev/null; then
+    mysql "${@}" <<EOF
+# Add new lease cache parameters.
+ALTER TABLE dhcp4_subnet
+    ADD COLUMN cache_threshold FLOAT DEFAULT NULL,
+    ADD COLUMN cache_max_age INT(10) DEFAULT NULL;
 
-# Temporary procedure to add column only if it doesn't exist to work around the
-# 1.9.4 leak of cache_threshold and cache_max_age column alters in subnet and
-# shared network tables in schema version 9.5.
-DELIMITER $$
-CREATE PROCEDURE addColumnIfNotExists(
-  IN table_name TEXT,
-  IN column_name TEXT,
-  IN definition TEXT
-)
-BEGIN
-  SET @exists := columnExists(table_name, column_name);
-  IF (@exists = 0) THEN
-    SET @alter = CONCAT('ALTER TABLE ', table_name);
-    SET @alter = CONCAT(@alter, ' ', 'ADD COLUMN') ;
-    SET @alter = CONCAT(@alter, ' ', column_name);
-    SET @alter = CONCAT(@alter, ' ', definition);
-    PREPARE statement FROM @alter;
-    EXECUTE statement;
-    DEALLOCATE PREPARE statement;
-  END IF;
-END;
-$$
-DELIMITER ;
+ALTER TABLE dhcp4_shared_network
+    ADD COLUMN cache_threshold FLOAT DEFAULT NULL,
+    ADD COLUMN cache_max_age INT(10) DEFAULT NULL;
 
-# Add new lease cache parameters.
-CALL addColumnIfNotExists('dhcp4_subnet', 'cache_threshold', 'FLOAT DEFAULT NULL');
-CALL addColumnIfNotExists('dhcp4_subnet', 'cache_max_age', 'INT(10) DEFAULT NULL');
-CALL addColumnIfNotExists('dhcp4_shared_network', 'cache_threshold', 'FLOAT DEFAULT NULL');
-CALL addColumnIfNotExists('dhcp4_shared_network', 'cache_max_age', 'INT(10) DEFAULT NULL');
-CALL addColumnIfNotExists('dhcp6_subnet', 'cache_threshold', 'FLOAT DEFAULT NULL');
-CALL addColumnIfNotExists('dhcp6_subnet', 'cache_max_age', 'INT(10) DEFAULT NULL');
-CALL addColumnIfNotExists('dhcp6_shared_network', 'cache_threshold', 'FLOAT DEFAULT NULL');
-CALL addColumnIfNotExists('dhcp6_shared_network', 'cache_max_age', 'INT(10) DEFAULT NULL');
+ALTER TABLE dhcp6_subnet
+    ADD COLUMN cache_threshold FLOAT DEFAULT NULL,
+    ADD COLUMN cache_max_age INT(10) DEFAULT NULL;
 
-# Clean up.
-DROP FUNCTION columnExists;
-DROP PROCEDURE addColumnIfNotExists;
+ALTER TABLE dhcp6_shared_network
+    ADD COLUMN cache_threshold FLOAT DEFAULT NULL,
+    ADD COLUMN cache_max_age INT(10) DEFAULT NULL;
+EOF
+fi
 
+mysql "${@}" <<EOF
 # Add an auto-increment ID as primary key to support Percona.
 ALTER TABLE logs
     ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY;