Bug #72029 Case sensitive problem with routines (PROCEDURE/FUNCTION)
| Submitted: | 13 Mar 2014 6:55 | Modified: | 17 Mar 2014 19:29 |
|---|---|---|---|
| Reporter: | Guillermo Bonvehi | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: Information schema | Severity: | S2 (Serious) |
| Version: | 5.5.32, 5.6.16 | OS: | Linux |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | procedure case sensitive | ||
[13 Mar 2014 7:35]
Guillermo Bonvehi
When working with a case sensitive file-system, MySQL allows you to have a database with the same name in different cases (example TEST/test).
This works correctly.
However, procedures that are related to that database are stored inside information_schema.routines associated with ROUTINE_SCHEMA which is a case insensitive column.
This brings a problem, for example, when using mysqldump since when listing routines to dump in the line "SHOW %s STATUS WHERE Db = '%s'" it would bring procedures from other databases that have the same name with different case.
mysqldump could be modified to use mysql.proc instead which correctly has utf8_bin in the Db column, but I'm not sure that would be the best to go since this affects anyone using SHOW <P/F> STATUS.
CREATE DATABASE A;
USE A;
delimiter //
CREATE PROCEDURE simpleproc()
BEGIN
SELECT 1;
END//
delimiter ;
CREATE DATABASE a;
USE a;
SHOW PROCEDURE STATUS WHERE Db = 'a';
-- Incorrectly shows procedure from A
SELECT count(*) FROM mysql.proc WHERE Db='a';
-- Correctly show 0 results
DROP DATABASE A;
DROP DATABASE a;
Thanks again,
Guillermo Bonvehi
[13 Mar 2014 7:57]
Guillermo Bonvehi
Worse case, SHOW CREATE PROCEDURE shows incorrect procedure
Attachment: bug.72029.sql (application/octet-stream, text), 459 bytes.
[13 Mar 2014 8:25]
Guillermo Bonvehi
Calling procedures is also affected even specifying database
Attachment: bug.72029.callproc.sql (application/octet-stream, text), 538 bytes.
[13 Mar 2014 9:04]
Peter Laursen
See also the bug I reported at http://bugs.mysql.com/bug.php?id=71407
[14 Mar 2014 13:25]
Hartmut Holzgraefe
"mysqldump --routines A" will dump the procedure correctly, "mysqldump --routines a" will fail with: -- -- Dumping routines for database 'a' -- mysqldump: Couldn't execute 'SHOW CREATE PROCEDURE `simpleproc`': PROCEDURE simpleproc does not exist (1305)
[17 Mar 2014 19:29]
Sveta Smirnova
Thank you for the report. Verified as described: `mysqldump --routines a` fails
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.055 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: When working with a case sensitive file-system, MySQL allows you to have a database with the same name in different cases (example TEST/test). This works correctly. However, procedures that are related to that database are stored inside information_schema.routines associated with ROUTINE_SCHEMA which is a case insensitive column. This brings a problem, for example, when using mysqldump since when listing routines to dump in the line "SHOW %s STATUS WHERE Db = '%s'" it would bring procedures from other databases that have the same name with different case. Thanks, Guillermo Bonvehi How to repeat: CREATE DATABASE A; USE A; delimiter // CREATE PROCEDURE simpleproc() BEGIN SELECT 1; END// delimiter ; CREATE DATABASE a; USE a; SHOW PROCEDURE STATUS WHERE Db = 'a'; DROP DATABASE A; DROP DATABASE a; -- This should show none procedures for 'a'. Suggested fix: Make columns in information_schema which should be case aware use utf8_bin collation.