Commit 385b4bf7 authored by Marc Alff's avatar Marc Alff

Manual merge of mysql-5.0-bugteam -> mysql-5.1-bugteam

Note: NULL merge of sql/sql_yacc.yy, the fix for bug#38296 will be provided separately for 5.1
parents cf43a69a e087c05d
...@@ -50,7 +50,8 @@ class Field ...@@ -50,7 +50,8 @@ class Field
Field(const Item &); /* Prevent use of these */ Field(const Item &); /* Prevent use of these */
void operator=(Field &); void operator=(Field &);
public: public:
static void *operator new(size_t size) {return sql_alloc(size); } static void *operator new(size_t size) throw ()
{ return sql_alloc(size); }
static void operator delete(void *ptr_arg, size_t size) { TRASH(ptr_arg, size); } static void operator delete(void *ptr_arg, size_t size) { TRASH(ptr_arg, size); }
uchar *ptr; // Position to field in record uchar *ptr; // Position to field in record
......
...@@ -467,9 +467,9 @@ class Item { ...@@ -467,9 +467,9 @@ class Item {
Item(const Item &); /* Prevent use of these */ Item(const Item &); /* Prevent use of these */
void operator=(Item &); void operator=(Item &);
public: public:
static void *operator new(size_t size) static void *operator new(size_t size) throw ()
{ return sql_alloc(size); } { return sql_alloc(size); }
static void *operator new(size_t size, MEM_ROOT *mem_root) static void *operator new(size_t size, MEM_ROOT *mem_root) throw ()
{ return alloc_root(mem_root, size); } { return alloc_root(mem_root, size); }
static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); } static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); }
static void operator delete(void *ptr, MEM_ROOT *mem_root) {} static void operator delete(void *ptr, MEM_ROOT *mem_root) {}
......
...@@ -475,7 +475,7 @@ sp_head::operator new(size_t size) throw() ...@@ -475,7 +475,7 @@ sp_head::operator new(size_t size) throw()
init_sql_alloc(&own_root, MEM_ROOT_BLOCK_SIZE, MEM_ROOT_PREALLOC); init_sql_alloc(&own_root, MEM_ROOT_BLOCK_SIZE, MEM_ROOT_PREALLOC);
sp= (sp_head *) alloc_root(&own_root, size); sp= (sp_head *) alloc_root(&own_root, size);
if (sp == NULL) if (sp == NULL)
return NULL; DBUG_RETURN(NULL);
sp->main_mem_root= own_root; sp->main_mem_root= own_root;
DBUG_PRINT("info", ("mem_root 0x%lx", (ulong) &sp->mem_root)); DBUG_PRINT("info", ("mem_root 0x%lx", (ulong) &sp->mem_root));
DBUG_RETURN(sp); DBUG_RETURN(sp);
......
...@@ -155,6 +155,7 @@ int mysql_open_cursor(THD *thd, uint flags, select_result *result, ...@@ -155,6 +155,7 @@ int mysql_open_cursor(THD *thd, uint flags, select_result *result,
if (! (sensitive_cursor= new (thd->mem_root) Sensitive_cursor(thd, result))) if (! (sensitive_cursor= new (thd->mem_root) Sensitive_cursor(thd, result)))
{ {
delete result_materialize; delete result_materialize;
result_materialize= NULL;
return 1; return 1;
} }
...@@ -212,6 +213,7 @@ int mysql_open_cursor(THD *thd, uint flags, select_result *result, ...@@ -212,6 +213,7 @@ int mysql_open_cursor(THD *thd, uint flags, select_result *result,
if ((rc= materialized_cursor->open(0))) if ((rc= materialized_cursor->open(0)))
{ {
delete materialized_cursor; delete materialized_cursor;
materialized_cursor= NULL;
goto err_open; goto err_open;
} }
......
...@@ -417,11 +417,11 @@ class st_select_lex_node { ...@@ -417,11 +417,11 @@ class st_select_lex_node {
bool no_table_names_allowed; /* used for global order by */ bool no_table_names_allowed; /* used for global order by */
bool no_error; /* suppress error message (convert it to warnings) */ bool no_error; /* suppress error message (convert it to warnings) */
static void *operator new(size_t size) static void *operator new(size_t size) throw ()
{ {
return sql_alloc(size); return sql_alloc(size);
} }
static void *operator new(size_t size, MEM_ROOT *mem_root) static void *operator new(size_t size, MEM_ROOT *mem_root) throw ()
{ return (void*) alloc_root(mem_root, (uint) size); } { return (void*) alloc_root(mem_root, (uint) size); }
static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); } static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); }
static void operator delete(void *ptr, MEM_ROOT *mem_root) {} static void operator delete(void *ptr, MEM_ROOT *mem_root) {}
......
...@@ -29,7 +29,7 @@ class Sql_alloc ...@@ -29,7 +29,7 @@ class Sql_alloc
{ {
return sql_alloc(size); return sql_alloc(size);
} }
static void *operator new[](size_t size) static void *operator new[](size_t size) throw ()
{ {
return sql_alloc(size); return sql_alloc(size);
} }
...@@ -450,7 +450,7 @@ template <class T> class List_iterator_fast :public base_list_iterator ...@@ -450,7 +450,7 @@ template <class T> class List_iterator_fast :public base_list_iterator
struct ilink struct ilink
{ {
struct ilink **prev,*next; struct ilink **prev,*next;
static void *operator new(size_t size) static void *operator new(size_t size) throw ()
{ {
return (void*)my_malloc((uint)size, MYF(MY_WME | MY_FAE)); return (void*)my_malloc((uint)size, MYF(MY_WME | MY_FAE));
} }
......
...@@ -79,7 +79,7 @@ class String ...@@ -79,7 +79,7 @@ class String
Alloced_length=str.Alloced_length; alloced=0; Alloced_length=str.Alloced_length; alloced=0;
str_charset=str.str_charset; str_charset=str.str_charset;
} }
static void *operator new(size_t size, MEM_ROOT *mem_root) static void *operator new(size_t size, MEM_ROOT *mem_root) throw ()
{ return (void*) alloc_root(mem_root, (uint) size); } { return (void*) alloc_root(mem_root, (uint) size); }
static void operator delete(void *ptr_arg,size_t size) static void operator delete(void *ptr_arg,size_t size)
{ TRASH(ptr_arg, size); } { TRASH(ptr_arg, size); }
......
...@@ -17594,6 +17594,33 @@ static void test_wl4166_2() ...@@ -17594,6 +17594,33 @@ static void test_wl4166_2()
} }
/**
Bug#38486 Crash when using cursor protocol
*/
static void test_bug38486(void)
{
myheader("test_bug38486");
MYSQL_STMT *stmt;
stmt= mysql_stmt_init(mysql);
unsigned long type= CURSOR_TYPE_READ_ONLY;
mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void*)&type);
const char *sql= "CREATE TABLE t1 (a INT)";
mysql_stmt_prepare(stmt,sql,strlen(sql));
mysql_stmt_execute(stmt);
mysql_stmt_close(stmt);
stmt= mysql_stmt_init(mysql);
mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void*)&type);
const char *sql2= "INSERT INTO t1 VALUES (1)";
mysql_stmt_prepare(stmt,sql2,strlen(sql2));
mysql_stmt_execute(stmt);
mysql_stmt_close(stmt);
}
/* /*
Read and parse arguments and MySQL options from my.cnf Read and parse arguments and MySQL options from my.cnf
*/ */
...@@ -17902,6 +17929,7 @@ static struct my_tests_st my_tests[]= { ...@@ -17902,6 +17929,7 @@ static struct my_tests_st my_tests[]= {
{ "test_bug28386", test_bug28386 }, { "test_bug28386", test_bug28386 },
{ "test_wl4166_1", test_wl4166_1 }, { "test_wl4166_1", test_wl4166_1 },
{ "test_wl4166_2", test_wl4166_2 }, { "test_wl4166_2", test_wl4166_2 },
{ "test_bug38486", test_bug38486 },
{ 0, 0 } { 0, 0 }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment