summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Alff <marc.alff@sun.com>2008-08-11 16:44:13 -0600
committerMarc Alff <marc.alff@sun.com>2008-08-11 16:44:13 -0600
commit7f228cf20ea057a5d677d3546c6b29742db386a7 (patch)
tree7a10933aa27f945821757097c651e2de18b1c2aa
parentb0d5c8a10bf9f165affe89d8d593888e12b694f5 (diff)
parent2f3b860305a88e7e44ed68c5ed3a0f1837921cb0 (diff)
downloadmariadb-git-7f228cf20ea057a5d677d3546c6b29742db386a7.tar.gz
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
-rw-r--r--sql/field.h3
-rw-r--r--sql/item.h4
-rw-r--r--sql/sp_head.cc2
-rw-r--r--sql/sql_cursor.cc2
-rw-r--r--sql/sql_lex.h4
-rw-r--r--sql/sql_list.h4
-rw-r--r--sql/sql_string.h2
-rw-r--r--tests/mysql_client_test.c28
8 files changed, 40 insertions, 9 deletions
diff --git a/sql/field.h b/sql/field.h
index 8e00cf013dc..36f494f6e50 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -50,7 +50,8 @@ class Field
Field(const Item &); /* Prevent use of these */
void operator=(Field &);
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); }
uchar *ptr; // Position to field in record
diff --git a/sql/item.h b/sql/item.h
index 465d6f4d54c..2c9af80195b 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -467,9 +467,9 @@ class Item {
Item(const Item &); /* Prevent use of these */
void operator=(Item &);
public:
- static void *operator new(size_t size)
+ static void *operator new(size_t size) throw ()
{ 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); }
static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); }
static void operator delete(void *ptr, MEM_ROOT *mem_root) {}
diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index 92dcafa7aa8..d1f920fd3a5 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -475,7 +475,7 @@ sp_head::operator new(size_t size) throw()
init_sql_alloc(&own_root, MEM_ROOT_BLOCK_SIZE, MEM_ROOT_PREALLOC);
sp= (sp_head *) alloc_root(&own_root, size);
if (sp == NULL)
- return NULL;
+ DBUG_RETURN(NULL);
sp->main_mem_root= own_root;
DBUG_PRINT("info", ("mem_root 0x%lx", (ulong) &sp->mem_root));
DBUG_RETURN(sp);
diff --git a/sql/sql_cursor.cc b/sql/sql_cursor.cc
index d33680e1e0b..7c530cb9013 100644
--- a/sql/sql_cursor.cc
+++ b/sql/sql_cursor.cc
@@ -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)))
{
delete result_materialize;
+ result_materialize= NULL;
return 1;
}
@@ -212,6 +213,7 @@ int mysql_open_cursor(THD *thd, uint flags, select_result *result,
if ((rc= materialized_cursor->open(0)))
{
delete materialized_cursor;
+ materialized_cursor= NULL;
goto err_open;
}
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 5af22a895a7..bb3dc00fc8d 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -417,11 +417,11 @@ public:
bool no_table_names_allowed; /* used for global order by */
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);
}
- 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); }
static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); }
static void operator delete(void *ptr, MEM_ROOT *mem_root) {}
diff --git a/sql/sql_list.h b/sql/sql_list.h
index 2e068f7f961..0d267111dad 100644
--- a/sql/sql_list.h
+++ b/sql/sql_list.h
@@ -29,7 +29,7 @@ public:
{
return sql_alloc(size);
}
- static void *operator new[](size_t size)
+ static void *operator new[](size_t size) throw ()
{
return sql_alloc(size);
}
@@ -450,7 +450,7 @@ public:
struct ilink
{
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));
}
diff --git a/sql/sql_string.h b/sql/sql_string.h
index b4d76a1779a..be11fea70dc 100644
--- a/sql/sql_string.h
+++ b/sql/sql_string.h
@@ -79,7 +79,7 @@ public:
Alloced_length=str.Alloced_length; alloced=0;
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); }
static void operator delete(void *ptr_arg,size_t size)
{ TRASH(ptr_arg, size); }
diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c
index aafa22bdf7f..a41d9029d70 100644
--- a/tests/mysql_client_test.c
+++ b/tests/mysql_client_test.c
@@ -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
*/
@@ -17902,6 +17929,7 @@ static struct my_tests_st my_tests[]= {
{ "test_bug28386", test_bug28386 },
{ "test_wl4166_1", test_wl4166_1 },
{ "test_wl4166_2", test_wl4166_2 },
+ { "test_bug38486", test_bug38486 },
{ 0, 0 }
};