mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
This is a patch for bug#41569.
"mysql_upgrade (ver 5.1) add 3 fields to mysql.proc table but does not set values". mysql_upgrade (ver 5.1) adds 3 fields (character_set_client, collation_connection and db_collation) to the mysql.proc table, but does not set any values. When we run stored procedures, which were created with mysql 5.0, a warning is logged into the error log. The solution to this is for mysql_upgrade to set default best guess values for these fields. A warning is also written during upgrade, to make the user aware that default values are set. client/mysql_upgrade.c: Result lines which start with "WARNING" are passed through to the output. This way we have a way of triggering WARNING-messages during upgrade directly from the .sql-script. mysql-test/r/mysql_upgrade.result: Expected result of the test. mysql-test/t/mysql_upgrade.test: Added a test-case for the bug. scripts/mysql_system_tables_fix.sql: The new fields are populated, and warnings are written.
This commit is contained in:
parent
2e8ad6bf64
commit
699a87110d
4 changed files with 93 additions and 0 deletions
|
@ -778,6 +778,10 @@ static int run_sql_fix_privilege_tables(void)
|
||||||
found_real_errors++;
|
found_real_errors++;
|
||||||
print_line(line);
|
print_line(line);
|
||||||
}
|
}
|
||||||
|
else if (strncmp(line, "WARNING", 7) == 0)
|
||||||
|
{
|
||||||
|
print_line(line);
|
||||||
|
}
|
||||||
} while ((line= get_line(line)) && *line);
|
} while ((line= get_line(line)) && *line);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -127,3 +127,45 @@ mysql.time_zone_transition OK
|
||||||
mysql.time_zone_transition_type OK
|
mysql.time_zone_transition_type OK
|
||||||
mysql.user OK
|
mysql.user OK
|
||||||
set GLOBAL sql_mode=default;
|
set GLOBAL sql_mode=default;
|
||||||
|
#
|
||||||
|
# Bug #41569 mysql_upgrade (ver 5.1) add 3 fields to mysql.proc table
|
||||||
|
# but does not set values.
|
||||||
|
#
|
||||||
|
CREATE PROCEDURE testproc() BEGIN END;
|
||||||
|
UPDATE mysql.proc SET character_set_client = NULL WHERE name LIKE 'testproc';
|
||||||
|
UPDATE mysql.proc SET collation_connection = NULL WHERE name LIKE 'testproc';
|
||||||
|
UPDATE mysql.proc SET db_collation = NULL WHERE name LIKE 'testproc';
|
||||||
|
WARNING: NULL values of the 'character_set_client' column ('mysql.proc' table) have been updated with a default value (latin1). Please verify if necessary.
|
||||||
|
WARNING: NULL values of the 'collation_connection' column ('mysql.proc' table) have been updated with a default value (latin1_swedish_ci). Please verify if necessary.
|
||||||
|
WARNING: NULL values of the 'db_collation' column ('mysql.proc' table) have been updated with default values. Please verify if necessary.
|
||||||
|
mtr.global_suppressions OK
|
||||||
|
mtr.test_suppressions OK
|
||||||
|
mysql.columns_priv OK
|
||||||
|
mysql.db OK
|
||||||
|
mysql.event OK
|
||||||
|
mysql.func OK
|
||||||
|
mysql.general_log
|
||||||
|
Error : You can't use locks with log tables.
|
||||||
|
status : OK
|
||||||
|
mysql.help_category OK
|
||||||
|
mysql.help_keyword OK
|
||||||
|
mysql.help_relation OK
|
||||||
|
mysql.help_topic OK
|
||||||
|
mysql.host OK
|
||||||
|
mysql.ndb_binlog_index OK
|
||||||
|
mysql.plugin OK
|
||||||
|
mysql.proc OK
|
||||||
|
mysql.procs_priv OK
|
||||||
|
mysql.servers OK
|
||||||
|
mysql.slow_log
|
||||||
|
Error : You can't use locks with log tables.
|
||||||
|
status : OK
|
||||||
|
mysql.tables_priv OK
|
||||||
|
mysql.time_zone OK
|
||||||
|
mysql.time_zone_leap_second OK
|
||||||
|
mysql.time_zone_name OK
|
||||||
|
mysql.time_zone_transition OK
|
||||||
|
mysql.time_zone_transition_type OK
|
||||||
|
mysql.user OK
|
||||||
|
CALL testproc();
|
||||||
|
DROP PROCEDURE testproc;
|
||||||
|
|
|
@ -89,3 +89,20 @@ DROP USER mysqltest1@'%';
|
||||||
set GLOBAL sql_mode='STRICT_ALL_TABLES,ANSI_QUOTES,NO_ZERO_DATE';
|
set GLOBAL sql_mode='STRICT_ALL_TABLES,ANSI_QUOTES,NO_ZERO_DATE';
|
||||||
--exec $MYSQL_UPGRADE --skip-verbose --force 2>&1
|
--exec $MYSQL_UPGRADE --skip-verbose --force 2>&1
|
||||||
eval set GLOBAL sql_mode=default;
|
eval set GLOBAL sql_mode=default;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug #41569 mysql_upgrade (ver 5.1) add 3 fields to mysql.proc table
|
||||||
|
--echo # but does not set values.
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
# Create a stored procedure and set the fields in question to null.
|
||||||
|
# When running mysql_upgrade, a warning should be written.
|
||||||
|
|
||||||
|
CREATE PROCEDURE testproc() BEGIN END;
|
||||||
|
UPDATE mysql.proc SET character_set_client = NULL WHERE name LIKE 'testproc';
|
||||||
|
UPDATE mysql.proc SET collation_connection = NULL WHERE name LIKE 'testproc';
|
||||||
|
UPDATE mysql.proc SET db_collation = NULL WHERE name LIKE 'testproc';
|
||||||
|
--exec $MYSQL_UPGRADE --skip-verbose --force 2>&1
|
||||||
|
CALL testproc();
|
||||||
|
DROP PROCEDURE testproc;
|
||||||
|
|
|
@ -415,18 +415,48 @@ ALTER TABLE proc ADD character_set_client
|
||||||
ALTER TABLE proc MODIFY character_set_client
|
ALTER TABLE proc MODIFY character_set_client
|
||||||
char(32) collate utf8_bin DEFAULT NULL;
|
char(32) collate utf8_bin DEFAULT NULL;
|
||||||
|
|
||||||
|
SELECT CASE WHEN COUNT(*) > 0 THEN
|
||||||
|
CONCAT ("WARNING: NULL values of the 'character_set_client' column ('mysql.proc' table) have been updated with a default value (", @@character_set_client, "). Please verify if necessary.")
|
||||||
|
ELSE NULL
|
||||||
|
END
|
||||||
|
AS value FROM proc WHERE character_set_client IS NULL;
|
||||||
|
|
||||||
|
UPDATE proc SET character_set_client = @@character_set_client
|
||||||
|
WHERE character_set_client IS NULL;
|
||||||
|
|
||||||
ALTER TABLE proc ADD collation_connection
|
ALTER TABLE proc ADD collation_connection
|
||||||
char(32) collate utf8_bin DEFAULT NULL
|
char(32) collate utf8_bin DEFAULT NULL
|
||||||
AFTER character_set_client;
|
AFTER character_set_client;
|
||||||
ALTER TABLE proc MODIFY collation_connection
|
ALTER TABLE proc MODIFY collation_connection
|
||||||
char(32) collate utf8_bin DEFAULT NULL;
|
char(32) collate utf8_bin DEFAULT NULL;
|
||||||
|
|
||||||
|
SELECT CASE WHEN COUNT(*) > 0 THEN
|
||||||
|
CONCAT ("WARNING: NULL values of the 'collation_connection' column ('mysql.proc' table) have been updated with a default value (", @@collation_connection, "). Please verify if necessary.")
|
||||||
|
ELSE NULL
|
||||||
|
END
|
||||||
|
AS value FROM proc WHERE collation_connection IS NULL;
|
||||||
|
|
||||||
|
UPDATE proc SET collation_connection = @@collation_connection
|
||||||
|
WHERE collation_connection IS NULL;
|
||||||
|
|
||||||
ALTER TABLE proc ADD db_collation
|
ALTER TABLE proc ADD db_collation
|
||||||
char(32) collate utf8_bin DEFAULT NULL
|
char(32) collate utf8_bin DEFAULT NULL
|
||||||
AFTER collation_connection;
|
AFTER collation_connection;
|
||||||
ALTER TABLE proc MODIFY db_collation
|
ALTER TABLE proc MODIFY db_collation
|
||||||
char(32) collate utf8_bin DEFAULT NULL;
|
char(32) collate utf8_bin DEFAULT NULL;
|
||||||
|
|
||||||
|
SELECT CASE WHEN COUNT(*) > 0 THEN
|
||||||
|
CONCAT ("WARNING: NULL values of the 'db_collation' column ('mysql.proc' table) have been updated with default values. Please verify if necessary.")
|
||||||
|
ELSE NULL
|
||||||
|
END
|
||||||
|
AS value FROM proc WHERE db_collation IS NULL;
|
||||||
|
|
||||||
|
UPDATE proc AS p SET db_collation =
|
||||||
|
( SELECT DEFAULT_COLLATION_NAME
|
||||||
|
FROM INFORMATION_SCHEMA.SCHEMATA
|
||||||
|
WHERE SCHEMA_NAME = p.db)
|
||||||
|
WHERE db_collation IS NULL;
|
||||||
|
|
||||||
ALTER TABLE proc ADD body_utf8 longblob DEFAULT NULL
|
ALTER TABLE proc ADD body_utf8 longblob DEFAULT NULL
|
||||||
AFTER db_collation;
|
AFTER db_collation;
|
||||||
ALTER TABLE proc MODIFY body_utf8 longblob DEFAULT NULL;
|
ALTER TABLE proc MODIFY body_utf8 longblob DEFAULT NULL;
|
||||||
|
|
Loading…
Reference in a new issue