summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/item_func.h1
-rw-r--r--sql/sp.cc2
-rw-r--r--sql/sp_head.cc4
-rw-r--r--sql/sp_head.h3
4 files changed, 9 insertions, 1 deletions
diff --git a/sql/item_func.h b/sql/item_func.h
index ed5924e8fe1..a91d93be8c6 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -284,6 +284,7 @@ class Item_func_connection_id :public Item_int_func
longlong value;
public:
+ Item_func_connection_id() {}
const char *func_name() const { return "connection_id"; }
void fix_length_and_dec();
bool fix_fields(THD *thd, Item **ref);
diff --git a/sql/sp.cc b/sql/sp.cc
index 7df22c92cb8..cae7a56fa57 100644
--- a/sql/sp.cc
+++ b/sql/sp.cc
@@ -269,7 +269,6 @@ db_find_routine_aux(THD *thd, int type, sp_name *name, TABLE *table)
static int
db_find_routine(THD *thd, int type, sp_name *name, sp_head **sphp)
{
- extern int MYSQLparse(void *thd);
TABLE *table;
const char *params, *returns, *body;
int ret;
@@ -478,6 +477,7 @@ db_load_routine(THD *thd, int type, sp_name *name, sp_head **sphp,
(*sphp)->optimize();
}
end:
+ lex_end(thd->lex);
thd->spcont= old_spcont;
thd->variables.sql_mode= old_sql_mode;
thd->variables.select_limit= old_select_limit;
diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index 6b7cdb1ea98..6a7676c7bf2 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -671,6 +671,7 @@ sp_head::destroy()
DBUG_ASSERT(m_lex.is_empty() || m_thd);
while ((lex= (LEX *)m_lex.pop()))
{
+ lex_end(m_thd->lex);
delete m_thd->lex;
m_thd->lex= lex;
}
@@ -1643,7 +1644,10 @@ sp_head::restore_lex(THD *thd)
*/
merge_table_list(thd, sublex->query_tables, sublex);
if (! sublex->sp_lex_in_use)
+ {
+ lex_end(sublex);
delete sublex;
+ }
thd->lex= oldlex;
DBUG_VOID_RETURN;
}
diff --git a/sql/sp_head.h b/sql/sp_head.h
index 3ad81542ce7..6a9cf97d739 100644
--- a/sql/sp_head.h
+++ b/sql/sp_head.h
@@ -520,7 +520,10 @@ public:
virtual ~sp_lex_keeper()
{
if (m_lex_resp)
+ {
+ lex_end(m_lex);
delete m_lex;
+ }
}
/*