Bug #21568 SP: SHOW CREATE PROCEDURE says identifier too long, but the procedure exists
Submitted: 10 Aug 2006 15:59 Modified: 9 Apr 2007 10:01
Reporter: Andrey Hristov Email Updates:
Status: Duplicate Impact on me:
None 
Category:MySQL Server: Stored Routines Severity:S3 (Non-critical)
Version:5.0/5.1BK OS:Any (All)
Assigned to: Assigned Account CPU Architecture:Any

[10 Aug 2006 15:59] Andrey Hristov
Description:
While using names with non-latin1 characters, the name could go over the size of 64 bytes. While SP can be created with a name of 64 characters, even non-latin1. SHOW CREATE PROCEDURE does not like identifiers which are in length of size > than 64 _BYTES_. The following commands also have this problem:
SHOW CREATE FUNCTION
SHOW (PROCEDURE | FUNCTION) CODE 
This one ^^^ is accessible only in debug builds.

mysql> use test
Database changed
mysql> set names utf8;
Query OK, 0 rows affected (2.71 sec)

mysql> create procedure това_е_едно_доста_дълго_име_за_една_малка_процедура() select 123;
Query OK, 0 rows affected (3.05 sec)

mysql> show create procedure това_е_едно_доста_дълго_име_за_една_малка_процедура;
ERROR 1059 (42000): Identifier name 'това_е_едно_доста_дълго_име_за_една_малка_процедура' is too long

How to repeat:
use test
set names utf8;
create procedure това_е_едно_доста_дълго_име_за_една_малка_процедура() select 123;
show create procedure това_е_едно_доста_дълго_име_за_една_малка_процедура;

Suggested fix:
This is the faulty code 
 4674       if (lex->spname->m_name.length > NAME_LEN)
 4675       {
 4676         my_error(ER_TOO_LONG_IDENT, MYF(0), lex->spname->m_name.str);
 4677         goto error;
 4678       }

Has to be changed to:
if (system_charset_info->cset->numchars(system_charset_info,lex->spname->m_name.str,
                           lex->spname->m_name.str+sp->m_name.length) > NAME_LEN)
[10 Aug 2006 18:11] MySQL Verification Team
Thank you for the bug report.

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 5.0.25-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use test
Database changed
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> create procedure това_е_едно_доста_дълго_име_за_една_малка_прцедура() select 123;
Query OK, 0 rows affected (0.07 sec)

mysql> show create procedure това_е_едно_доста_дълго_име_за_една_малка_прцедура;
ERROR 1059 (42000): Identifier name 'това_е_едно_доста_дълго_име_за_една_малка_прцедура' is too long
mysql>

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 5.1.12-beta-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use test
Database changed
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> create procedure това_е_едно_доста_дълго_име_за_една_малка_прцедура() select 123;
Query OK, 0 rows affected (0.00 sec)

mysql> show create procedure това_е_едно_доста_дълго_име_за_една_малка_прцедура;
ERROR 1059 (42000): Identifier name 'това_е_едно_доста_дълго_име_за_една_малка_прцедура' is too long
mysql>
[9 Apr 2007 10:01] Alexander Nozdrin
This bug was fixed in the patch for
BUG#21432 (Database/Table name limited to 64 bytes,
not chars, problems with multi-byte).