Description:
When
1. lower_case_table_names = 0
2. There are databases with same name in different case
3. Those two DB contain stored procedure with the same name,
the same procedure would be called no matter which DB name is called.
For example, if we create database db1 and DB1, stored procedure db1.p1 and DB1.p1, db1.p1 will be called by both `call db1.p1();` and `call DB1.p1();`
How to repeat:
mysql> show variables like "%char%";
+--------------------------+----------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------------------------------+
| by_expr_ignore_charset | OFF |
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /disk1/ziqian.fzq/code/installed_polar/current/share/charsets/ |
+--------------------------+----------------------------------------------------------------+
9 rows in set (0.02 sec)
mysql> show variables like "%collation%";
+-------------------------------+--------------------+
| Variable_name | Value |
+-------------------------------+--------------------+
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database | utf8mb4_0900_ai_ci |
| collation_server | utf8mb4_0900_ai_ci |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+
4 rows in set (0.02 sec)
mysql> show variables like "lower_case_table_names";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_table_names | 0 |
+------------------------+-------+
1 row in set (0.02 sec)
mysql> create database db1;
Query OK, 1 row affected (0.12 sec)
mysql> use db1;
Database changed
mysql> delimiter $$
mysql> create procedure p1()
-> begin
-> select "db1.p1";
-> end $$
Query OK, 0 rows affected (0.04 sec)
mysql> delimiter ;
mysql> create database DB1;
Query OK, 1 row affected (0.11 sec)
mysql> use DB1;
Database changed
mysql> delimiter $$
mysql> create procedure p1()
-> begin
-> select "DB1.p1";
-> end $$
Query OK, 0 rows affected (0.05 sec)
mysql> delimiter ;
mysql> call db1.p1();
+--------+
| db1.p1 |
+--------+
| db1.p1 |
+--------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> call DB1.p1();
+--------+
| db1.p1 |
+--------+
| db1.p1 |
+--------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Suggested fix:
Stored procedure is stored in an unordered_map in sp_cache. No matter which value lower_case_table_names is, the key is a string whose collation is utf8_general_ci. Therefore, the stored procedure cannot be found correctly.