summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbell@sanja.is.com.ua <>2004-05-26 14:28:35 +0300
committerbell@sanja.is.com.ua <>2004-05-26 14:28:35 +0300
commite822f61d7685659f3a11cedec6143dba7c747df1 (patch)
treea0eba338950bc31db0955358da927a3d7664d5a0
parent5e83cf32a6c933621c46e9efc8644ffa9fc6275e (diff)
downloadmariadb-git-e822f61d7685659f3a11cedec6143dba7c747df1.tar.gz
cleunup items of instruction after every instruction execution
-rw-r--r--sql/sp_head.cc21
-rw-r--r--sql/sp_head.h17
2 files changed, 29 insertions, 9 deletions
diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index f2838a25a81..c22e57830f8 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -406,6 +406,8 @@ sp_head::execute(THD *thd)
break;
DBUG_PRINT("execute", ("Instruction %u", ip));
ret= i->execute(thd, &ip);
+ if (i->free_list)
+ cleanup_items(i->free_list);
// Check if an exception has occurred and a handler has been found
// Note: We havo to check even if ret==0, since warnings (and some
// errors don't return a non-zero value.
@@ -434,9 +436,11 @@ sp_head::execute(THD *thd)
done:
DBUG_PRINT("info", ("ret=%d killed=%d query_error=%d",
ret, thd->killed, thd->query_error));
+
if (thd->current_arena)
cleanup_items(thd->current_arena->free_list);
thd->current_arena= 0;
+
if (thd->killed || thd->query_error || thd->net.report_error)
ret= -1;
/* If the DB has changed, the pointer has changed too, but the
@@ -860,6 +864,23 @@ sp_head::show_create_procedure(THD *thd)
DBUG_RETURN(res);
}
+
+/*
+ Add instruction to SP
+
+ SYNOPSIS
+ sp_head::add_instr()
+ instr Instruction
+*/
+
+void sp_head::add_instr(sp_instr *instr)
+{
+ instr->free_list= m_thd->free_list;
+ m_thd->free_list= 0;
+ insert_dynamic(&m_instr, (gptr)&instr);
+}
+
+
int
sp_head::show_create_function(THD *thd)
{
diff --git a/sql/sp_head.h b/sql/sp_head.h
index 3906d8c2bc8..e9ec7068783 100644
--- a/sql/sp_head.h
+++ b/sql/sp_head.h
@@ -108,7 +108,7 @@ public:
static void *
operator new(size_t size);
- static void
+ static void
operator delete(void *ptr, size_t size);
sp_head();
@@ -123,7 +123,7 @@ public:
int
create(THD *thd);
-
+
virtual ~sp_head();
// Free memory
@@ -142,11 +142,8 @@ public:
int
show_create_function(THD *thd);
- inline void
- add_instr(sp_instr *i)
- {
- insert_dynamic(&m_instr, (gptr)&i);
- }
+ void
+ add_instr(sp_instr *instr);
inline uint
instructions()
@@ -249,13 +246,15 @@ class sp_instr : public Sql_alloc
public:
+ Item *free_list; // My Items
+
// Should give each a name or type code for debugging purposes?
sp_instr(uint ip)
- : Sql_alloc(), m_ip(ip)
+ :Sql_alloc(), free_list(0), m_ip(ip)
{}
virtual ~sp_instr()
- {}
+ { free_items(free_list); }
// Execute this instrution. '*nextp' will be set to the index of the next
// instruction to execute. (For most instruction this will be the