Commit 1c677f8c authored by unknown's avatar unknown
Browse files

Fixes bug #14569. When no db is selected as current and we do create procedure db.sp()...

we changing current db temporarily and restore it when sp is created. however thd->db
in this case becomes empty string rather than NULL and so all checks of thd->db == NULL 
will be false. So if after this we'll issue create procedure sp2()... without specifying
db it will succeed and create sp with db=NULL, which causes mysqldto crash on 
show procedure status statement.

This patch fixes the problem.


mysql-test/r/sp-error.result:
  Result for bug #14569.
mysql-test/t/sp-error.test:
  Test for bug #14569.
sql/sql_db.cc:
  Fixes bug #14569. When no db is selected as current and we do create procedure db.sp()...
  we changing current db temporarily and restore it when sp is created. however thd->db
  in this case becomes empty string rather than NULL and so all checks of thd->db == NULL 
  will be false. This patch fixes this issue.
sql/sql_parse.cc:
  Fixes bug #14569. Reverted from initial patch to check thd->db for null values only.
parent cb384116
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -916,3 +916,16 @@ ERROR 42S22: Unknown column 'bug13037_foo' in 'field list'
DROP PROCEDURE bug13037_p1;
DROP PROCEDURE bug13037_p2;
DROP PROCEDURE bug13037_p3;
create database mysqltest1;
create database mysqltest2;
use mysqltest1;
drop database mysqltest1;
create procedure mysqltest2.p1() select version();
create procedure p2() select version();
ERROR 3D000: No database selected
use mysqltest2;
show procedure status;
Db	Name	Type	Definer	Modified	Created	Security_type	Comment
mysqltest2	p1	PROCEDURE	root@localhost	0000-00-00 00:00:00	0000-00-00 00:00:00	DEFINER	
drop database mysqltest2;
use test;
+16 −0
Original line number Diff line number Diff line
@@ -1337,6 +1337,22 @@ DROP PROCEDURE bug13037_p1;
DROP PROCEDURE bug13037_p2;
DROP PROCEDURE bug13037_p3;

#
# Bug#14569 "editing a stored procedure kills mysqld-nt"
#
create database mysqltest1;
create database mysqltest2;
use mysqltest1;
drop database mysqltest1;
create procedure mysqltest2.p1() select version();
--error ER_NO_DB_ERROR 
create procedure p2() select version();
use mysqltest2;
--replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
show procedure status;
drop database mysqltest2;
use test;


# BUG#NNNN: New bug synopsis
#
+11 −2
Original line number Diff line number Diff line
@@ -1163,8 +1163,17 @@ bool mysql_change_db(THD *thd, const char *name, bool no_access_check)
  }
end:
  x_free(thd->db);
  if (dbname && dbname[0] == 0)
  {
    x_free(dbname);
    thd->db= NULL;
    thd->db_length= 0;
  }
  else
  {
    thd->db= dbname;				// THD::~THD will free this
    thd->db_length= db_length;
  }
#ifndef NO_EMBEDDED_ACCESS_CHECKS
  if (!no_access_check)
    sctx->db_access= db_access;
+1 −1
Original line number Diff line number Diff line
@@ -4099,7 +4099,7 @@ mysql_execute_command(THD *thd)

    if (!lex->sphead->m_db.str || !lex->sphead->m_db.str[0])
    {
      if (!thd->db || thd->db[0] == 0)
      if (!thd->db)
      {
        my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
        delete lex->sphead;