mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +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++;
|
||||
print_line(line);
|
||||
}
|
||||
else if (strncmp(line, "WARNING", 7) == 0)
|
||||
{
|
||||
print_line(line);
|
||||
}
|
||||
} while ((line= get_line(line)) && *line);
|
||||
}
|
||||
|
||||
|
|
|
@ -127,3 +127,45 @@ mysql.time_zone_transition OK
|
|||
mysql.time_zone_transition_type OK
|
||||
mysql.user OK
|
||||
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';
|
||||
--exec $MYSQL_UPGRADE --skip-verbose --force 2>&1
|
||||
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
|
||||
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
|
||||
char(32) collate utf8_bin DEFAULT NULL
|
||||
AFTER character_set_client;
|
||||
ALTER TABLE proc MODIFY collation_connection
|
||||
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
|
||||
char(32) collate utf8_bin DEFAULT NULL
|
||||
AFTER collation_connection;
|
||||
ALTER TABLE proc MODIFY db_collation
|
||||
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
|
||||
AFTER db_collation;
|
||||
ALTER TABLE proc MODIFY body_utf8 longblob DEFAULT NULL;
|
||||
|
|
Loading…
Reference in a new issue