summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/sp-error.result10
-rw-r--r--mysql-test/t/sp-error.test18
-rw-r--r--sql/sp_rcontext.cc13
-rw-r--r--sql/sp_rcontext.h2
4 files changed, 36 insertions, 7 deletions
diff --git a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result
index c2b8460d615..9acdb27a2d6 100644
--- a/mysql-test/r/sp-error.result
+++ b/mysql-test/r/sp-error.result
@@ -283,6 +283,15 @@ create table t3 (column_1 int)|
call bug1653()|
drop procedure bug1653|
drop table t3|
+create procedure bug2259()
+begin
+declare v1 int;
+declare c1 cursor for select s1 from t10;
+fetch c1 into v1;
+end|
+call bug2259()|
+ERROR 24000: Cursor is not open
+drop procedure bug2259|
create procedure bug2272()
begin
declare v int;
@@ -292,4 +301,5 @@ insert into t1 values (666, 51.3)|
call bug2272()|
ERROR 42S22: Unknown column 'v' in 'field list'
delete from t1|
+drop procedure bug2272|
drop table t1|
diff --git a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test
index e33d4d36be7..4ac47257b1b 100644
--- a/mysql-test/t/sp-error.test
+++ b/mysql-test/t/sp-error.test
@@ -389,6 +389,23 @@ drop procedure bug1653|
drop table t3|
#
+# BUG#2259
+#
+# Note: When this bug existed, it did not necessarily cause a crash
+# in all builds, but valgrind did give warnings.
+create procedure bug2259()
+begin
+ declare v1 int;
+ declare c1 cursor for select s1 from t10;
+
+ fetch c1 into v1;
+end|
+
+--error 1310
+call bug2259()|
+drop procedure bug2259|
+
+#
# BUG#2272
#
create procedure bug2272()
@@ -402,6 +419,7 @@ insert into t1 values (666, 51.3)|
--error 1054
call bug2272()|
delete from t1|
+drop procedure bug2272|
drop table t1|
diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc
index 41502618cda..225adc74a6b 100644
--- a/sql/sp_rcontext.cc
+++ b/sql/sp_rcontext.cc
@@ -176,10 +176,13 @@ sp_cursor::close(THD *thd)
void
sp_cursor::destroy()
{
- delete m_prot;
- m_prot= NULL;
- free_root(&m_mem_root, MYF(0));
- bzero((char *)&m_mem_root, sizeof(m_mem_root));
+ if (m_prot)
+ {
+ delete m_prot;
+ m_prot= NULL;
+ free_root(&m_mem_root, MYF(0));
+ bzero((char *)&m_mem_root, sizeof(m_mem_root));
+ }
m_isopen= FALSE;
}
@@ -190,14 +193,12 @@ sp_cursor::fetch(THD *thd, List<struct sp_pvar> *vars)
sp_pvar_t *pv;
MYSQL_ROW row;
uint fldcount;
- MYSQL_FIELD *fields= m_prot->fields;
if (! m_isopen)
{
send_error(thd, ER_SP_CURSOR_NOT_OPEN);
return -1;
}
-
if (m_current_row == NULL)
{
send_error(thd, ER_SP_FETCH_NO_DATA);
diff --git a/sql/sp_rcontext.h b/sql/sp_rcontext.h
index 5d836998cb1..7a9271ed06a 100644
--- a/sql/sp_rcontext.h
+++ b/sql/sp_rcontext.h
@@ -205,7 +205,7 @@ class sp_cursor : public Sql_alloc
public:
sp_cursor(LEX *lex)
- : m_lex(lex), m_isopen(0), m_current_row(NULL)
+ : m_lex(lex), m_prot(NULL), m_isopen(0), m_current_row(NULL)
{
/* Empty */
}