Commit 274ae63c authored by unknown's avatar unknown

Merge tkatchaounov@bk-internal.mysql.com:/home/bk/mysql-5.0

into mysql.com:/home/timka/mysql/src/5.0-virgin

parents 3bfb668f d34e2ccb
...@@ -342,7 +342,7 @@ AC_SUBST(CXXFLAGS) ...@@ -342,7 +342,7 @@ AC_SUBST(CXXFLAGS)
AC_SUBST(LD) AC_SUBST(LD)
AC_SUBST(INSTALL_SCRIPT) AC_SUBST(INSTALL_SCRIPT)
export CC CXX CFLAGS LD LDFLAGS AR export CC CXX CFLAGS LD LDFLAGS AR ARFLAGS
if test "$GCC" = "yes" if test "$GCC" = "yes"
then then
......
...@@ -117,6 +117,13 @@ case "$target" in ...@@ -117,6 +117,13 @@ case "$target" in
CFLAGS="$CFLAGS -DUNIV_MUST_NOT_INLINE";; CFLAGS="$CFLAGS -DUNIV_MUST_NOT_INLINE";;
esac esac
# must go in pair with AR as set by MYSQL_CHECK_AR
if test -z "$ARFLAGS"
then
ARFLAGS="cru"
fi
AC_SUBST(ARFLAGS)
AC_OUTPUT(Makefile os/Makefile ut/Makefile btr/Makefile dnl AC_OUTPUT(Makefile os/Makefile ut/Makefile btr/Makefile dnl
buf/Makefile data/Makefile dnl buf/Makefile data/Makefile dnl
dict/Makefile dyn/Makefile dnl dict/Makefile dyn/Makefile dnl
......
...@@ -303,7 +303,7 @@ sub mysqld_arguments ($$$$$); ...@@ -303,7 +303,7 @@ sub mysqld_arguments ($$$$$);
sub stop_masters_slaves (); sub stop_masters_slaves ();
sub stop_masters (); sub stop_masters ();
sub stop_slaves (); sub stop_slaves ();
sub run_mysqltest ($$); sub run_mysqltest ($);
sub usage ($); sub usage ($);
###################################################################### ######################################################################
...@@ -1342,10 +1342,11 @@ sub run_testcase ($) { ...@@ -1342,10 +1342,11 @@ sub run_testcase ($) {
if ( ! $glob_use_running_server and ! $glob_use_embedded_server ) if ( ! $glob_use_running_server and ! $glob_use_embedded_server )
{ {
if ( $tinfo->{'master_restart'} or $master->[0]->{'uses_special_flags'} ) if ( $tinfo->{'master_restart'} or
$master->[0]->{'running_master_is_special'} )
{ {
stop_masters(); stop_masters();
$master->[0]->{'uses_special_flags'}= 0; # Forget about why we stopped $master->[0]->{'running_master_is_special'}= 0; # Forget why we stopped
} }
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
...@@ -1423,9 +1424,9 @@ sub run_testcase ($) { ...@@ -1423,9 +1424,9 @@ sub run_testcase ($) {
} }
} }
if ( @{$tinfo->{'master_opt'}} ) if ( $tinfo->{'master_restart'} )
{ {
$master->[0]->{'uses_special_flags'}= 1; $master->[0]->{'running_master_is_special'}= 1;
} }
} }
...@@ -1472,7 +1473,7 @@ sub run_testcase ($) { ...@@ -1472,7 +1473,7 @@ sub run_testcase ($) {
} }
unlink($path_timefile); unlink($path_timefile);
my $res= run_mysqltest($tinfo, $tinfo->{'master_opt'}); my $res= run_mysqltest($tinfo);
if ( $res == 0 ) if ( $res == 0 )
{ {
...@@ -1973,9 +1974,8 @@ sub stop_slaves () { ...@@ -1973,9 +1974,8 @@ sub stop_slaves () {
} }
sub run_mysqltest ($$) { sub run_mysqltest ($) {
my $tinfo= shift; my $tinfo= shift;
my $master_opts= shift;
my $cmdline_mysqldump= "$exe_mysqldump --no-defaults -uroot " . my $cmdline_mysqldump= "$exe_mysqldump --no-defaults -uroot " .
"--socket=$master->[0]->{'path_mysock'} --password="; "--socket=$master->[0]->{'path_mysock'} --password=";
......
...@@ -160,6 +160,21 @@ t1 CREATE TABLE `t1` ( ...@@ -160,6 +160,21 @@ t1 CREATE TABLE `t1` (
`COALESCE('a' COLLATE latin1_bin,'b')` varchar(1) character set latin1 collate latin1_bin NOT NULL default '' `COALESCE('a' COLLATE latin1_bin,'b')` varchar(1) character set latin1 collate latin1_bin NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1; DROP TABLE t1;
SELECT 'case+union+test'
UNION
SELECT CASE LOWER('1') WHEN LOWER('2') THEN 'BUG' ELSE 'nobug' END;
case+union+test
case+union+test
nobug
SELECT CASE LOWER('1') WHEN LOWER('2') THEN 'BUG' ELSE 'nobug' END;
CASE LOWER('1') WHEN LOWER('2') THEN 'BUG' ELSE 'nobug' END
nobug
SELECT 'case+union+test'
UNION
SELECT CASE '1' WHEN '2' THEN 'BUG' ELSE 'nobug' END;
case+union+test
case+union+test
nobug
CREATE TABLE t1 (EMPNUM INT); CREATE TABLE t1 (EMPNUM INT);
INSERT INTO t1 VALUES (0), (2); INSERT INTO t1 VALUES (0), (2);
CREATE TABLE t2 (EMPNUM DECIMAL (4, 2)); CREATE TABLE t2 (EMPNUM DECIMAL (4, 2));
......
...@@ -111,6 +111,17 @@ explain extended SELECT ...@@ -111,6 +111,17 @@ explain extended SELECT
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
DROP TABLE t1; DROP TABLE t1;
# Test for BUG#10151
SELECT 'case+union+test'
UNION
SELECT CASE LOWER('1') WHEN LOWER('2') THEN 'BUG' ELSE 'nobug' END;
SELECT CASE LOWER('1') WHEN LOWER('2') THEN 'BUG' ELSE 'nobug' END;
SELECT 'case+union+test'
UNION
SELECT CASE '1' WHEN '2' THEN 'BUG' ELSE 'nobug' END;
# #
# Tests for bug #9939: conversion of the arguments for COALESCE and IFNULL # Tests for bug #9939: conversion of the arguments for COALESCE and IFNULL
# #
......
...@@ -1420,6 +1420,8 @@ Item *Item_func_case::find_item(String *str) ...@@ -1420,6 +1420,8 @@ Item *Item_func_case::find_item(String *str)
my_decimal *first_expr_dec, first_expr_dec_val; my_decimal *first_expr_dec, first_expr_dec_val;
longlong first_expr_int; longlong first_expr_int;
double first_expr_real; double first_expr_real;
char buff[MAX_FIELD_WIDTH];
String buff_str(buff,sizeof(buff),default_charset());
/* These will be initialized later */ /* These will be initialized later */
LINT_INIT(first_expr_str); LINT_INIT(first_expr_str);
...@@ -1433,7 +1435,7 @@ Item *Item_func_case::find_item(String *str) ...@@ -1433,7 +1435,7 @@ Item *Item_func_case::find_item(String *str)
{ {
case STRING_RESULT: case STRING_RESULT:
// We can't use 'str' here as this may be overwritten // We can't use 'str' here as this may be overwritten
if (!(first_expr_str= args[first_expr_num]->val_str(&str_value))) if (!(first_expr_str= args[first_expr_num]->val_str(&buff_str)))
return else_expr_num != -1 ? args[else_expr_num] : 0; // Impossible return else_expr_num != -1 ? args[else_expr_num] : 0; // Impossible
break; break;
case INT_RESULT: case INT_RESULT:
......
...@@ -509,7 +509,7 @@ sp_head::destroy() ...@@ -509,7 +509,7 @@ sp_head::destroy()
delete i; delete i;
delete_dynamic(&m_instr); delete_dynamic(&m_instr);
m_pcont->destroy(); m_pcont->destroy();
free_items(free_list); free_items();
/* /*
If we have non-empty LEX stack then we just came out of parser with If we have non-empty LEX stack then we just came out of parser with
...@@ -596,7 +596,6 @@ sp_head::execute(THD *thd) ...@@ -596,7 +596,6 @@ sp_head::execute(THD *thd)
ctx->clear_handler(); ctx->clear_handler();
thd->query_error= 0; thd->query_error= 0;
old_arena= thd->current_arena; old_arena= thd->current_arena;
thd->current_arena= this;
/* /*
We have to save/restore this info when we are changing call level to We have to save/restore this info when we are changing call level to
...@@ -636,23 +635,18 @@ sp_head::execute(THD *thd) ...@@ -636,23 +635,18 @@ sp_head::execute(THD *thd)
break; break;
DBUG_PRINT("execute", ("Instruction %u", ip)); DBUG_PRINT("execute", ("Instruction %u", ip));
thd->set_time(); // Make current_time() et al work thd->set_time(); // Make current_time() et al work
{
/* /*
We have to substitute free_list of executing statement to We have to set thd->current_arena before executing the instruction
current_arena to store there all new items created during execution to store in the instruction free_list all new items, created
(for example '*' expanding, or items made during permanent subquery during the first execution (for example expanding of '*' or the
transformation) items made during other permanent subquery transformations).
Note: Every statement have to have all its items listed in free_list
for correct cleaning them up
*/ */
Item *save_free_list= thd->current_arena->free_list; thd->current_arena= i;
thd->current_arena->free_list= i->free_list;
ret= i->execute(thd, &ip); ret= i->execute(thd, &ip);
i->free_list= thd->current_arena->free_list;
thd->current_arena->free_list= save_free_list;
}
if (i->free_list) if (i->free_list)
cleanup_items(i->free_list); cleanup_items(i->free_list);
i->state= Query_arena::EXECUTED;
// Check if an exception has occurred and a handler has been found // 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 // Note: We havo to check even if ret==0, since warnings (and some
// errors don't return a non-zero value. // errors don't return a non-zero value.
...@@ -694,7 +688,6 @@ sp_head::execute(THD *thd) ...@@ -694,7 +688,6 @@ sp_head::execute(THD *thd)
DBUG_ASSERT(!thd->derived_tables); DBUG_ASSERT(!thd->derived_tables);
thd->derived_tables= old_derived_tables; thd->derived_tables= old_derived_tables;
cleanup_items(thd->current_arena->free_list);
thd->current_arena= old_arena; thd->current_arena= old_arena;
state= EXECUTED; state= EXECUTED;
...@@ -728,8 +721,8 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp) ...@@ -728,8 +721,8 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp)
sp_rcontext *nctx = NULL; sp_rcontext *nctx = NULL;
uint i; uint i;
int ret; int ret;
MEM_ROOT *old_mem_root, call_mem_root; MEM_ROOT call_mem_root;
Item *old_free_list, *call_free_list; Query_arena call_arena(&call_mem_root, INITIALIZED_FOR_SP), backup_arena;
if (argcount != params) if (argcount != params)
{ {
...@@ -741,14 +734,12 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp) ...@@ -741,14 +734,12 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp)
} }
init_alloc_root(&call_mem_root, MEM_ROOT_BLOCK_SIZE, 0); init_alloc_root(&call_mem_root, MEM_ROOT_BLOCK_SIZE, 0);
old_mem_root= thd->mem_root;
thd->mem_root= &call_mem_root; thd->set_n_backup_item_arena(&call_arena, &backup_arena);
old_free_list= thd->free_list; // Keep the old list
thd->free_list= NULL; // Start a new one
// QQ Should have some error checking here? (types, etc...) // QQ Should have some error checking here? (types, etc...)
nctx= new sp_rcontext(csize, hmax, cmax); nctx= new sp_rcontext(csize, hmax, cmax);
nctx->callers_mem_root= old_mem_root; nctx->callers_mem_root= backup_arena.mem_root;
for (i= 0 ; i < argcount ; i++) for (i= 0 ; i < argcount ; i++)
{ {
sp_pvar_t *pvar = m_pcont->find_pvar(i); sp_pvar_t *pvar = m_pcont->find_pvar(i);
...@@ -780,9 +771,7 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp) ...@@ -780,9 +771,7 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp)
// Partially restore context now. // Partially restore context now.
// We still need the call mem root and free list for processing // We still need the call mem root and free list for processing
// of the result. // of the result.
call_free_list= thd->free_list; thd->restore_backup_item_arena(&call_arena, &backup_arena);
thd->free_list= old_free_list;
thd->mem_root= old_mem_root;
if (m_type == TYPE_ENUM_FUNCTION && ret == 0) if (m_type == TYPE_ENUM_FUNCTION && ret == 0)
{ {
...@@ -802,8 +791,7 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp) ...@@ -802,8 +791,7 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp)
thd->spcont= octx; thd->spcont= octx;
// Now get rid of the rest of the callee context // Now get rid of the rest of the callee context
cleanup_items(call_free_list); call_arena.free_items();
free_items(call_free_list);
free_root(&call_mem_root, MYF(0)); free_root(&call_mem_root, MYF(0));
DBUG_RETURN(ret); DBUG_RETURN(ret);
...@@ -835,8 +823,8 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) ...@@ -835,8 +823,8 @@ sp_head::execute_procedure(THD *thd, List<Item> *args)
sp_rcontext *octx = thd->spcont; sp_rcontext *octx = thd->spcont;
sp_rcontext *nctx = NULL; sp_rcontext *nctx = NULL;
my_bool tmp_octx = FALSE; // True if we have allocated a temporary octx my_bool tmp_octx = FALSE; // True if we have allocated a temporary octx
MEM_ROOT *old_mem_root, call_mem_root; MEM_ROOT call_mem_root;
Item *old_free_list, *call_free_list; Query_arena call_arena(&call_mem_root, INITIALIZED_FOR_SP), backup_arena;
if (args->elements != params) if (args->elements != params)
{ {
...@@ -846,10 +834,7 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) ...@@ -846,10 +834,7 @@ sp_head::execute_procedure(THD *thd, List<Item> *args)
} }
init_alloc_root(&call_mem_root, MEM_ROOT_BLOCK_SIZE, 0); init_alloc_root(&call_mem_root, MEM_ROOT_BLOCK_SIZE, 0);
old_mem_root= thd->mem_root; thd->set_n_backup_item_arena(&call_arena, &backup_arena);
thd->mem_root= &call_mem_root;
old_free_list= thd->free_list; // Keep the old list
thd->free_list= NULL; // Start a new one
if (csize > 0 || hmax > 0 || cmax > 0) if (csize > 0 || hmax > 0 || cmax > 0)
{ {
...@@ -919,9 +904,7 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) ...@@ -919,9 +904,7 @@ sp_head::execute_procedure(THD *thd, List<Item> *args)
// Partially restore context now. // Partially restore context now.
// We still need the call mem root and free list for processing // We still need the call mem root and free list for processing
// of out parameters. // of out parameters.
call_free_list= thd->free_list; thd->restore_backup_item_arena(&call_arena, &backup_arena);
thd->free_list= old_free_list;
thd->mem_root= old_mem_root;
if (!ret && csize > 0) if (!ret && csize > 0)
{ {
...@@ -996,8 +979,7 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) ...@@ -996,8 +979,7 @@ sp_head::execute_procedure(THD *thd, List<Item> *args)
thd->spcont= octx; thd->spcont= octx;
// Now get rid of the rest of the callee context // Now get rid of the rest of the callee context
cleanup_items(call_free_list); call_arena.free_items();
free_items(call_free_list);
thd->lex->unit.cleanup(); thd->lex->unit.cleanup();
free_root(&call_mem_root, MYF(0)); free_root(&call_mem_root, MYF(0));
...@@ -1291,6 +1273,13 @@ void sp_head::add_instr(sp_instr *instr) ...@@ -1291,6 +1273,13 @@ void sp_head::add_instr(sp_instr *instr)
{ {
instr->free_list= m_thd->free_list; instr->free_list= m_thd->free_list;
m_thd->free_list= 0; m_thd->free_list= 0;
/*
Memory root of every instruction is designated for permanent
transformations (optimizations) made on the parsed tree during
the first execution. It points to the memory root of the
entire stored procedure, as their life span is equal.
*/
instr->mem_root= &main_mem_root;
insert_dynamic(&m_instr, (gptr)&instr); insert_dynamic(&m_instr, (gptr)&instr);
} }
......
...@@ -274,7 +274,7 @@ private: ...@@ -274,7 +274,7 @@ private:
// "Instructions"... // "Instructions"...
// //
class sp_instr : public Sql_alloc class sp_instr :public Query_arena, public Sql_alloc
{ {
sp_instr(const sp_instr &); /* Prevent use of these */ sp_instr(const sp_instr &); /* Prevent use of these */
void operator=(sp_instr &); void operator=(sp_instr &);
...@@ -282,17 +282,16 @@ class sp_instr : public Sql_alloc ...@@ -282,17 +282,16 @@ class sp_instr : public Sql_alloc
public: public:
uint marked; uint marked;
Item *free_list; // My Items
uint m_ip; // My index uint m_ip; // My index
sp_pcontext *m_ctx; // My parse context sp_pcontext *m_ctx; // My parse context
// Should give each a name or type code for debugging purposes? // Should give each a name or type code for debugging purposes?
sp_instr(uint ip, sp_pcontext *ctx) sp_instr(uint ip, sp_pcontext *ctx)
:Sql_alloc(), marked(0), free_list(0), m_ip(ip), m_ctx(ctx) :Query_arena(0, INITIALIZED_FOR_SP), marked(0), m_ip(ip), m_ctx(ctx)
{} {}
virtual ~sp_instr() virtual ~sp_instr()
{ free_items(free_list); } { free_items(); }
// Execute this instrution. '*nextp' will be set to the index of the next // Execute this instrution. '*nextp' will be set to the index of the next
// instruction to execute. (For most instruction this will be the // instruction to execute. (For most instruction this will be the
......
...@@ -171,9 +171,6 @@ THD::THD() ...@@ -171,9 +171,6 @@ THD::THD()
spcont(NULL) spcont(NULL)
{ {
current_arena= this; current_arena= this;
#ifndef DBUG_OFF
backup_arena= 0;
#endif
host= user= priv_user= db= ip= 0; host= user= priv_user= db= ip= 0;
catalog= (char*)"std"; // the only catalog we have for now catalog= (char*)"std"; // the only catalog we have for now
host_or_ip= "connecting host"; host_or_ip= "connecting host";
...@@ -528,7 +525,7 @@ void THD::cleanup_after_query() ...@@ -528,7 +525,7 @@ void THD::cleanup_after_query()
next_insert_id= 0; next_insert_id= 0;
} }
/* Free Items that were created during this execution */ /* Free Items that were created during this execution */
free_items(free_list); free_items();
/* /*
In the rest of code we assume that free_list never points to garbage: In the rest of code we assume that free_list never points to garbage:
Keep this predicate true. Keep this predicate true.
...@@ -1485,6 +1482,21 @@ Query_arena::Type Query_arena::type() const ...@@ -1485,6 +1482,21 @@ Query_arena::Type Query_arena::type() const
} }
void Query_arena::free_items()
{
Item *next;
DBUG_ENTER("Query_arena::free_items");
/* This works because items are allocated with sql_alloc() */
for (; free_list; free_list= next)
{
next= free_list->next;
free_list->delete_self();
}
/* Postcondition: free_list is 0 */
DBUG_VOID_RETURN;
}
/* /*
Statement functions Statement functions
*/ */
...@@ -1556,11 +1568,11 @@ void THD::end_statement() ...@@ -1556,11 +1568,11 @@ void THD::end_statement()
void Query_arena::set_n_backup_item_arena(Query_arena *set, Query_arena *backup) void Query_arena::set_n_backup_item_arena(Query_arena *set, Query_arena *backup)
{ {
DBUG_ENTER("Query_arena::set_n_backup_item_arena"); DBUG_ENTER("Query_arena::set_n_backup_item_arena");
DBUG_ASSERT(backup_arena == 0); DBUG_ASSERT(backup->is_backup_arena == FALSE);
backup->set_item_arena(this); backup->set_item_arena(this);
set_item_arena(set); set_item_arena(set);
#ifndef DBUG_OFF #ifndef DBUG_OFF
backup_arena= 1; backup->is_backup_arena= TRUE;
#endif #endif
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -1569,10 +1581,11 @@ void Query_arena::set_n_backup_item_arena(Query_arena *set, Query_arena *backup) ...@@ -1569,10 +1581,11 @@ void Query_arena::set_n_backup_item_arena(Query_arena *set, Query_arena *backup)
void Query_arena::restore_backup_item_arena(Query_arena *set, Query_arena *backup) void Query_arena::restore_backup_item_arena(Query_arena *set, Query_arena *backup)
{ {
DBUG_ENTER("Query_arena::restore_backup_item_arena"); DBUG_ENTER("Query_arena::restore_backup_item_arena");
DBUG_ASSERT(backup->is_backup_arena);
set->set_item_arena(this); set->set_item_arena(this);
set_item_arena(backup); set_item_arena(backup);
#ifndef DBUG_OFF #ifndef DBUG_OFF
backup_arena= 0; backup->is_backup_arena= FALSE;
#endif #endif
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
...@@ -663,7 +663,10 @@ public: ...@@ -663,7 +663,10 @@ public:
Item *free_list; Item *free_list;
MEM_ROOT *mem_root; // Pointer to current memroot MEM_ROOT *mem_root; // Pointer to current memroot
#ifndef DBUG_OFF #ifndef DBUG_OFF
bool backup_arena; bool is_backup_arena; /* True if this arena is used for backup. */
#define INIT_ARENA_DBUG_INFO is_backup_arena= 0
#else
#define INIT_ARENA_DBUG_INFO
#endif #endif
enum enum_state enum enum_state
{ {
...@@ -681,12 +684,14 @@ public: ...@@ -681,12 +684,14 @@ public:
Query_arena(MEM_ROOT *mem_root_arg, enum enum_state state_arg) : Query_arena(MEM_ROOT *mem_root_arg, enum enum_state state_arg) :
free_list(0), mem_root(mem_root_arg), state(state_arg) free_list(0), mem_root(mem_root_arg), state(state_arg)
{} { INIT_ARENA_DBUG_INFO; }
/* /*
This constructor is used only when Query_arena is created as This constructor is used only when Query_arena is created as
backup storage for another instance of Query_arena. backup storage for another instance of Query_arena.
*/ */
Query_arena() {}; Query_arena() { INIT_ARENA_DBUG_INFO; }
#undef INIT_ARENA_DBUG_INFO
virtual Type type() const; virtual Type type() const;
virtual ~Query_arena() {}; virtual ~Query_arena() {};
...@@ -726,6 +731,8 @@ public: ...@@ -726,6 +731,8 @@ public:
void set_n_backup_item_arena(Query_arena *set, Query_arena *backup); void set_n_backup_item_arena(Query_arena *set, Query_arena *backup);
void restore_backup_item_arena(Query_arena *set, Query_arena *backup); void restore_backup_item_arena(Query_arena *set, Query_arena *backup);
void set_item_arena(Query_arena *set); void set_item_arena(Query_arena *set);
void free_items();
}; };
......
...@@ -2429,7 +2429,7 @@ Prepared_statement::~Prepared_statement() ...@@ -2429,7 +2429,7 @@ Prepared_statement::~Prepared_statement()
{ {
if (cursor) if (cursor)
cursor->Cursor::~Cursor(); cursor->Cursor::~Cursor();
free_items(free_list); free_items();
delete lex->result; delete lex->result;
} }
......
...@@ -1914,8 +1914,7 @@ Cursor::close() ...@@ -1914,8 +1914,7 @@ Cursor::close()
} }
join= 0; join= 0;
unit= 0; unit= 0;
free_items(free_list); free_items();
free_list= 0;
/* /*
Must be last, as some memory might be allocated for free purposes, Must be last, as some memory might be allocated for free purposes,
like in free_tmp_table() (TODO: fix this issue) like in free_tmp_table() (TODO: fix this issue)
......
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