SOURCES: mysql-bug-13587.patch (NEW) - stored procedure crash fix

glen glen at pld-linux.org
Sat Nov 12 18:55:27 CET 2005


Author: glen                         Date: Sat Nov 12 17:55:27 2005 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- stored procedure crash fix

---- Files affected:
SOURCES:
   mysql-bug-13587.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/mysql-bug-13587.patch
diff -u /dev/null SOURCES/mysql-bug-13587.patch:1.1
--- /dev/null	Sat Nov 12 18:55:27 2005
+++ SOURCES/mysql-bug-13587.patch	Sat Nov 12 18:55:22 2005
@@ -0,0 +1,109 @@
+--- 1.506/sql/sql_parse.cc      2005-10-13 13:12:07 +04:00
++++ 1.507/sql/sql_parse.cc      2005-10-19 14:45:59 +04:00
+@@ -4068,6 +4068,19 @@
+ 
+     DBUG_ASSERT(lex->sphead != 0);
+ 
++    if (!lex->sphead->m_db.str || !lex->sphead->m_db.str[0])
++    {
++      if (! thd->db)
++      {
++        my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
++        delete lex->sphead;
++        lex->sphead= 0;
++        goto error;
++      }
++      lex->sphead->m_db.length= strlen(thd->db);
++      lex->sphead->m_db.str= thd->db;
++    }
++
+     if (check_access(thd, CREATE_PROC_ACL, lex->sphead->m_db.str, 0, 0, 0,
+                      is_schema_db(lex->sphead->m_db.str)))
+     {
+@@ -4077,13 +4090,10 @@
+     }
+ 
+     if (end_active_trans(thd)) 
+-      goto error;
+-
+-    if (!lex->sphead->m_db.str || !lex->sphead->m_db.str[0])
+     {
+-      lex->sphead->m_db.length= strlen(thd->db);
+-      lex->sphead->m_db.str= strmake_root(thd->mem_root, thd->db,
+-                                           lex->sphead->m_db.length);
++      delete lex->sphead;
++      lex->sphead= 0;
++      goto error;
+     }
+ 
+     name= lex->sphead->name(&namelen);
+@@ -4110,11 +4120,23 @@
+       goto error;
+     }
+ 
++    /*
++      We need to copy name and db in order to use them for
++      check_routine_access which is called after lex->sphead has
++      been deleted.
++    */
+     name= thd->strdup(name); 
+-    db= thd->strmake(lex->sphead->m_db.str, lex->sphead->m_db.length);
++    lex->sphead->m_db.str= db= thd->strmake(lex->sphead->m_db.str,
++                                            lex->sphead->m_db.length);
+     res= (result= lex->sphead->create(thd));
+     if (result == SP_OK)
+     {
++      /*
++        We must cleanup the unit and the lex here because
++        sp_grant_privileges calls (indirectly) db_find_routine,
++        which in turn may call yyparse with THD::lex.
++        TODO: fix db_find_routine to use a temporary lex.
++      */
+       lex->unit.cleanup();
+       delete lex->sphead;
+       lex->sphead= 0;
+
+--- 1.86/mysql-test/r/sp-error.result   2005-10-17 19:08:51 +04:00
++++ 1.87/mysql-test/r/sp-error.result   2005-10-19 14:45:59 +04:00
+@@ -872,3 +872,14 @@
+ foo4
+ drop procedure bug13510_3|
+ drop procedure bug13510_4|
++create database mysqltest1;
++use mysqltest1;
++drop database mysqltest1;
++create function f1() returns int return 1;
++ERROR 3D000: No database selected
++create procedure p1(out param1 int)
++begin
++select count(*) into param1 from t3;
++end|
++ERROR 3D000: No database selected
++use test;
+--- 1.90/mysql-test/t/sp-error.test     2005-10-17 19:08:54 +04:00
++++ 1.91/mysql-test/t/sp-error.test     2005-10-19 14:45:59 +04:00
+@@ -1266,6 +1266,24 @@
+ delimiter ;|
+ 
+ #
++# Bug#13514 "server crash when create a stored procedure before choose a
++# database" and
++# Bug#13587 "Server crash when SP is created without database
++# selected"
++#
++create database mysqltest1;
++use mysqltest1;
++drop database mysqltest1;
++--error ER_NO_DB_ERROR 
++create function f1() returns int return 1;
++delimiter |;
++--error ER_NO_DB_ERROR 
++create procedure p1(out param1 int)
++begin
++  select count(*) into param1 from t3;
++end|
++delimiter ;|
++use test;
+ # BUG#NNNN: New bug synopsis
+ #
+ #--disable_warnings
================================================================



More information about the pld-cvs-commit mailing list