Simpler arena swapping code
Now thd->mem_root is a pointer to thd->main_mem_root and THR_MALLOC is a pointer to thd->mem_root. This gives us the following benefits: - Allow us to easily detect if arena has already been swapped before (this fixes a bug in setup_conds() where arena was swaped twice in some cases) - Faster swaps of arenas (as we don't have to copy the whole MEM_ROOT) - We don't anymore have to call my_pthread_setspecific_ptr(THR_MALLOC,...) to change where memory is alloced. Now it's enough to set thd->mem_root client/mysqltest.c: Remove some not needed defines (Things like this should be done in config-win.h) include/config-win.h: Added popen() and pclose() compatibility macros mysql-test/t/rpl_failed_optimize-master.opt: Portability fix sql/ha_berkeley.cc: New thd->memroot handling sql/item_cmpfunc.cc: Simpler arena swapping code sql/item_func.cc: Simpler arena swapping code sql/item_subselect.cc: Simpler arena swapping code New thd->mem_root handling sql/item_sum.cc: New thd->mem_root handling sql/item_timefunc.cc: Fixed not-initalized usage errors found by valgrind sql/log_event.cc: New thd->mem_root handling sql/mysql_priv.h: New thd->mem_root handling sql/mysqld.cc: New thd->mem_root handling sql/opt_range.cc: New thd->mem_root handling sql/repl_failsafe.cc: New thd->mem_root handling sql/set_var.cc: New thd->mem_root handling sql/sql_acl.cc: New thd->mem_root handling sql/sql_base.cc: Simpler arena swapping code New thd->mem_root handling sql/sql_class.cc: New thd->mem_root handling sql/sql_class.h: Simpler arena swapping code New thd->mem_root handling sql/sql_db.cc: New thd->mem_root handling sql/sql_error.cc: New thd->mem_root handling sql/sql_help.cc: New thd->mem_root handling sql/sql_insert.cc: New thd->mem_root handling sql/sql_parse.cc: New thd->mem_root handling Added some extra checking of return value of new sql/sql_prepare.cc: New thd->mem_root handling sql/sql_select.cc: New thd->mem_root handling sql/sql_select.h: New thd->mem_root handling sql/sql_union.cc: Simpler arena swapping code sql/sql_yacc.yy: New thd->mem_root handling sql/table.cc: New thd->mem_root handling sql/thr_malloc.cc: New thd->mem_root handling tests/client_test.c: Added drop table to some tests Changed some table names to 't1'
This commit is contained in:
parent
43c6c27c90
commit
435b20aa68
@ -949,11 +949,7 @@ static void do_exec(struct st_query* q)
|
|||||||
while (fgets(buf, sizeof(buf), res_file))
|
while (fgets(buf, sizeof(buf), res_file))
|
||||||
replace_dynstr_append_mem(ds, buf, strlen(buf));
|
replace_dynstr_append_mem(ds, buf, strlen(buf));
|
||||||
}
|
}
|
||||||
#ifndef __WIN__
|
|
||||||
error= pclose(res_file);
|
error= pclose(res_file);
|
||||||
#else
|
|
||||||
error= _pclose(res_file);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (error != 0)
|
if (error != 0)
|
||||||
die("command \"%s\" failed", cmd);
|
die("command \"%s\" failed", cmd);
|
||||||
@ -4610,11 +4606,7 @@ FILE *my_popen(const char *cmd, const char *mode __attribute__((unused)))
|
|||||||
FILE *res_file;
|
FILE *res_file;
|
||||||
|
|
||||||
subst_cmd= subst_env_var(cmd);
|
subst_cmd= subst_env_var(cmd);
|
||||||
#ifndef __WIN__
|
|
||||||
res_file= popen(subst_cmd, "r0");
|
res_file= popen(subst_cmd, "r0");
|
||||||
#else
|
|
||||||
res_file= _popen(subst_cmd, "r0");
|
|
||||||
#endif
|
|
||||||
my_free(subst_cmd, MYF(0));
|
my_free(subst_cmd, MYF(0));
|
||||||
return res_file;
|
return res_file;
|
||||||
}
|
}
|
||||||
|
@ -175,6 +175,8 @@ typedef uint rf_SetTimer;
|
|||||||
#define sigset(A,B) signal((A),(B))
|
#define sigset(A,B) signal((A),(B))
|
||||||
#define finite(A) _finite(A)
|
#define finite(A) _finite(A)
|
||||||
#define sleep(A) Sleep((A)*1000)
|
#define sleep(A) Sleep((A)*1000)
|
||||||
|
#define popen(A) popen(A,B) _popen((A),(B))
|
||||||
|
#define pclose(A) _pclose(A)
|
||||||
|
|
||||||
#ifndef __BORLANDC__
|
#ifndef __BORLANDC__
|
||||||
#define access(A,B) _access(A,B)
|
#define access(A,B) _access(A,B)
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb-lock-wait-timeout=1
|
--loose-innodb-lock-wait-timeout=1
|
||||||
|
@ -234,13 +234,13 @@ int berkeley_show_logs(Protocol *protocol)
|
|||||||
{
|
{
|
||||||
char **all_logs, **free_logs, **a, **f;
|
char **all_logs, **free_logs, **a, **f;
|
||||||
int error=1;
|
int error=1;
|
||||||
MEM_ROOT show_logs_root;
|
MEM_ROOT **root_ptr= my_pthread_getspecific_ptr(MEM_ROOT**,THR_MALLOC);
|
||||||
MEM_ROOT *old_root=my_pthread_getspecific_ptr(MEM_ROOT*,THR_MALLOC);
|
MEM_ROOT show_logs_root, *old_mem_root= *root_ptr;
|
||||||
DBUG_ENTER("berkeley_show_logs");
|
DBUG_ENTER("berkeley_show_logs");
|
||||||
|
|
||||||
init_sql_alloc(&show_logs_root, BDB_LOG_ALLOC_BLOCK_SIZE,
|
init_sql_alloc(&show_logs_root, BDB_LOG_ALLOC_BLOCK_SIZE,
|
||||||
BDB_LOG_ALLOC_BLOCK_SIZE);
|
BDB_LOG_ALLOC_BLOCK_SIZE);
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC,&show_logs_root);
|
*root_ptr= &show_logs_root;
|
||||||
|
|
||||||
if ((error= db_env->log_archive(db_env, &all_logs,
|
if ((error= db_env->log_archive(db_env, &all_logs,
|
||||||
DB_ARCH_ABS | DB_ARCH_LOG)) ||
|
DB_ARCH_ABS | DB_ARCH_LOG)) ||
|
||||||
@ -277,15 +277,17 @@ int berkeley_show_logs(Protocol *protocol)
|
|||||||
}
|
}
|
||||||
err:
|
err:
|
||||||
free_root(&show_logs_root,MYF(0));
|
free_root(&show_logs_root,MYF(0));
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC,old_root);
|
*root_ptr= old_mem_root;
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void berkeley_print_error(const char *db_errpfx, char *buffer)
|
static void berkeley_print_error(const char *db_errpfx, char *buffer)
|
||||||
{
|
{
|
||||||
sql_print_error("%s: %s",db_errpfx,buffer); /* purecov: tested */
|
sql_print_error("%s: %s",db_errpfx,buffer); /* purecov: tested */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void berkeley_noticecall(DB_ENV *db_env, db_notices notice)
|
static void berkeley_noticecall(DB_ENV *db_env, db_notices notice)
|
||||||
{
|
{
|
||||||
switch (notice)
|
switch (notice)
|
||||||
|
@ -1744,9 +1744,9 @@ void Item_func_in::fix_length_and_dec()
|
|||||||
Conversion is possible:
|
Conversion is possible:
|
||||||
All IN arguments are constants.
|
All IN arguments are constants.
|
||||||
*/
|
*/
|
||||||
Item_arena *arena= thd->current_arena, backup;
|
Item_arena *arena, backup;
|
||||||
if (arena->is_stmt_prepare())
|
arena= thd->change_arena_if_needed(&backup);
|
||||||
thd->set_n_backup_item_arena(arena, &backup);
|
|
||||||
for (arg= args+1, arg_end= args+arg_count; arg < arg_end; arg++)
|
for (arg= args+1, arg_end= args+arg_count; arg < arg_end; arg++)
|
||||||
{
|
{
|
||||||
if (!arg[0]->null_value &&
|
if (!arg[0]->null_value &&
|
||||||
@ -1764,7 +1764,7 @@ void Item_func_in::fix_length_and_dec()
|
|||||||
arg[0]= conv;
|
arg[0]= conv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (arena->is_stmt_prepare())
|
if (arena)
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(arena, &backup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -160,14 +160,13 @@ bool Item_func::agg_arg_charsets(DTCollation &coll,
|
|||||||
}
|
}
|
||||||
|
|
||||||
THD *thd= current_thd;
|
THD *thd= current_thd;
|
||||||
Item_arena *arena= thd->current_arena, backup;
|
Item_arena *arena, backup;
|
||||||
bool res= FALSE;
|
bool res= FALSE;
|
||||||
/*
|
/*
|
||||||
In case we're in statement prepare, create conversion item
|
In case we're in statement prepare, create conversion item
|
||||||
in its memory: it will be reused on each execute.
|
in its memory: it will be reused on each execute.
|
||||||
*/
|
*/
|
||||||
if (arena->is_stmt_prepare())
|
arena= thd->change_arena_if_needed(&backup);
|
||||||
thd->set_n_backup_item_arena(arena, &backup);
|
|
||||||
|
|
||||||
for (arg= args, last= args + nargs; arg < last; arg++)
|
for (arg= args, last= args + nargs; arg < last; arg++)
|
||||||
{
|
{
|
||||||
@ -193,7 +192,7 @@ bool Item_func::agg_arg_charsets(DTCollation &coll,
|
|||||||
conv->fix_fields(thd, 0, &conv);
|
conv->fix_fields(thd, 0, &conv);
|
||||||
*arg= conv;
|
*arg= conv;
|
||||||
}
|
}
|
||||||
if (arena->is_stmt_prepare())
|
if (arena)
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(arena, &backup);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -190,15 +190,16 @@ bool Item_subselect::fix_fields(THD *thd_param, TABLE_LIST *tables, Item **ref)
|
|||||||
bool Item_subselect::exec()
|
bool Item_subselect::exec()
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
MEM_ROOT *old_root= my_pthread_getspecific_ptr(MEM_ROOT*, THR_MALLOC);
|
MEM_ROOT *old_root= thd->mem_root;
|
||||||
if (&thd->mem_root != old_root)
|
|
||||||
{
|
/*
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC, &thd->mem_root);
|
As this is execution, all objects should be allocated through the main
|
||||||
res= engine->exec();
|
mem root
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC, old_root);
|
*/
|
||||||
}
|
thd->mem_root= &thd->main_mem_root;
|
||||||
else
|
res= engine->exec();
|
||||||
res= engine->exec();
|
thd->mem_root= old_root;
|
||||||
|
|
||||||
if (engine_changed)
|
if (engine_changed)
|
||||||
{
|
{
|
||||||
engine_changed= 0;
|
engine_changed= 0;
|
||||||
@ -312,7 +313,6 @@ Item_singlerow_subselect::select_transformer(JOIN *join)
|
|||||||
|
|
||||||
/* Juggle with current arena only if we're in prepared statement prepare */
|
/* Juggle with current arena only if we're in prepared statement prepare */
|
||||||
Item_arena *arena= join->thd->current_arena;
|
Item_arena *arena= join->thd->current_arena;
|
||||||
Item_arena backup;
|
|
||||||
|
|
||||||
if (!select_lex->master_unit()->first_select()->next_select() &&
|
if (!select_lex->master_unit()->first_select()->next_select() &&
|
||||||
!select_lex->table_list.elements &&
|
!select_lex->table_list.elements &&
|
||||||
@ -655,11 +655,9 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||||||
}
|
}
|
||||||
|
|
||||||
SELECT_LEX *select_lex= join->select_lex;
|
SELECT_LEX *select_lex= join->select_lex;
|
||||||
Item_arena *arena= join->thd->current_arena, backup;
|
Item_arena *arena, backup;
|
||||||
|
arena= thd->change_arena_if_needed(&backup);
|
||||||
thd->where= "scalar IN/ALL/ANY subquery";
|
thd->where= "scalar IN/ALL/ANY subquery";
|
||||||
if (arena->is_stmt_prepare())
|
|
||||||
thd->set_n_backup_item_arena(arena, &backup);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Check that the right part of the subselect contains no more than one
|
Check that the right part of the subselect contains no more than one
|
||||||
@ -892,7 +890,7 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
|
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
|
||||||
ER_SELECT_REDUCED, warn_buff);
|
ER_SELECT_REDUCED, warn_buff);
|
||||||
}
|
}
|
||||||
if (arena->is_stmt_prepare())
|
if (arena)
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(arena, &backup);
|
||||||
DBUG_RETURN(RES_REDUCE);
|
DBUG_RETURN(RES_REDUCE);
|
||||||
}
|
}
|
||||||
@ -900,13 +898,13 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ok:
|
ok:
|
||||||
if (arena->is_stmt_prepare())
|
if (arena)
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(arena, &backup);
|
||||||
thd->where= save_where;
|
thd->where= save_where;
|
||||||
DBUG_RETURN(RES_OK);
|
DBUG_RETURN(RES_OK);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
if (arena->is_stmt_prepare())
|
if (arena)
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(arena, &backup);
|
||||||
DBUG_RETURN(RES_ERROR);
|
DBUG_RETURN(RES_ERROR);
|
||||||
}
|
}
|
||||||
@ -922,14 +920,12 @@ Item_in_subselect::row_value_transformer(JOIN *join)
|
|||||||
{
|
{
|
||||||
DBUG_RETURN(RES_OK);
|
DBUG_RETURN(RES_OK);
|
||||||
}
|
}
|
||||||
Item_arena *arena= join->thd->current_arena, backup;
|
Item_arena *arena, backup;
|
||||||
Item *item= 0;
|
Item *item= 0;
|
||||||
|
SELECT_LEX *select_lex= join->select_lex;
|
||||||
|
|
||||||
thd->where= "row IN/ALL/ANY subquery";
|
thd->where= "row IN/ALL/ANY subquery";
|
||||||
if (arena->is_stmt_prepare())
|
arena= thd->change_arena_if_needed(&backup);
|
||||||
thd->set_n_backup_item_arena(arena, &backup);
|
|
||||||
|
|
||||||
SELECT_LEX *select_lex= join->select_lex;
|
|
||||||
|
|
||||||
if (select_lex->item_list.elements != left_expr->cols())
|
if (select_lex->item_list.elements != left_expr->cols())
|
||||||
{
|
{
|
||||||
@ -1006,13 +1002,13 @@ Item_in_subselect::row_value_transformer(JOIN *join)
|
|||||||
if (join->conds->fix_fields(thd, join->tables_list, 0))
|
if (join->conds->fix_fields(thd, join->tables_list, 0))
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (arena->is_stmt_prepare())
|
if (arena)
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(arena, &backup);
|
||||||
thd->where= save_where;
|
thd->where= save_where;
|
||||||
DBUG_RETURN(RES_OK);
|
DBUG_RETURN(RES_OK);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
if (arena->is_stmt_prepare())
|
if (arena)
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(arena, &backup);
|
||||||
DBUG_RETURN(RES_ERROR);
|
DBUG_RETURN(RES_ERROR);
|
||||||
}
|
}
|
||||||
|
@ -254,7 +254,7 @@ Item_sum_hybrid::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
|
|||||||
|
|
||||||
Item *Item_sum_sum::copy_or_same(THD* thd)
|
Item *Item_sum_sum::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_sum_sum(thd, this);
|
return new (thd->mem_root) Item_sum_sum(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -282,7 +282,7 @@ double Item_sum_sum::val()
|
|||||||
|
|
||||||
Item *Item_sum_count::copy_or_same(THD* thd)
|
Item *Item_sum_count::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_sum_count(thd, this);
|
return new (thd->mem_root) Item_sum_count(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -327,7 +327,7 @@ void Item_sum_count::cleanup()
|
|||||||
|
|
||||||
Item *Item_sum_avg::copy_or_same(THD* thd)
|
Item *Item_sum_avg::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_sum_avg(thd, this);
|
return new (thd->mem_root) Item_sum_avg(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -374,7 +374,7 @@ double Item_sum_std::val()
|
|||||||
|
|
||||||
Item *Item_sum_std::copy_or_same(THD* thd)
|
Item *Item_sum_std::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_sum_std(thd, this);
|
return new (thd->mem_root) Item_sum_std(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -384,7 +384,7 @@ Item *Item_sum_std::copy_or_same(THD* thd)
|
|||||||
|
|
||||||
Item *Item_sum_variance::copy_or_same(THD* thd)
|
Item *Item_sum_variance::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_sum_variance(thd, this);
|
return new (thd->mem_root) Item_sum_variance(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -546,7 +546,7 @@ void Item_sum_hybrid::cleanup()
|
|||||||
|
|
||||||
Item *Item_sum_min::copy_or_same(THD* thd)
|
Item *Item_sum_min::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_sum_min(thd, this);
|
return new (thd->mem_root) Item_sum_min(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -599,7 +599,7 @@ bool Item_sum_min::add()
|
|||||||
|
|
||||||
Item *Item_sum_max::copy_or_same(THD* thd)
|
Item *Item_sum_max::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_sum_max(thd, this);
|
return new (thd->mem_root) Item_sum_max(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -666,7 +666,7 @@ void Item_sum_bit::clear()
|
|||||||
|
|
||||||
Item *Item_sum_or::copy_or_same(THD* thd)
|
Item *Item_sum_or::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_sum_or(thd, this);
|
return new (thd->mem_root) Item_sum_or(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -680,7 +680,7 @@ bool Item_sum_or::add()
|
|||||||
|
|
||||||
Item *Item_sum_xor::copy_or_same(THD* thd)
|
Item *Item_sum_xor::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_sum_xor(thd, this);
|
return new (thd->mem_root) Item_sum_xor(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -694,7 +694,7 @@ bool Item_sum_xor::add()
|
|||||||
|
|
||||||
Item *Item_sum_and::copy_or_same(THD* thd)
|
Item *Item_sum_and::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_sum_and(thd, this);
|
return new (thd->mem_root) Item_sum_and(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1337,7 +1337,7 @@ int Item_sum_count_distinct::tree_to_myisam()
|
|||||||
|
|
||||||
Item *Item_sum_count_distinct::copy_or_same(THD* thd)
|
Item *Item_sum_count_distinct::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_sum_count_distinct(thd, this);
|
return new (thd->mem_root) Item_sum_count_distinct(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1438,7 +1438,7 @@ bool Item_udf_sum::add()
|
|||||||
|
|
||||||
Item *Item_sum_udf_float::copy_or_same(THD* thd)
|
Item *Item_sum_udf_float::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_sum_udf_float(thd, this);
|
return new (thd->mem_root) Item_sum_udf_float(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
double Item_sum_udf_float::val()
|
double Item_sum_udf_float::val()
|
||||||
@ -1463,7 +1463,7 @@ String *Item_sum_udf_float::val_str(String *str)
|
|||||||
|
|
||||||
Item *Item_sum_udf_int::copy_or_same(THD* thd)
|
Item *Item_sum_udf_int::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_sum_udf_int(thd, this);
|
return new (thd->mem_root) Item_sum_udf_int(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1501,7 +1501,7 @@ void Item_sum_udf_str::fix_length_and_dec()
|
|||||||
|
|
||||||
Item *Item_sum_udf_str::copy_or_same(THD* thd)
|
Item *Item_sum_udf_str::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_sum_udf_str(thd, this);
|
return new (thd->mem_root) Item_sum_udf_str(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1815,7 +1815,7 @@ Item_func_group_concat::~Item_func_group_concat()
|
|||||||
|
|
||||||
Item *Item_func_group_concat::copy_or_same(THD* thd)
|
Item *Item_func_group_concat::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (&thd->mem_root) Item_func_group_concat(thd, this);
|
return new (thd->mem_root) Item_func_group_concat(thd, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -164,10 +164,10 @@ static bool extract_date_time(DATE_TIME_FORMAT *format,
|
|||||||
CHARSET_INFO *cs= &my_charset_bin;
|
CHARSET_INFO *cs= &my_charset_bin;
|
||||||
int error= 0;
|
int error= 0;
|
||||||
bool usa_time= 0;
|
bool usa_time= 0;
|
||||||
bool sunday_first_n_first_week_non_iso;
|
bool sunday_first_n_first_week_non_iso= -2;
|
||||||
bool strict_week_number;
|
bool strict_week_number;
|
||||||
int strict_week_number_year= -1;
|
int strict_week_number_year= -1;
|
||||||
bool strict_week_number_year_type;
|
bool strict_week_number_year_type= -1;
|
||||||
int frac_part;
|
int frac_part;
|
||||||
const char *val_begin= val;
|
const char *val_begin= val;
|
||||||
const char *val_end= val + length;
|
const char *val_end= val + length;
|
||||||
@ -175,9 +175,7 @@ static bool extract_date_time(DATE_TIME_FORMAT *format,
|
|||||||
const char *end= ptr + format->format.length;
|
const char *end= ptr + format->format.length;
|
||||||
DBUG_ENTER("extract_date_time");
|
DBUG_ENTER("extract_date_time");
|
||||||
|
|
||||||
LINT_INIT(sunday_first_n_first_week_non_iso);
|
|
||||||
LINT_INIT(strict_week_number);
|
LINT_INIT(strict_week_number);
|
||||||
LINT_INIT(strict_week_number_year_type);
|
|
||||||
|
|
||||||
if (!sub_pattern_end)
|
if (!sub_pattern_end)
|
||||||
bzero((char*) l_time, sizeof(*l_time));
|
bzero((char*) l_time, sizeof(*l_time));
|
||||||
|
@ -1090,7 +1090,7 @@ end:
|
|||||||
thd->query_length= thd->db_length =0;
|
thd->query_length= thd->db_length =0;
|
||||||
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
||||||
close_thread_tables(thd);
|
close_thread_tables(thd);
|
||||||
free_root(&thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
||||||
/*
|
/*
|
||||||
If there was an error we stop. Otherwise we increment positions. Note that
|
If there was an error we stop. Otherwise we increment positions. Note that
|
||||||
we will not increment group* positions if we are just after a SET
|
we will not increment group* positions if we are just after a SET
|
||||||
@ -1888,10 +1888,10 @@ Slave: load data infile on table '%s' at log position %s in log \
|
|||||||
slave_print_error(rli,sql_errno,"\
|
slave_print_error(rli,sql_errno,"\
|
||||||
Error '%s' running LOAD DATA INFILE on table '%s'. Default database: '%s'",
|
Error '%s' running LOAD DATA INFILE on table '%s'. Default database: '%s'",
|
||||||
err, (char*)table_name, print_slave_db_safe(db));
|
err, (char*)table_name, print_slave_db_safe(db));
|
||||||
free_root(&thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
free_root(&thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
||||||
|
|
||||||
if (thd->is_fatal_error)
|
if (thd->is_fatal_error)
|
||||||
{
|
{
|
||||||
@ -2505,7 +2505,7 @@ int User_var_log_event::exec_event(struct st_relay_log_info* rli)
|
|||||||
*/
|
*/
|
||||||
e.fix_fields(thd, 0, 0);
|
e.fix_fields(thd, 0, 0);
|
||||||
e.update_hash(val, val_len, type, charset, DERIVATION_NONE);
|
e.update_hash(val, val_len, type, charset, DERIVATION_NONE);
|
||||||
free_root(&thd->mem_root,0);
|
free_root(thd->mem_root,0);
|
||||||
|
|
||||||
rli->inc_event_relay_log_pos(get_event_len());
|
rli->inc_event_relay_log_pos(get_event_len());
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -910,7 +910,7 @@ extern char *default_tz_name;
|
|||||||
|
|
||||||
extern MYSQL_LOG mysql_log,mysql_update_log,mysql_slow_log,mysql_bin_log;
|
extern MYSQL_LOG mysql_log,mysql_update_log,mysql_slow_log,mysql_bin_log;
|
||||||
extern FILE *bootstrap_file;
|
extern FILE *bootstrap_file;
|
||||||
extern pthread_key(MEM_ROOT*,THR_MALLOC);
|
extern pthread_key(MEM_ROOT**,THR_MALLOC);
|
||||||
extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open,
|
extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open,
|
||||||
LOCK_thread_count,LOCK_mapped_file,LOCK_user_locks, LOCK_status,
|
LOCK_thread_count,LOCK_mapped_file,LOCK_user_locks, LOCK_status,
|
||||||
LOCK_error_log, LOCK_delayed_insert, LOCK_uuid_generator,
|
LOCK_error_log, LOCK_delayed_insert, LOCK_uuid_generator,
|
||||||
|
@ -374,7 +374,7 @@ SHOW_COMP_OPTION have_crypt, have_compress;
|
|||||||
|
|
||||||
/* Thread specific variables */
|
/* Thread specific variables */
|
||||||
|
|
||||||
pthread_key(MEM_ROOT*,THR_MALLOC);
|
pthread_key(MEM_ROOT**,THR_MALLOC);
|
||||||
pthread_key(THD*, THR_THD);
|
pthread_key(THD*, THR_THD);
|
||||||
pthread_mutex_t LOCK_mysql_create_db, LOCK_Acl, LOCK_open, LOCK_thread_count,
|
pthread_mutex_t LOCK_mysql_create_db, LOCK_Acl, LOCK_open, LOCK_thread_count,
|
||||||
LOCK_mapped_file, LOCK_status,
|
LOCK_mapped_file, LOCK_status,
|
||||||
|
@ -400,7 +400,7 @@ QUICK_SELECT::QUICK_SELECT(THD *thd, TABLE *table, uint key_nr, bool no_alloc)
|
|||||||
{
|
{
|
||||||
// Allocates everything through the internal memroot
|
// Allocates everything through the internal memroot
|
||||||
init_sql_alloc(&alloc, thd->variables.range_alloc_block_size, 0);
|
init_sql_alloc(&alloc, thd->variables.range_alloc_block_size, 0);
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC,&alloc);
|
thd->mem_root= &alloc;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
bzero((char*) &alloc,sizeof(alloc));
|
bzero((char*) &alloc,sizeof(alloc));
|
||||||
@ -668,8 +668,8 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
|||||||
DBUG_RETURN(0); // Can't use range
|
DBUG_RETURN(0); // Can't use range
|
||||||
}
|
}
|
||||||
key_parts= param.key_parts;
|
key_parts= param.key_parts;
|
||||||
old_root=my_pthread_getspecific_ptr(MEM_ROOT*,THR_MALLOC);
|
old_root= thd->mem_root;
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC,&alloc);
|
thd->mem_root= &alloc;
|
||||||
|
|
||||||
key_info= head->key_info;
|
key_info= head->key_info;
|
||||||
for (idx=0 ; idx < head->keys ; idx++, key_info++)
|
for (idx=0 ; idx < head->keys ; idx++, key_info++)
|
||||||
@ -769,7 +769,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
free_root(&alloc,MYF(0)); // Return memory & allocator
|
free_root(&alloc,MYF(0)); // Return memory & allocator
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC,old_root);
|
thd->mem_root= old_root;
|
||||||
thd->no_errors=0;
|
thd->no_errors=0;
|
||||||
}
|
}
|
||||||
DBUG_EXECUTE("info",print_quick(quick,&needed_reg););
|
DBUG_EXECUTE("info",print_quick(quick,&needed_reg););
|
||||||
@ -2563,7 +2563,8 @@ static bool null_part_in_key(KEY_PART *key_part, const char *key, uint length)
|
|||||||
|
|
||||||
QUICK_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table, TABLE_REF *ref)
|
QUICK_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table, TABLE_REF *ref)
|
||||||
{
|
{
|
||||||
MEM_ROOT *old_root= my_pthread_getspecific_ptr(MEM_ROOT*, THR_MALLOC);
|
MEM_ROOT *old_root= thd->mem_root;
|
||||||
|
/* The following call may change thd->mem_root */
|
||||||
QUICK_SELECT *quick= new QUICK_SELECT(thd, table, ref->key);
|
QUICK_SELECT *quick= new QUICK_SELECT(thd, table, ref->key);
|
||||||
KEY *key_info = &table->key_info[ref->key];
|
KEY *key_info = &table->key_info[ref->key];
|
||||||
KEY_PART *key_part;
|
KEY_PART *key_part;
|
||||||
@ -2624,11 +2625,11 @@ QUICK_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table, TABLE_REF *ref)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ok:
|
ok:
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC, old_root);
|
thd->mem_root= old_root;
|
||||||
return quick;
|
return quick;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC, old_root);
|
thd->mem_root= old_root;
|
||||||
delete quick;
|
delete quick;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ static int init_failsafe_rpl_thread(THD* thd)
|
|||||||
VOID(pthread_sigmask(SIG_UNBLOCK,&set,&thd->block_signals));
|
VOID(pthread_sigmask(SIG_UNBLOCK,&set,&thd->block_signals));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
thd->mem_root.free=thd->mem_root.used=0;
|
thd->mem_root->free= thd->mem_root->used= 0;
|
||||||
if (thd->variables.max_join_size == HA_POS_ERROR)
|
if (thd->variables.max_join_size == HA_POS_ERROR)
|
||||||
thd->options|= OPTION_BIG_SELECTS;
|
thd->options|= OPTION_BIG_SELECTS;
|
||||||
|
|
||||||
|
@ -1165,7 +1165,7 @@ static void fix_max_connections(THD *thd, enum_var_type type)
|
|||||||
static void fix_thd_mem_root(THD *thd, enum_var_type type)
|
static void fix_thd_mem_root(THD *thd, enum_var_type type)
|
||||||
{
|
{
|
||||||
if (type != OPT_GLOBAL)
|
if (type != OPT_GLOBAL)
|
||||||
reset_root_defaults(&thd->mem_root,
|
reset_root_defaults(thd->mem_root,
|
||||||
thd->variables.query_alloc_block_size,
|
thd->variables.query_alloc_block_size,
|
||||||
thd->variables.query_prealloc_size);
|
thd->variables.query_prealloc_size);
|
||||||
}
|
}
|
||||||
|
@ -2309,8 +2309,8 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list,
|
|||||||
create_new_users= test_if_create_new_users(thd);
|
create_new_users= test_if_create_new_users(thd);
|
||||||
int result=0;
|
int result=0;
|
||||||
rw_wrlock(&LOCK_grant);
|
rw_wrlock(&LOCK_grant);
|
||||||
MEM_ROOT *old_root=my_pthread_getspecific_ptr(MEM_ROOT*,THR_MALLOC);
|
MEM_ROOT *old_root= thd->mem_root;
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC,&memex);
|
thd->mem_root= &memex;
|
||||||
|
|
||||||
while ((Str = str_list++))
|
while ((Str = str_list++))
|
||||||
{
|
{
|
||||||
@ -2415,7 +2415,7 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
grant_option=TRUE;
|
grant_option=TRUE;
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC,old_root);
|
thd->mem_root= old_root;
|
||||||
rw_unlock(&LOCK_grant);
|
rw_unlock(&LOCK_grant);
|
||||||
if (!result)
|
if (!result)
|
||||||
send_ok(thd);
|
send_ok(thd);
|
||||||
@ -2549,6 +2549,7 @@ my_bool grant_init(THD *org_thd)
|
|||||||
THD *thd;
|
THD *thd;
|
||||||
TABLE_LIST tables[2];
|
TABLE_LIST tables[2];
|
||||||
MYSQL_LOCK *lock;
|
MYSQL_LOCK *lock;
|
||||||
|
MEM_ROOT *memex_ptr;
|
||||||
my_bool return_val= 1;
|
my_bool return_val= 1;
|
||||||
TABLE *t_table, *c_table;
|
TABLE *t_table, *c_table;
|
||||||
bool check_no_resolve= specialflag & SPECIAL_NO_RESOLVE;
|
bool check_no_resolve= specialflag & SPECIAL_NO_RESOLVE;
|
||||||
@ -2596,7 +2597,8 @@ my_bool grant_init(THD *org_thd)
|
|||||||
grant_option= TRUE;
|
grant_option= TRUE;
|
||||||
|
|
||||||
/* Will be restored by org_thd->store_globals() */
|
/* Will be restored by org_thd->store_globals() */
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC,&memex);
|
memex_ptr= &memex;
|
||||||
|
my_pthread_setspecific_ptr(THR_MALLOC, &memex_ptr);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
GRANT_TABLE *mem_check;
|
GRANT_TABLE *mem_check;
|
||||||
|
@ -499,7 +499,7 @@ void close_temporary_tables(THD *thd)
|
|||||||
*/
|
*/
|
||||||
query_buf_size+= table->key_length+1;
|
query_buf_size+= table->key_length+1;
|
||||||
|
|
||||||
if ((query = alloc_root(&thd->mem_root, query_buf_size)))
|
if ((query = alloc_root(thd->mem_root, query_buf_size)))
|
||||||
// Better add "if exists", in case a RESET MASTER has been done
|
// Better add "if exists", in case a RESET MASTER has been done
|
||||||
end=strmov(query, "DROP /*!40005 TEMPORARY */ TABLE IF EXISTS ");
|
end=strmov(query, "DROP /*!40005 TEMPORARY */ TABLE IF EXISTS ");
|
||||||
|
|
||||||
@ -2311,18 +2311,16 @@ int setup_wild(THD *thd, TABLE_LIST *tables, List<Item> &fields,
|
|||||||
if (!wild_num)
|
if (!wild_num)
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
Item_arena *arena= thd->current_arena, backup;
|
reg2 Item *item;
|
||||||
|
List_iterator<Item> it(fields);
|
||||||
|
Item_arena *arena, backup;
|
||||||
/*
|
/*
|
||||||
If we are in preparing prepared statement phase then we have change
|
If we are in preparing prepared statement phase then we have change
|
||||||
temporary mem_root to statement mem root to save changes of SELECT list
|
temporary mem_root to statement mem root to save changes of SELECT list
|
||||||
*/
|
*/
|
||||||
if ((is_stmt_prepare= arena->is_stmt_prepare()))
|
arena= thd->change_arena_if_needed(&backup);
|
||||||
thd->set_n_backup_item_arena(arena, &backup);
|
|
||||||
|
|
||||||
reg2 Item *item;
|
while (wild_num && (item= it++))
|
||||||
List_iterator<Item> it(fields);
|
|
||||||
while ( wild_num && (item= it++))
|
|
||||||
{
|
{
|
||||||
if (item->type() == Item::FIELD_ITEM &&
|
if (item->type() == Item::FIELD_ITEM &&
|
||||||
((Item_field*) item)->field_name &&
|
((Item_field*) item)->field_name &&
|
||||||
@ -2344,7 +2342,7 @@ int setup_wild(THD *thd, TABLE_LIST *tables, List<Item> &fields,
|
|||||||
else if (insert_fields(thd,tables,((Item_field*) item)->db_name,
|
else if (insert_fields(thd,tables,((Item_field*) item)->db_name,
|
||||||
((Item_field*) item)->table_name, &it))
|
((Item_field*) item)->table_name, &it))
|
||||||
{
|
{
|
||||||
if (is_stmt_prepare)
|
if (arena)
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(arena, &backup);
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
}
|
}
|
||||||
@ -2360,7 +2358,7 @@ int setup_wild(THD *thd, TABLE_LIST *tables, List<Item> &fields,
|
|||||||
wild_num--;
|
wild_num--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (is_stmt_prepare)
|
if (arena)
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(arena, &backup);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
@ -2589,11 +2587,10 @@ insert_fields(THD *thd,TABLE_LIST *tables, const char *db_name,
|
|||||||
int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
|
int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
|
||||||
{
|
{
|
||||||
table_map not_null_tables= 0;
|
table_map not_null_tables= 0;
|
||||||
Item_arena *arena= thd->current_arena, backup;
|
Item_arena *arena= 0, backup;
|
||||||
bool is_stmt_prepare= arena->is_stmt_prepare();
|
|
||||||
DBUG_ENTER("setup_conds");
|
DBUG_ENTER("setup_conds");
|
||||||
|
|
||||||
thd->set_query_id=1;
|
thd->set_query_id=1;
|
||||||
|
|
||||||
thd->lex->current_select->cond_count= 0;
|
thd->lex->current_select->cond_count= 0;
|
||||||
if (*conds)
|
if (*conds)
|
||||||
{
|
{
|
||||||
@ -2628,12 +2625,14 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
|
|||||||
!(specialflag & SPECIAL_NO_NEW_FUNC)))
|
!(specialflag & SPECIAL_NO_NEW_FUNC)))
|
||||||
{
|
{
|
||||||
table->outer_join= 0;
|
table->outer_join= 0;
|
||||||
if (is_stmt_prepare)
|
arena= thd->change_arena_if_needed(&backup);
|
||||||
thd->set_n_backup_item_arena(arena, &backup);
|
|
||||||
*conds= and_conds(*conds, table->on_expr);
|
*conds= and_conds(*conds, table->on_expr);
|
||||||
table->on_expr=0;
|
table->on_expr=0;
|
||||||
if (is_stmt_prepare)
|
if (arena)
|
||||||
|
{
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(arena, &backup);
|
||||||
|
arena= 0; // Safety if goto err
|
||||||
|
}
|
||||||
if ((*conds) && !(*conds)->fixed &&
|
if ((*conds) && !(*conds)->fixed &&
|
||||||
(*conds)->fix_fields(thd, tables, conds))
|
(*conds)->fix_fields(thd, tables, conds))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
@ -2641,8 +2640,7 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
|
|||||||
}
|
}
|
||||||
if (table->natural_join)
|
if (table->natural_join)
|
||||||
{
|
{
|
||||||
if (is_stmt_prepare)
|
arena= thd->change_arena_if_needed(&backup);
|
||||||
thd->set_n_backup_item_arena(arena, &backup);
|
|
||||||
/* Make a join of all fields with have the same name */
|
/* Make a join of all fields with have the same name */
|
||||||
TABLE *t1= table->table;
|
TABLE *t1= table->table;
|
||||||
TABLE *t2= table->natural_join->table;
|
TABLE *t2= table->natural_join->table;
|
||||||
@ -2683,7 +2681,7 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
|
|||||||
{
|
{
|
||||||
*conds= and_conds(*conds, cond_and);
|
*conds= and_conds(*conds, cond_and);
|
||||||
// fix_fields() should be made with temporary memory pool
|
// fix_fields() should be made with temporary memory pool
|
||||||
if (is_stmt_prepare)
|
if (arena)
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(arena, &backup);
|
||||||
if (*conds && !(*conds)->fixed)
|
if (*conds && !(*conds)->fixed)
|
||||||
{
|
{
|
||||||
@ -2695,7 +2693,7 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
|
|||||||
{
|
{
|
||||||
table->on_expr= and_conds(table->on_expr, cond_and);
|
table->on_expr= and_conds(table->on_expr, cond_and);
|
||||||
// fix_fields() should be made with temporary memory pool
|
// fix_fields() should be made with temporary memory pool
|
||||||
if (is_stmt_prepare)
|
if (arena)
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(arena, &backup);
|
||||||
if (table->on_expr && !table->on_expr->fixed)
|
if (table->on_expr && !table->on_expr->fixed)
|
||||||
{
|
{
|
||||||
@ -2704,12 +2702,15 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (is_stmt_prepare)
|
else if (arena)
|
||||||
|
{
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(arena, &backup);
|
||||||
|
arena= 0; // Safety if goto err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_stmt_prepare)
|
if (thd->current_arena->is_stmt_prepare())
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
We are in prepared statement preparation code => we should store
|
We are in prepared statement preparation code => we should store
|
||||||
@ -2722,8 +2723,8 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
|
|||||||
DBUG_RETURN(test(thd->net.report_error));
|
DBUG_RETURN(test(thd->net.report_error));
|
||||||
|
|
||||||
err:
|
err:
|
||||||
if (is_stmt_prepare)
|
if (arena)
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(arena, &backup);
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -305,7 +305,7 @@ void THD::init_for_queries()
|
|||||||
{
|
{
|
||||||
ha_enable_transaction(this,TRUE);
|
ha_enable_transaction(this,TRUE);
|
||||||
|
|
||||||
reset_root_defaults(&mem_root, variables.query_alloc_block_size,
|
reset_root_defaults(mem_root, variables.query_alloc_block_size,
|
||||||
variables.query_prealloc_size);
|
variables.query_prealloc_size);
|
||||||
reset_root_defaults(&transaction.mem_root,
|
reset_root_defaults(&transaction.mem_root,
|
||||||
variables.trans_alloc_block_size,
|
variables.trans_alloc_block_size,
|
||||||
@ -411,7 +411,7 @@ THD::~THD()
|
|||||||
dbug_sentry = THD_SENTRY_GONE;
|
dbug_sentry = THD_SENTRY_GONE;
|
||||||
#endif
|
#endif
|
||||||
/* Reset stmt_backup.mem_root to not double-free memory from thd.mem_root */
|
/* Reset stmt_backup.mem_root to not double-free memory from thd.mem_root */
|
||||||
clear_alloc_root(&stmt_backup.mem_root);
|
clear_alloc_root(&stmt_backup.main_mem_root);
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1394,10 +1394,10 @@ void select_dumpvar::cleanup()
|
|||||||
for memory root initialization.
|
for memory root initialization.
|
||||||
*/
|
*/
|
||||||
Item_arena::Item_arena(THD* thd)
|
Item_arena::Item_arena(THD* thd)
|
||||||
:free_list(0),
|
:free_list(0), mem_root(&main_mem_root),
|
||||||
state(INITIALIZED)
|
state(INITIALIZED)
|
||||||
{
|
{
|
||||||
init_sql_alloc(&mem_root,
|
init_sql_alloc(&main_mem_root,
|
||||||
thd->variables.query_alloc_block_size,
|
thd->variables.query_alloc_block_size,
|
||||||
thd->variables.query_prealloc_size);
|
thd->variables.query_prealloc_size);
|
||||||
}
|
}
|
||||||
@ -1420,11 +1420,11 @@ Item_arena::Item_arena(THD* thd)
|
|||||||
statements.
|
statements.
|
||||||
*/
|
*/
|
||||||
Item_arena::Item_arena(bool init_mem_root)
|
Item_arena::Item_arena(bool init_mem_root)
|
||||||
:free_list(0),
|
:free_list(0), mem_root(&main_mem_root),
|
||||||
state(CONVENTIONAL_EXECUTION)
|
state(CONVENTIONAL_EXECUTION)
|
||||||
{
|
{
|
||||||
if (init_mem_root)
|
if (init_mem_root)
|
||||||
init_sql_alloc(&mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0);
|
init_sql_alloc(&main_mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1518,13 +1518,16 @@ void THD::end_statement()
|
|||||||
|
|
||||||
void Item_arena::set_n_backup_item_arena(Item_arena *set, Item_arena *backup)
|
void Item_arena::set_n_backup_item_arena(Item_arena *set, Item_arena *backup)
|
||||||
{
|
{
|
||||||
|
DBUG_ENTER("Item_arena::set_n_backup_item_arena");
|
||||||
backup->set_item_arena(this);
|
backup->set_item_arena(this);
|
||||||
set_item_arena(set);
|
set_item_arena(set);
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Item_arena::restore_backup_item_arena(Item_arena *set, Item_arena *backup)
|
void Item_arena::restore_backup_item_arena(Item_arena *set, Item_arena *backup)
|
||||||
{
|
{
|
||||||
|
DBUG_ENTER("Item_arena::restore_backup_item_arena");
|
||||||
set->set_item_arena(this);
|
set->set_item_arena(this);
|
||||||
set_item_arena(backup);
|
set_item_arena(backup);
|
||||||
#ifdef NOT_NEEDED_NOW
|
#ifdef NOT_NEEDED_NOW
|
||||||
@ -1537,18 +1540,19 @@ void Item_arena::restore_backup_item_arena(Item_arena *set, Item_arena *backup)
|
|||||||
*/
|
*/
|
||||||
clear_alloc_root(&backup->mem_root);
|
clear_alloc_root(&backup->mem_root);
|
||||||
#endif
|
#endif
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item_arena::set_item_arena(Item_arena *set)
|
void Item_arena::set_item_arena(Item_arena *set)
|
||||||
{
|
{
|
||||||
mem_root= set->mem_root;
|
mem_root= set->mem_root;
|
||||||
free_list= set->free_list;
|
free_list= set->free_list;
|
||||||
state= set->state;
|
state= set->state;
|
||||||
}
|
}
|
||||||
|
|
||||||
Statement::~Statement()
|
Statement::~Statement()
|
||||||
{
|
{
|
||||||
free_root(&mem_root, MYF(0));
|
free_root(&main_mem_root, MYF(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
C_MODE_START
|
C_MODE_START
|
||||||
|
@ -429,7 +429,8 @@ public:
|
|||||||
itself to the list on creation (see Item::Item() for details))
|
itself to the list on creation (see Item::Item() for details))
|
||||||
*/
|
*/
|
||||||
Item *free_list;
|
Item *free_list;
|
||||||
MEM_ROOT mem_root;
|
MEM_ROOT main_mem_root;
|
||||||
|
MEM_ROOT *mem_root; // Pointer to current memroot
|
||||||
enum enum_state
|
enum enum_state
|
||||||
{
|
{
|
||||||
INITIALIZED= 0, PREPARED= 1, EXECUTED= 3, CONVENTIONAL_EXECUTION= 2,
|
INITIALIZED= 0, PREPARED= 1, EXECUTED= 3, CONVENTIONAL_EXECUTION= 2,
|
||||||
@ -468,24 +469,24 @@ public:
|
|||||||
{ return state == PREPARED || state == EXECUTED; }
|
{ return state == PREPARED || state == EXECUTED; }
|
||||||
inline bool is_conventional_execution() const
|
inline bool is_conventional_execution() const
|
||||||
{ return state == CONVENTIONAL_EXECUTION; }
|
{ return state == CONVENTIONAL_EXECUTION; }
|
||||||
inline gptr alloc(unsigned int size) { return alloc_root(&mem_root,size); }
|
inline gptr alloc(unsigned int size) { return alloc_root(mem_root,size); }
|
||||||
inline gptr calloc(unsigned int size)
|
inline gptr calloc(unsigned int size)
|
||||||
{
|
{
|
||||||
gptr ptr;
|
gptr ptr;
|
||||||
if ((ptr=alloc_root(&mem_root,size)))
|
if ((ptr=alloc_root(mem_root,size)))
|
||||||
bzero((char*) ptr,size);
|
bzero((char*) ptr,size);
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
inline char *strdup(const char *str)
|
inline char *strdup(const char *str)
|
||||||
{ return strdup_root(&mem_root,str); }
|
{ return strdup_root(mem_root,str); }
|
||||||
inline char *strmake(const char *str, uint size)
|
inline char *strmake(const char *str, uint size)
|
||||||
{ return strmake_root(&mem_root,str,size); }
|
{ return strmake_root(mem_root,str,size); }
|
||||||
inline char *memdup(const char *str, uint size)
|
inline char *memdup(const char *str, uint size)
|
||||||
{ return memdup_root(&mem_root,str,size); }
|
{ return memdup_root(mem_root,str,size); }
|
||||||
inline char *memdup_w_gap(const char *str, uint size, uint gap)
|
inline char *memdup_w_gap(const char *str, uint size, uint gap)
|
||||||
{
|
{
|
||||||
gptr ptr;
|
gptr ptr;
|
||||||
if ((ptr=alloc_root(&mem_root,size+gap)))
|
if ((ptr=alloc_root(mem_root,size+gap)))
|
||||||
memcpy(ptr,str,size);
|
memcpy(ptr,str,size);
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
@ -1052,11 +1053,26 @@ public:
|
|||||||
inline CHARSET_INFO *charset() { return variables.character_set_client; }
|
inline CHARSET_INFO *charset() { return variables.character_set_client; }
|
||||||
void update_charset();
|
void update_charset();
|
||||||
|
|
||||||
|
inline Item_arena *change_arena_if_needed(Item_arena *backup)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
use new arena if we are in a prepared statements and we have not
|
||||||
|
already changed to use this arena.
|
||||||
|
*/
|
||||||
|
if (current_arena->is_stmt_prepare() &&
|
||||||
|
mem_root != ¤t_arena->main_mem_root)
|
||||||
|
{
|
||||||
|
set_n_backup_item_arena(current_arena, backup);
|
||||||
|
return current_arena;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void change_item_tree(Item **place, Item *new_value)
|
void change_item_tree(Item **place, Item *new_value)
|
||||||
{
|
{
|
||||||
/* TODO: check for OOM condition here */
|
/* TODO: check for OOM condition here */
|
||||||
if (!current_arena->is_conventional_execution())
|
if (!current_arena->is_conventional_execution())
|
||||||
nocheck_register_item_tree_change(place, *place, &mem_root);
|
nocheck_register_item_tree_change(place, *place, mem_root);
|
||||||
*place= new_value;
|
*place= new_value;
|
||||||
}
|
}
|
||||||
void nocheck_register_item_tree_change(Item **place, Item *old_value,
|
void nocheck_register_item_tree_change(Item **place, Item *old_value,
|
||||||
|
@ -725,7 +725,7 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db,
|
|||||||
if ((mysql_rm_known_files(thd, new_dirp, NullS, newpath,1)) < 0)
|
if ((mysql_rm_known_files(thd, new_dirp, NullS, newpath,1)) < 0)
|
||||||
goto err;
|
goto err;
|
||||||
if (!(copy_of_path= thd->memdup(newpath, length+1)) ||
|
if (!(copy_of_path= thd->memdup(newpath, length+1)) ||
|
||||||
!(dir= new (&thd->mem_root) String(copy_of_path, length,
|
!(dir= new (thd->mem_root) String(copy_of_path, length,
|
||||||
&my_charset_bin)) ||
|
&my_charset_bin)) ||
|
||||||
raid_dirs.push_back(dir))
|
raid_dirs.push_back(dir))
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -113,12 +113,12 @@ MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level,
|
|||||||
The following code is here to change the allocation to not
|
The following code is here to change the allocation to not
|
||||||
use the thd->mem_root, which is freed after each query
|
use the thd->mem_root, which is freed after each query
|
||||||
*/
|
*/
|
||||||
MEM_ROOT *old_root=my_pthread_getspecific_ptr(MEM_ROOT*,THR_MALLOC);
|
MEM_ROOT *old_root= thd->mem_root;
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC, &thd->warn_root);
|
thd->mem_root= &thd->warn_root;
|
||||||
err= new MYSQL_ERROR(thd, code, level, msg);
|
err= new MYSQL_ERROR(thd, code, level, msg);
|
||||||
if (err)
|
if (err)
|
||||||
thd->warn_list.push_back(err);
|
thd->warn_list.push_back(err);
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC, old_root);
|
thd->mem_root= old_root;
|
||||||
}
|
}
|
||||||
thd->warn_count[(uint) level]++;
|
thd->warn_count[(uint) level]++;
|
||||||
thd->total_warn_count++;
|
thd->total_warn_count++;
|
||||||
|
@ -127,7 +127,7 @@ void memorize_variant_topic(THD *thd, TABLE *topics, int count,
|
|||||||
String *name, String *description, String *example)
|
String *name, String *description, String *example)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("memorize_variant_topic");
|
DBUG_ENTER("memorize_variant_topic");
|
||||||
MEM_ROOT *mem_root= &thd->mem_root;
|
MEM_ROOT *mem_root= thd->mem_root;
|
||||||
if (count==0)
|
if (count==0)
|
||||||
{
|
{
|
||||||
get_field(mem_root,find_fields[help_topic_name].field, name);
|
get_field(mem_root,find_fields[help_topic_name].field, name);
|
||||||
@ -138,7 +138,7 @@ void memorize_variant_topic(THD *thd, TABLE *topics, int count,
|
|||||||
{
|
{
|
||||||
if (count == 1)
|
if (count == 1)
|
||||||
names->push_back(name);
|
names->push_back(name);
|
||||||
String *new_name= new (&thd->mem_root) String;
|
String *new_name= new (thd->mem_root) String;
|
||||||
get_field(mem_root,find_fields[help_topic_name].field,new_name);
|
get_field(mem_root,find_fields[help_topic_name].field,new_name);
|
||||||
names->push_back(new_name);
|
names->push_back(new_name);
|
||||||
}
|
}
|
||||||
@ -351,8 +351,8 @@ int search_categories(THD *thd, TABLE *categories,
|
|||||||
{
|
{
|
||||||
if (select && !select->cond->val_int())
|
if (select && !select->cond->val_int())
|
||||||
continue;
|
continue;
|
||||||
String *lname= new (&thd->mem_root) String;
|
String *lname= new (thd->mem_root) String;
|
||||||
get_field(&thd->mem_root,pfname,lname);
|
get_field(thd->mem_root,pfname,lname);
|
||||||
if (++count == 1 && res_id)
|
if (++count == 1 && res_id)
|
||||||
*res_id= (int16) pcat_id->val_int();
|
*res_id= (int16) pcat_id->val_int();
|
||||||
names->push_back(lname);
|
names->push_back(lname);
|
||||||
@ -385,8 +385,8 @@ void get_all_items_for_category(THD *thd, TABLE *items, Field *pfname,
|
|||||||
{
|
{
|
||||||
if (!select->cond->val_int())
|
if (!select->cond->val_int())
|
||||||
continue;
|
continue;
|
||||||
String *name= new (&thd->mem_root) String();
|
String *name= new (thd->mem_root) String();
|
||||||
get_field(&thd->mem_root,pfname,name);
|
get_field(thd->mem_root,pfname,name);
|
||||||
res->push_back(name);
|
res->push_back(name);
|
||||||
}
|
}
|
||||||
end_read_record(&read_record_info);
|
end_read_record(&read_record_info);
|
||||||
@ -638,7 +638,7 @@ int mysqld_help(THD *thd, const char *mask)
|
|||||||
String name, description, example;
|
String name, description, example;
|
||||||
int res, count_topics, count_categories, error;
|
int res, count_topics, count_categories, error;
|
||||||
uint mlen= strlen(mask);
|
uint mlen= strlen(mask);
|
||||||
MEM_ROOT *mem_root= &thd->mem_root;
|
MEM_ROOT *mem_root= thd->mem_root;
|
||||||
|
|
||||||
if (open_and_lock_tables(thd, tables))
|
if (open_and_lock_tables(thd, tables))
|
||||||
{
|
{
|
||||||
|
@ -202,7 +202,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
|
|||||||
{
|
{
|
||||||
/* it should be allocated before Item::fix_fields() */
|
/* it should be allocated before Item::fix_fields() */
|
||||||
table->insert_values=
|
table->insert_values=
|
||||||
(byte *)alloc_root(&thd->mem_root, table->rec_buff_length);
|
(byte *)alloc_root(thd->mem_root, table->rec_buff_length);
|
||||||
if (!table->insert_values)
|
if (!table->insert_values)
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
@ -924,7 +924,7 @@ TABLE *delayed_insert::get_local_table(THD* client_thd)
|
|||||||
found_next_number_field=table->found_next_number_field;
|
found_next_number_field=table->found_next_number_field;
|
||||||
for (org_field=table->field ; *org_field ; org_field++,field++)
|
for (org_field=table->field ; *org_field ; org_field++,field++)
|
||||||
{
|
{
|
||||||
if (!(*field= (*org_field)->new_field(&client_thd->mem_root,copy)))
|
if (!(*field= (*org_field)->new_field(client_thd->mem_root,copy)))
|
||||||
return 0;
|
return 0;
|
||||||
(*field)->orig_table= copy; // Remove connection
|
(*field)->orig_table= copy; // Remove connection
|
||||||
(*field)->move_field(adjust_ptrs); // Point at copy->record[0]
|
(*field)->move_field(adjust_ptrs); // Point at copy->record[0]
|
||||||
|
@ -1026,7 +1026,7 @@ pthread_handler_decl(handle_one_connection,arg)
|
|||||||
}
|
}
|
||||||
if (thd->user_connect)
|
if (thd->user_connect)
|
||||||
decrease_user_connections(thd->user_connect);
|
decrease_user_connections(thd->user_connect);
|
||||||
free_root(&thd->mem_root,MYF(0));
|
free_root(thd->mem_root,MYF(0));
|
||||||
if (net->error && net->vio != 0 && net->report_error)
|
if (net->error && net->vio != 0 && net->report_error)
|
||||||
{
|
{
|
||||||
if (!thd->killed && thd->variables.log_warnings > 1)
|
if (!thd->killed && thd->variables.log_warnings > 1)
|
||||||
@ -1121,14 +1121,14 @@ extern "C" pthread_handler_decl(handle_bootstrap,arg)
|
|||||||
{
|
{
|
||||||
thd->net.error = 0;
|
thd->net.error = 0;
|
||||||
close_thread_tables(thd); // Free tables
|
close_thread_tables(thd); // Free tables
|
||||||
free_root(&thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mysql_parse(thd,thd->query,length);
|
mysql_parse(thd,thd->query,length);
|
||||||
close_thread_tables(thd); // Free tables
|
close_thread_tables(thd); // Free tables
|
||||||
if (thd->is_fatal_error)
|
if (thd->is_fatal_error)
|
||||||
break;
|
break;
|
||||||
free_root(&thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
||||||
free_root(&thd->transaction.mem_root,MYF(MY_KEEP_PREALLOC));
|
free_root(&thd->transaction.mem_root,MYF(MY_KEEP_PREALLOC));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1681,7 +1681,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
#endif
|
#endif
|
||||||
close_connection(thd, 0, 1);
|
close_connection(thd, 0, 1);
|
||||||
close_thread_tables(thd); // Free before kill
|
close_thread_tables(thd); // Free before kill
|
||||||
free_root(&thd->mem_root,MYF(0));
|
free_root(thd->mem_root,MYF(0));
|
||||||
free_root(&thd->transaction.mem_root,MYF(0));
|
free_root(&thd->transaction.mem_root,MYF(0));
|
||||||
kill_mysql();
|
kill_mysql();
|
||||||
error=TRUE;
|
error=TRUE;
|
||||||
@ -1808,7 +1808,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
thread_running--;
|
thread_running--;
|
||||||
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
||||||
thd->packet.shrink(thd->variables.net_buffer_length); // Reclaim some memory
|
thd->packet.shrink(thd->variables.net_buffer_length); // Reclaim some memory
|
||||||
free_root(&thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2062,7 +2062,7 @@ mysql_execute_command(THD *thd)
|
|||||||
|
|
||||||
query_len= need_conversion? (pstr->length() * to_cs->mbmaxlen) :
|
query_len= need_conversion? (pstr->length() * to_cs->mbmaxlen) :
|
||||||
pstr->length();
|
pstr->length();
|
||||||
if (!(query_str= alloc_root(&thd->mem_root, query_len+1)))
|
if (!(query_str= alloc_root(thd->mem_root, query_len+1)))
|
||||||
{
|
{
|
||||||
res= -1;
|
res= -1;
|
||||||
break; // EOM (error should be reported by allocator)
|
break; // EOM (error should be reported by allocator)
|
||||||
@ -3937,8 +3937,8 @@ mysql_init_select(LEX *lex)
|
|||||||
bool
|
bool
|
||||||
mysql_new_select(LEX *lex, bool move_down)
|
mysql_new_select(LEX *lex, bool move_down)
|
||||||
{
|
{
|
||||||
SELECT_LEX *select_lex = new(&lex->thd->mem_root) SELECT_LEX();
|
SELECT_LEX *select_lex;
|
||||||
if (!select_lex)
|
if (!(select_lex= new(lex->thd->mem_root) SELECT_LEX()))
|
||||||
return 1;
|
return 1;
|
||||||
select_lex->select_number= ++lex->thd->select_number;
|
select_lex->select_number= ++lex->thd->select_number;
|
||||||
select_lex->init_query();
|
select_lex->init_query();
|
||||||
@ -3946,9 +3946,10 @@ mysql_new_select(LEX *lex, bool move_down)
|
|||||||
if (move_down)
|
if (move_down)
|
||||||
{
|
{
|
||||||
/* first select_lex of subselect or derived table */
|
/* first select_lex of subselect or derived table */
|
||||||
SELECT_LEX_UNIT *unit= new(&lex->thd->mem_root) SELECT_LEX_UNIT();
|
SELECT_LEX_UNIT *unit;
|
||||||
if (!unit)
|
if (!(unit= new(lex->thd->mem_root) SELECT_LEX_UNIT()))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
unit->init_query();
|
unit->init_query();
|
||||||
unit->init_select();
|
unit->init_select();
|
||||||
unit->thd= lex->thd;
|
unit->thd= lex->thd;
|
||||||
@ -3970,7 +3971,8 @@ mysql_new_select(LEX *lex, bool move_down)
|
|||||||
as far as we included SELECT_LEX for UNION unit should have
|
as far as we included SELECT_LEX for UNION unit should have
|
||||||
fake SELECT_LEX for UNION processing
|
fake SELECT_LEX for UNION processing
|
||||||
*/
|
*/
|
||||||
fake= unit->fake_select_lex= new(&lex->thd->mem_root) SELECT_LEX();
|
if (!(fake= unit->fake_select_lex= new(lex->thd->mem_root) SELECT_LEX()))
|
||||||
|
return 1;
|
||||||
fake->include_standalone(unit,
|
fake->include_standalone(unit,
|
||||||
(SELECT_LEX_NODE**)&unit->fake_select_lex);
|
(SELECT_LEX_NODE**)&unit->fake_select_lex);
|
||||||
fake->select_number= INT_MAX;
|
fake->select_number= INT_MAX;
|
||||||
|
@ -1065,7 +1065,7 @@ static int mysql_test_select(Prepared_statement *stmt,
|
|||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!lex->result && !(lex->result= new (&stmt->mem_root) select_send))
|
if (!lex->result && !(lex->result= new (stmt->mem_root) select_send))
|
||||||
{
|
{
|
||||||
send_error(thd);
|
send_error(thd);
|
||||||
goto err;
|
goto err;
|
||||||
@ -1503,7 +1503,7 @@ static bool init_param_array(Prepared_statement *stmt)
|
|||||||
List_iterator<Item_param> param_iterator(lex->param_list);
|
List_iterator<Item_param> param_iterator(lex->param_list);
|
||||||
/* Use thd->mem_root as it points at statement mem_root */
|
/* Use thd->mem_root as it points at statement mem_root */
|
||||||
stmt->param_array= (Item_param **)
|
stmt->param_array= (Item_param **)
|
||||||
alloc_root(&stmt->thd->mem_root,
|
alloc_root(stmt->thd->mem_root,
|
||||||
sizeof(Item_param*) * stmt->param_count);
|
sizeof(Item_param*) * stmt->param_count);
|
||||||
if (!stmt->param_array)
|
if (!stmt->param_array)
|
||||||
{
|
{
|
||||||
@ -1569,7 +1569,7 @@ int mysql_stmt_prepare(THD *thd, char *packet, uint packet_length,
|
|||||||
if (name)
|
if (name)
|
||||||
{
|
{
|
||||||
stmt->name.length= name->length;
|
stmt->name.length= name->length;
|
||||||
if (!(stmt->name.str= memdup_root(&stmt->mem_root, (char*)name->str,
|
if (!(stmt->name.str= memdup_root(stmt->mem_root, (char*)name->str,
|
||||||
name->length)))
|
name->length)))
|
||||||
{
|
{
|
||||||
delete stmt;
|
delete stmt;
|
||||||
|
@ -4603,7 +4603,7 @@ static Field* create_tmp_field_from_field(THD *thd, Field* org_field,
|
|||||||
org_field->field_name, table,
|
org_field->field_name, table,
|
||||||
org_field->charset());
|
org_field->charset());
|
||||||
else
|
else
|
||||||
new_field= org_field->new_field(&thd->mem_root, table);
|
new_field= org_field->new_field(thd->mem_root, table);
|
||||||
if (new_field)
|
if (new_field)
|
||||||
{
|
{
|
||||||
if (modify_item)
|
if (modify_item)
|
||||||
@ -5206,7 +5206,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
|||||||
if (!using_unique_constraint)
|
if (!using_unique_constraint)
|
||||||
{
|
{
|
||||||
group->buff=(char*) group_buff;
|
group->buff=(char*) group_buff;
|
||||||
if (!(group->field=field->new_field(&thd->mem_root,table)))
|
if (!(group->field=field->new_field(thd->mem_root,table)))
|
||||||
goto err; /* purecov: inspected */
|
goto err; /* purecov: inspected */
|
||||||
if (maybe_null)
|
if (maybe_null)
|
||||||
{
|
{
|
||||||
@ -8499,7 +8499,7 @@ setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param,
|
|||||||
saved value
|
saved value
|
||||||
*/
|
*/
|
||||||
Field *field= item->field;
|
Field *field= item->field;
|
||||||
item->result_field=field->new_field(&thd->mem_root,field->table);
|
item->result_field=field->new_field(thd->mem_root,field->table);
|
||||||
char *tmp=(char*) sql_alloc(field->pack_length()+1);
|
char *tmp=(char*) sql_alloc(field->pack_length()+1);
|
||||||
if (!tmp)
|
if (!tmp)
|
||||||
goto err;
|
goto err;
|
||||||
@ -8942,7 +8942,7 @@ bool JOIN::rollup_init()
|
|||||||
return 1;
|
return 1;
|
||||||
rollup.ref_pointer_arrays= (Item***) (rollup.fields + send_group_parts);
|
rollup.ref_pointer_arrays= (Item***) (rollup.fields + send_group_parts);
|
||||||
ref_array= (Item**) (rollup.ref_pointer_arrays+send_group_parts);
|
ref_array= (Item**) (rollup.ref_pointer_arrays+send_group_parts);
|
||||||
rollup.item_null= new (&thd->mem_root) Item_null();
|
rollup.item_null= new (thd->mem_root) Item_null();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Prepare space for field list for the different levels
|
Prepare space for field list for the different levels
|
||||||
|
@ -354,7 +354,7 @@ class store_key :public Sql_alloc
|
|||||||
field_arg->table, field_arg->charset());
|
field_arg->table, field_arg->charset());
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
to_field=field_arg->new_field(&thd->mem_root,field_arg->table);
|
to_field=field_arg->new_field(thd->mem_root,field_arg->table);
|
||||||
if (to_field)
|
if (to_field)
|
||||||
to_field->move_field(ptr, (uchar*) null, 1);
|
to_field->move_field(ptr, (uchar*) null, 1);
|
||||||
}
|
}
|
||||||
|
@ -313,24 +313,24 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
|
|||||||
We're in statement prepare or in execution
|
We're in statement prepare or in execution
|
||||||
of a conventional statement.
|
of a conventional statement.
|
||||||
*/
|
*/
|
||||||
Item_arena backup;
|
Item_arena *tmp_arena,backup;
|
||||||
if (arena->is_stmt_prepare())
|
tmp_arena= thd->change_arena_if_needed(&backup);
|
||||||
thd->set_n_backup_item_arena(arena, &backup);
|
|
||||||
Field **field;
|
Field **field;
|
||||||
for (field= table->field; *field; field++)
|
for (field= table->field; *field; field++)
|
||||||
{
|
{
|
||||||
Item_field *item= new Item_field(*field);
|
Item_field *item= new Item_field(*field);
|
||||||
if (!item || item_list.push_back(item))
|
if (!item || item_list.push_back(item))
|
||||||
{
|
{
|
||||||
if (arena->is_stmt_prepare())
|
if (tmp_arena)
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
thd->restore_backup_item_arena(tmp_arena, &backup);
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (tmp_arena)
|
||||||
|
thd->restore_backup_item_arena(tmp_arena, &backup);
|
||||||
if (arena->is_stmt_prepare())
|
if (arena->is_stmt_prepare())
|
||||||
{
|
{
|
||||||
thd->restore_backup_item_arena(arena, &backup);
|
|
||||||
|
|
||||||
/* prepare fake select to initialize it correctly */
|
/* prepare fake select to initialize it correctly */
|
||||||
ulong options_tmp= init_prepare_fake_select_lex(thd);
|
ulong options_tmp= init_prepare_fake_select_lex(thd);
|
||||||
if (!(fake_select_lex->join= new JOIN(thd, item_list, thd->options,
|
if (!(fake_select_lex->join= new JOIN(thd, item_list, thd->options,
|
||||||
|
@ -3297,7 +3297,7 @@ opt_distinct:
|
|||||||
|DISTINCT { $$ = 1; };
|
|DISTINCT { $$ = 1; };
|
||||||
|
|
||||||
opt_gconcat_separator:
|
opt_gconcat_separator:
|
||||||
/* empty */ { $$ = new (&YYTHD->mem_root) String(",",1,default_charset_info); }
|
/* empty */ { $$ = new (YYTHD->mem_root) String(",",1,default_charset_info); }
|
||||||
|SEPARATOR_SYM text_string { $$ = $2; };
|
|SEPARATOR_SYM text_string { $$ = $2; };
|
||||||
|
|
||||||
|
|
||||||
@ -3551,15 +3551,15 @@ key_list_or_empty:
|
|||||||
key_usage_list2:
|
key_usage_list2:
|
||||||
key_usage_list2 ',' ident
|
key_usage_list2 ',' ident
|
||||||
{ Select->
|
{ Select->
|
||||||
interval_list.push_back(new (&YYTHD->mem_root) String((const char*) $3.str, $3.length,
|
interval_list.push_back(new (YYTHD->mem_root) String((const char*) $3.str, $3.length,
|
||||||
system_charset_info)); }
|
system_charset_info)); }
|
||||||
| ident
|
| ident
|
||||||
{ Select->
|
{ Select->
|
||||||
interval_list.push_back(new (&YYTHD->mem_root) String((const char*) $1.str, $1.length,
|
interval_list.push_back(new (YYTHD->mem_root) String((const char*) $1.str, $1.length,
|
||||||
system_charset_info)); }
|
system_charset_info)); }
|
||||||
| PRIMARY_SYM
|
| PRIMARY_SYM
|
||||||
{ Select->
|
{ Select->
|
||||||
interval_list.push_back(new (&YYTHD->mem_root) String("PRIMARY", 7,
|
interval_list.push_back(new (YYTHD->mem_root) String("PRIMARY", 7,
|
||||||
system_charset_info)); };
|
system_charset_info)); };
|
||||||
|
|
||||||
using_list:
|
using_list:
|
||||||
@ -4507,7 +4507,7 @@ opt_db:
|
|||||||
wild:
|
wild:
|
||||||
/* empty */
|
/* empty */
|
||||||
| LIKE TEXT_STRING_sys
|
| LIKE TEXT_STRING_sys
|
||||||
{ Lex->wild= new (&YYTHD->mem_root) String($2.str, $2.length,
|
{ Lex->wild= new (YYTHD->mem_root) String($2.str, $2.length,
|
||||||
system_charset_info); };
|
system_charset_info); };
|
||||||
|
|
||||||
opt_full:
|
opt_full:
|
||||||
@ -4561,7 +4561,7 @@ opt_describe_column:
|
|||||||
/* empty */ {}
|
/* empty */ {}
|
||||||
| text_string { Lex->wild= $1; }
|
| text_string { Lex->wild= $1; }
|
||||||
| ident
|
| ident
|
||||||
{ Lex->wild= new (&YYTHD->mem_root) String((const char*) $1.str,$1.length,system_charset_info); };
|
{ Lex->wild= new (YYTHD->mem_root) String((const char*) $1.str,$1.length,system_charset_info); };
|
||||||
|
|
||||||
|
|
||||||
/* flush things */
|
/* flush things */
|
||||||
@ -4802,7 +4802,7 @@ text_literal:
|
|||||||
|
|
||||||
text_string:
|
text_string:
|
||||||
TEXT_STRING_literal
|
TEXT_STRING_literal
|
||||||
{ $$= new (&YYTHD->mem_root) String($1.str,$1.length,YYTHD->variables.collation_connection); }
|
{ $$= new (YYTHD->mem_root) String($1.str,$1.length,YYTHD->variables.collation_connection); }
|
||||||
| HEX_NUM
|
| HEX_NUM
|
||||||
{
|
{
|
||||||
Item *tmp = new Item_varbinary($1.str,$1.length);
|
Item *tmp = new Item_varbinary($1.str,$1.length);
|
||||||
@ -5821,7 +5821,7 @@ column_list:
|
|||||||
column_list_id:
|
column_list_id:
|
||||||
ident
|
ident
|
||||||
{
|
{
|
||||||
String *new_str = new (&YYTHD->mem_root) String((const char*) $1.str,$1.length,system_charset_info);
|
String *new_str = new (YYTHD->mem_root) String((const char*) $1.str,$1.length,system_charset_info);
|
||||||
List_iterator <LEX_COLUMN> iter(Lex->columns);
|
List_iterator <LEX_COLUMN> iter(Lex->columns);
|
||||||
class LEX_COLUMN *point;
|
class LEX_COLUMN *point;
|
||||||
LEX *lex=Lex;
|
LEX *lex=Lex;
|
||||||
|
14
sql/table.cc
14
sql/table.cc
@ -81,6 +81,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
|
|||||||
uchar *null_pos;
|
uchar *null_pos;
|
||||||
uint null_bit, new_frm_ver, field_pack_length;
|
uint null_bit, new_frm_ver, field_pack_length;
|
||||||
SQL_CRYPT *crypted=0;
|
SQL_CRYPT *crypted=0;
|
||||||
|
MEM_ROOT **root_ptr, *old_root;
|
||||||
DBUG_ENTER("openfrm");
|
DBUG_ENTER("openfrm");
|
||||||
DBUG_PRINT("enter",("name: '%s' form: %lx",name,outparam));
|
DBUG_PRINT("enter",("name: '%s' form: %lx",name,outparam));
|
||||||
|
|
||||||
@ -91,8 +92,9 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
|
|||||||
error=1;
|
error=1;
|
||||||
|
|
||||||
init_sql_alloc(&outparam->mem_root, TABLE_ALLOC_BLOCK_SIZE, 0);
|
init_sql_alloc(&outparam->mem_root, TABLE_ALLOC_BLOCK_SIZE, 0);
|
||||||
MEM_ROOT *old_root=my_pthread_getspecific_ptr(MEM_ROOT*,THR_MALLOC);
|
root_ptr= my_pthread_getspecific_ptr(MEM_ROOT**, THR_MALLOC);
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC,&outparam->mem_root);
|
old_root= *root_ptr;
|
||||||
|
*root_ptr= &outparam->mem_root;
|
||||||
|
|
||||||
outparam->real_name=strdup_root(&outparam->mem_root,
|
outparam->real_name=strdup_root(&outparam->mem_root,
|
||||||
name+dirname_length(name));
|
name+dirname_length(name));
|
||||||
@ -251,9 +253,9 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
|
|||||||
#ifdef HAVE_CRYPTED_FRM
|
#ifdef HAVE_CRYPTED_FRM
|
||||||
else if (*(head+26) == 2)
|
else if (*(head+26) == 2)
|
||||||
{
|
{
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC,old_root);
|
*root_ptr= old_root
|
||||||
crypted=get_crypt_for_frm();
|
crypted=get_crypt_for_frm();
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC,&outparam->mem_root);
|
*root_ptr= &outparam->mem_root;
|
||||||
outparam->crypted=1;
|
outparam->crypted=1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -736,7 +738,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
|
|||||||
}
|
}
|
||||||
outparam->db_low_byte_first=outparam->file->low_byte_first();
|
outparam->db_low_byte_first=outparam->file->low_byte_first();
|
||||||
|
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC,old_root);
|
*root_ptr= old_root;
|
||||||
opened_tables++;
|
opened_tables++;
|
||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
if (use_hash)
|
if (use_hash)
|
||||||
@ -751,7 +753,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
|
|||||||
|
|
||||||
err_end: /* Here when no file */
|
err_end: /* Here when no file */
|
||||||
delete crypted;
|
delete crypted;
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC,old_root);
|
*root_ptr= old_root;
|
||||||
frm_error(error,outparam,name,ME_ERROR+ME_WAITTANG);
|
frm_error(error,outparam,name,ME_ERROR+ME_WAITTANG);
|
||||||
delete outparam->file;
|
delete outparam->file;
|
||||||
outparam->file=0; // For easyer errorchecking
|
outparam->file=0; // For easyer errorchecking
|
||||||
|
@ -38,7 +38,7 @@ void init_sql_alloc(MEM_ROOT *mem_root, uint block_size, uint pre_alloc)
|
|||||||
|
|
||||||
gptr sql_alloc(uint Size)
|
gptr sql_alloc(uint Size)
|
||||||
{
|
{
|
||||||
MEM_ROOT *root=my_pthread_getspecific_ptr(MEM_ROOT*,THR_MALLOC);
|
MEM_ROOT *root= *my_pthread_getspecific_ptr(MEM_ROOT**,THR_MALLOC);
|
||||||
char *ptr= (char*) alloc_root(root,Size);
|
char *ptr= (char*) alloc_root(root,Size);
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
@ -97,11 +97,12 @@ void die(const char *file, int line, const char *expr)
|
|||||||
#define myerror(msg) print_error(msg)
|
#define myerror(msg) print_error(msg)
|
||||||
#define mysterror(stmt, msg) print_st_error(stmt, msg)
|
#define mysterror(stmt, msg) print_st_error(stmt, msg)
|
||||||
|
|
||||||
#define myquery(r) \
|
#define myquery(RES) \
|
||||||
{ \
|
{ \
|
||||||
if (r) \
|
int r= (RES); \
|
||||||
myerror(NULL); \
|
if (r) \
|
||||||
DIE_UNLESS(r == 0); \
|
myerror(NULL); \
|
||||||
|
DIE_UNLESS(r == 0); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define myquery_r(r) \
|
#define myquery_r(r) \
|
||||||
@ -282,38 +283,40 @@ static void client_query()
|
|||||||
|
|
||||||
myheader("client_query");
|
myheader("client_query");
|
||||||
|
|
||||||
rc= mysql_query(mysql, "DROP TABLE IF EXISTS myclient_test");
|
rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "CREATE TABLE myclient_test("
|
rc= mysql_query(mysql, "CREATE TABLE t1("
|
||||||
"id int primary key auto_increment, "
|
"id int primary key auto_increment, "
|
||||||
"name varchar(20))");
|
"name varchar(20))");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "CREATE TABLE myclient_test(id int, name varchar(20))");
|
rc= mysql_query(mysql, "CREATE TABLE t1(id int, name varchar(20))");
|
||||||
myquery_r(rc);
|
myquery_r(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "INSERT INTO myclient_test(name) VALUES('mysql')");
|
rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('mysql')");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "INSERT INTO myclient_test(name) VALUES('monty')");
|
rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('monty')");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "INSERT INTO myclient_test(name) VALUES('venu')");
|
rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('venu')");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "INSERT INTO myclient_test(name) VALUES('deleted')");
|
rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('deleted')");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "INSERT INTO myclient_test(name) VALUES('deleted')");
|
rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('deleted')");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "UPDATE myclient_test SET name= 'updated' "
|
rc= mysql_query(mysql, "UPDATE t1 SET name= 'updated' "
|
||||||
"WHERE name= 'deleted'");
|
"WHERE name= 'deleted'");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "UPDATE myclient_test SET id= 3 WHERE name= 'updated'");
|
rc= mysql_query(mysql, "UPDATE t1 SET id= 3 WHERE name= 'updated'");
|
||||||
myquery_r(rc);
|
myquery_r(rc);
|
||||||
|
|
||||||
|
myquery(mysql_query(mysql, "drop table t1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -743,7 +746,7 @@ static void client_store_result()
|
|||||||
|
|
||||||
myheader("client_store_result");
|
myheader("client_store_result");
|
||||||
|
|
||||||
rc= mysql_query(mysql, "SELECT * FROM myclient_test");
|
rc= mysql_query(mysql, "SELECT * FROM t1");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
/* get the result */
|
/* get the result */
|
||||||
@ -763,7 +766,7 @@ static void client_use_result()
|
|||||||
int rc;
|
int rc;
|
||||||
myheader("client_use_result");
|
myheader("client_use_result");
|
||||||
|
|
||||||
rc= mysql_query(mysql, "SELECT * FROM myclient_test");
|
rc= mysql_query(mysql, "SELECT * FROM t1");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
/* get the result */
|
/* get the result */
|
||||||
@ -7537,17 +7540,17 @@ static void test_fetch_seek()
|
|||||||
char c2[11], c3[20];
|
char c2[11], c3[20];
|
||||||
|
|
||||||
myheader("test_fetch_seek");
|
myheader("test_fetch_seek");
|
||||||
|
rc= mysql_query(mysql, "drop table if exists t1");
|
||||||
|
|
||||||
rc= mysql_query(mysql, "drop table if exists test_seek");
|
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "create table test_seek(c1 int primary key auto_increment, c2 char(10), c3 timestamp(14))");
|
rc= mysql_query(mysql, "create table t1(c1 int primary key auto_increment, c2 char(10), c3 timestamp(14))");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "insert into test_seek(c2) values('venu'), ('mysql'), ('open'), ('source')");
|
rc= mysql_query(mysql, "insert into t1(c2) values('venu'), ('mysql'), ('open'), ('source')");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
stmt= mysql_simple_prepare(mysql, "select * from test_seek");
|
stmt= mysql_simple_prepare(mysql, "select * from t1");
|
||||||
check_stmt(stmt);
|
check_stmt(stmt);
|
||||||
|
|
||||||
bind[0].buffer_type= MYSQL_TYPE_LONG;
|
bind[0].buffer_type= MYSQL_TYPE_LONG;
|
||||||
@ -7620,6 +7623,7 @@ static void test_fetch_seek()
|
|||||||
DIE_UNLESS(rc == MYSQL_NO_DATA);
|
DIE_UNLESS(rc == MYSQL_NO_DATA);
|
||||||
|
|
||||||
mysql_stmt_close(stmt);
|
mysql_stmt_close(stmt);
|
||||||
|
myquery(mysql_query(mysql, "drop table t1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -7637,16 +7641,16 @@ static void test_fetch_offset()
|
|||||||
|
|
||||||
myheader("test_fetch_offset");
|
myheader("test_fetch_offset");
|
||||||
|
|
||||||
rc= mysql_query(mysql, "drop table if exists test_column");
|
rc= mysql_query(mysql, "drop table if exists t1");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "create table test_column(a char(10))");
|
rc= mysql_query(mysql, "create table t1(a char(10))");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "insert into test_column values('abcdefghij'), (null)");
|
rc= mysql_query(mysql, "insert into t1 values('abcdefghij'), (null)");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
stmt= mysql_simple_prepare(mysql, "select * from test_column");
|
stmt= mysql_simple_prepare(mysql, "select * from t1");
|
||||||
check_stmt(stmt);
|
check_stmt(stmt);
|
||||||
|
|
||||||
bind[0].buffer_type= MYSQL_TYPE_STRING;
|
bind[0].buffer_type= MYSQL_TYPE_STRING;
|
||||||
@ -7706,6 +7710,8 @@ static void test_fetch_offset()
|
|||||||
check_execute_r(stmt, rc);
|
check_execute_r(stmt, rc);
|
||||||
|
|
||||||
mysql_stmt_close(stmt);
|
mysql_stmt_close(stmt);
|
||||||
|
|
||||||
|
myquery(mysql_query(mysql, "drop table t1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -7721,16 +7727,16 @@ static void test_fetch_column()
|
|||||||
|
|
||||||
myheader("test_fetch_column");
|
myheader("test_fetch_column");
|
||||||
|
|
||||||
rc= mysql_query(mysql, "drop table if exists test_column");
|
rc= mysql_query(mysql, "drop table if exists t1");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "create table test_column(c1 int primary key auto_increment, c2 char(10))");
|
rc= mysql_query(mysql, "create table t1(c1 int primary key auto_increment, c2 char(10))");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "insert into test_column(c2) values('venu'), ('mysql')");
|
rc= mysql_query(mysql, "insert into t1(c2) values('venu'), ('mysql')");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
stmt= mysql_simple_prepare(mysql, "select * from test_column order by c2 desc");
|
stmt= mysql_simple_prepare(mysql, "select * from t1 order by c2 desc");
|
||||||
check_stmt(stmt);
|
check_stmt(stmt);
|
||||||
|
|
||||||
bind[0].buffer_type= MYSQL_TYPE_LONG;
|
bind[0].buffer_type= MYSQL_TYPE_LONG;
|
||||||
@ -7841,6 +7847,7 @@ static void test_fetch_column()
|
|||||||
check_execute_r(stmt, rc);
|
check_execute_r(stmt, rc);
|
||||||
|
|
||||||
mysql_stmt_close(stmt);
|
mysql_stmt_close(stmt);
|
||||||
|
myquery(mysql_query(mysql, "drop table t1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -7852,27 +7859,28 @@ static void test_list_fields()
|
|||||||
int rc;
|
int rc;
|
||||||
myheader("test_list_fields");
|
myheader("test_list_fields");
|
||||||
|
|
||||||
rc= mysql_query(mysql, "drop table if exists test_list_fields");
|
rc= mysql_query(mysql, "drop table if exists t1");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
rc= mysql_query(mysql, "create table test_list_fields(c1 int primary key auto_increment, c2 char(10) default 'mysql')");
|
rc= mysql_query(mysql, "create table t1(c1 int primary key auto_increment, c2 char(10) default 'mysql')");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
result= mysql_list_fields(mysql, "test_list_fields", NULL);
|
result= mysql_list_fields(mysql, "t1", NULL);
|
||||||
mytest(result);
|
mytest(result);
|
||||||
|
|
||||||
rc= my_process_result_set(result);
|
rc= my_process_result_set(result);
|
||||||
DIE_UNLESS(rc == 0);
|
DIE_UNLESS(rc == 0);
|
||||||
|
|
||||||
verify_prepare_field(result, 0, "c1", "c1", MYSQL_TYPE_LONG,
|
verify_prepare_field(result, 0, "c1", "c1", MYSQL_TYPE_LONG,
|
||||||
"test_list_fields", "test_list_fields",
|
"t1", "t1",
|
||||||
current_db, 11, "0");
|
current_db, 11, "0");
|
||||||
|
|
||||||
verify_prepare_field(result, 1, "c2", "c2", MYSQL_TYPE_STRING,
|
verify_prepare_field(result, 1, "c2", "c2", MYSQL_TYPE_STRING,
|
||||||
"test_list_fields", "test_list_fields",
|
"t1", "t1",
|
||||||
current_db, 10, "mysql");
|
current_db, 10, "mysql");
|
||||||
|
|
||||||
mysql_free_result(result);
|
mysql_free_result(result);
|
||||||
|
myquery(mysql_query(mysql, "drop table t1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -11140,11 +11148,13 @@ static void test_bug4172()
|
|||||||
res= mysql_store_result(mysql);
|
res= mysql_store_result(mysql);
|
||||||
row= mysql_fetch_row(res);
|
row= mysql_fetch_row(res);
|
||||||
|
|
||||||
printf("Binary protocol: float=%s, double=%s, decimal(10,4)=%s\n",
|
if (!opt_silent)
|
||||||
f, d, e);
|
{
|
||||||
printf("Text protocol: float=%s, double=%s, decimal(10,4)=%s\n",
|
printf("Binary protocol: float=%s, double=%s, decimal(10,4)=%s\n",
|
||||||
row[0], row[1], row[2]);
|
f, d, e);
|
||||||
|
printf("Text protocol: float=%s, double=%s, decimal(10,4)=%s\n",
|
||||||
|
row[0], row[1], row[2]);
|
||||||
|
}
|
||||||
DIE_UNLESS(!strcmp(f, row[0]) && !strcmp(d, row[1]) && !strcmp(e, row[2]));
|
DIE_UNLESS(!strcmp(f, row[0]) && !strcmp(d, row[1]) && !strcmp(e, row[2]));
|
||||||
|
|
||||||
mysql_free_result(res);
|
mysql_free_result(res);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user