Bug #12953 Stored procedures: crash if OPTIMIZE TABLE in function
Submitted: 2 Sep 2005 18:46 Modified: 9 Sep 2005 20:45
Reporter: Peter Gulutzan
Status: Closed
Category:Server Severity:S3 (Non-critical)
Version:5.0.13-beta-debug OS:Linux (SUSE 9.2)
Assigned to: Alexander Nozdrin Target Version:

[2 Sep 2005 18:46] Peter Gulutzan
Description:
MySQL allows me to say "OPTIMIZE TABLE" in a function.
Calling the function causes "Malformed packet" error,
then crash.

How to repeat:
mysql> delimiter //

mysql> create table t4 (s1 int)//
Query OK, 0 rows affected (0.01 sec)

mysql> create function f4 () returns int begin optimize tables t4; return 1; end//
Query OK, 0 rows affected (0.00 sec)

mysql> select f4()//
ERROR 2027 (HY000): Malformed packet
mysql> select f4()//
ERROR 2006 (HY000): MySQL server has gone away
[2 Sep 2005 19:00] Miguel Solorzano
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.0.13-beta-debug

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

mysql> delimiter //
mysql> create table t4 (s1 int)//
Query OK, 0 rows affected (0.04 sec)

mysql> optimize tables t4;
    -> //
+---------+----------+----------+-----------------------------+
| Table   | Op       | Msg_type | Msg_text                    |
+---------+----------+----------+-----------------------------+
| test.t4 | optimize | status   | Table is already up to date |
+---------+----------+----------+-----------------------------+
1 row in set (0.00 sec)

mysql> create function f4 () returns int begin optimize tables t4; return 1;
    -> end//
Query OK, 0 rows affected (0.02 sec)

mysql> select f4()//
ERROR 2027 (HY000): Malformed packet
mysql> select f4()//
Packets out of order (Found: 5, expected 1)
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> 

050902 14:00:52 [Note] /home/miguel/dbs/5.0/libexec/mysqld: ready for connections.
Version: '5.0.13-beta-debug'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution
[New Thread 1132456880 (LWP 7091)]
mysqld: protocol.cc:833: virtual bool Protocol_simple::store_long(long long int):
Assertion `field_types == 0 || field_types[field_pos] == MYSQL_TYPE_INT24 ||
field_types[field_pos] == MYSQL_TYPE_LONG' failed.

Program received signal SIGABRT, Aborted.
[Switching to Thread 1132456880 (LWP 7091)]
0xffffe410 in ?? ()
(gdb)
[5 Sep 2005 14:03] Andrey Hristov
So the problem really is to forbid the usage of OPTIMIZE TABLE inside a function. Also
ANALYZE TABLE & co. The problem is that when f4() is executed the Protocol instance is
modified because data is sent back to the client which corrupts the packet and where the
exception is raised field_pos is 4, not 0, thus referencing non-initialized memory.
[6 Sep 2005 20:52] Alexander Nozdrin
Fixed in 5.0 tree, currently tagged 5.0.13
[9 Sep 2005 20:45] Paul DuBois
Noted in 5.0.13 changelog.
[20 Oct 12:47] ambuj kumar
abc

Attachment: MySQL-Stored-Procedures.pdf (application/pdf, text), 332.63 KiB.