Commit ab69186d authored by unknown's avatar unknown

Merge mysql.com:/usr/local/bk/mysql-5.0

into mysql.com:/home/pem/work/mysql-5.0


sql/item_cmpfunc.cc:
  Auto merged
sql/item_func.cc:
  Auto merged
sql/item_subselect.cc:
  Auto merged
sql/mysql_priv.h:
  Auto merged
sql/mysqld.cc:
  Auto merged
sql/sp_head.cc:
  Auto merged
sql/sql_parse.cc:
  Auto merged
sql/sql_yacc.yy:
  Auto merged
parents 2dc4e048 75e241bc
...@@ -646,4 +646,12 @@ drop procedure if exists bug10537| ...@@ -646,4 +646,12 @@ drop procedure if exists bug10537|
create procedure bug10537() create procedure bug10537()
load data local infile '/tmp/somefile' into table t1| load data local infile '/tmp/somefile' into table t1|
ERROR 0A000: LOAD DATA is not allowed in stored procedures ERROR 0A000: LOAD DATA is not allowed in stored procedures
drop function if exists bug8409|
create function bug8409()
returns int
begin
flush tables;
return 5;
end|
ERROR 0A000: FLUSH is not allowed in stored procedures
drop table t1| drop table t1|
...@@ -3098,4 +3098,15 @@ call bug5963_2(1)| ...@@ -3098,4 +3098,15 @@ call bug5963_2(1)|
call bug5963_2(1)| call bug5963_2(1)|
drop procedure bug5963_2| drop procedure bug5963_2|
drop table t3| drop table t3|
drop function if exists bug9559|
create function bug9559()
returns int
begin
set @y = -6/2;
return @y;
end|
select bug9559()|
bug9559()
-3
drop function bug9559|
drop table t1,t2; drop table t1,t2;
...@@ -905,6 +905,21 @@ create procedure bug10537() ...@@ -905,6 +905,21 @@ create procedure bug10537()
load data local infile '/tmp/somefile' into table t1| load data local infile '/tmp/somefile' into table t1|
#
# BUG#8409: Stored procedure crash if function contains FLUSH
#
--disable_warnings
drop function if exists bug8409|
--enable_warnings
--error ER_SP_BADSTATEMENT
create function bug8409()
returns int
begin
flush tables;
return 5;
end|
# #
# BUG#NNNN: New bug synopsis # BUG#NNNN: New bug synopsis
# #
......
...@@ -3801,6 +3801,25 @@ call bug5963_2(1)| ...@@ -3801,6 +3801,25 @@ call bug5963_2(1)|
drop procedure bug5963_2| drop procedure bug5963_2|
drop table t3| drop table t3|
#
# BUG#9559: Functions: Numeric Operations using -ve value gives incorrect
# results.
#
--disable_warnings
drop function if exists bug9559|
--enable_warnings
create function bug9559()
returns int
begin
set @y = -6/2;
return @y;
end|
select bug9559()|
drop function bug9559|
# #
# BUG#NNNN: New bug synopsis # BUG#NNNN: New bug synopsis
# #
......
...@@ -2321,7 +2321,7 @@ Item_cond::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) ...@@ -2321,7 +2321,7 @@ Item_cond::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
*/ */
and_tables_cache= ~(table_map) 0; and_tables_cache= ~(table_map) 0;
if (check_stack_overrun(thd, buff)) if (check_stack_overrun(thd, STACK_MIN_SIZE))
return TRUE; // Fatal error flag is set! return TRUE; // Fatal error flag is set!
/* /*
The following optimization reduces the depth of an AND-OR tree. The following optimization reduces the depth of an AND-OR tree.
......
...@@ -293,14 +293,11 @@ Item_func::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) ...@@ -293,14 +293,11 @@ Item_func::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
{ {
DBUG_ASSERT(fixed == 0); DBUG_ASSERT(fixed == 0);
Item **arg,**arg_end; Item **arg,**arg_end;
#ifndef EMBEDDED_LIBRARY // Avoid compiler warning
char buff[STACK_BUFF_ALLOC]; // Max argument in function
#endif
used_tables_cache= not_null_tables_cache= 0; used_tables_cache= not_null_tables_cache= 0;
const_item_cache=1; const_item_cache=1;
if (check_stack_overrun(thd, buff)) if (check_stack_overrun(thd, STACK_MIN_SIZE+STACK_BUFF_ALLOC))
return TRUE; // Fatal error if flag is set! return TRUE; // Fatal error if flag is set!
if (arg_count) if (arg_count)
{ // Print purify happy { // Print purify happy
...@@ -2567,12 +2564,9 @@ bool ...@@ -2567,12 +2564,9 @@ bool
udf_handler::fix_fields(THD *thd, TABLE_LIST *tables, Item_result_field *func, udf_handler::fix_fields(THD *thd, TABLE_LIST *tables, Item_result_field *func,
uint arg_count, Item **arguments) uint arg_count, Item **arguments)
{ {
#ifndef EMBEDDED_LIBRARY // Avoid compiler warning
char buff[STACK_BUFF_ALLOC]; // Max argument in function
#endif
DBUG_ENTER("Item_udf_func::fix_fields"); DBUG_ENTER("Item_udf_func::fix_fields");
if (check_stack_overrun(thd, buff)) if (check_stack_overrun(thd, STACK_MIN_SIZE+STACK_BUFF_ALLOC))
DBUG_RETURN(TRUE); // Fatal error flag is set! DBUG_RETURN(TRUE); // Fatal error flag is set!
udf_func *tmp_udf=find_udf(u_d->name.str,(uint) u_d->name.length,1); udf_func *tmp_udf=find_udf(u_d->name.str,(uint) u_d->name.length,1);
...@@ -3603,7 +3597,7 @@ longlong user_var_entry::val_int(my_bool *null_value) ...@@ -3603,7 +3597,7 @@ longlong user_var_entry::val_int(my_bool *null_value)
case DECIMAL_RESULT: case DECIMAL_RESULT:
{ {
longlong result; longlong result;
my_decimal2int(E_DEC_FATAL_ERROR, (my_decimal *)value, 1, &result); my_decimal2int(E_DEC_FATAL_ERROR, (my_decimal *)value, 0, &result);
return result; return result;
} }
case STRING_RESULT: case STRING_RESULT:
......
...@@ -138,7 +138,7 @@ bool Item_subselect::fix_fields(THD *thd_param, TABLE_LIST *tables, Item **ref) ...@@ -138,7 +138,7 @@ bool Item_subselect::fix_fields(THD *thd_param, TABLE_LIST *tables, Item **ref)
DBUG_ASSERT(fixed == 0); DBUG_ASSERT(fixed == 0);
engine->set_thd((thd= thd_param)); engine->set_thd((thd= thd_param));
if (check_stack_overrun(thd, (gptr)&res)) if (check_stack_overrun(thd, STACK_MIN_SIZE))
return TRUE; return TRUE;
res= engine->prepare(); res= engine->prepare();
......
...@@ -1077,7 +1077,7 @@ extern ulong max_connections,max_connect_errors, connect_timeout; ...@@ -1077,7 +1077,7 @@ extern ulong max_connections,max_connect_errors, connect_timeout;
extern ulong slave_net_timeout, slave_trans_retries; extern ulong slave_net_timeout, slave_trans_retries;
extern uint max_user_connections; extern uint max_user_connections;
extern ulong what_to_log,flush_time; extern ulong what_to_log,flush_time;
extern ulong query_buff_size, thread_stack,thread_stack_min; extern ulong query_buff_size, thread_stack;
extern ulong binlog_cache_size, max_binlog_cache_size, open_files_limit; extern ulong binlog_cache_size, max_binlog_cache_size, open_files_limit;
extern ulong max_binlog_size, max_relay_log_size; extern ulong max_binlog_size, max_relay_log_size;
extern ulong rpl_recovery_rank, thread_cache_size; extern ulong rpl_recovery_rank, thread_cache_size;
...@@ -1429,7 +1429,7 @@ inline int hexchar_to_int(char c) ...@@ -1429,7 +1429,7 @@ inline int hexchar_to_int(char c)
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
extern "C" void unireg_abort(int exit_code); extern "C" void unireg_abort(int exit_code);
void kill_delayed_threads(void); void kill_delayed_threads(void);
bool check_stack_overrun(THD *thd,char *dummy); bool check_stack_overrun(THD *thd, long margin);
#else #else
#define unireg_abort(exit_code) DBUG_RETURN(exit_code) #define unireg_abort(exit_code) DBUG_RETURN(exit_code)
inline void kill_delayed_threads(void) {} inline void kill_delayed_threads(void) {}
......
...@@ -349,7 +349,7 @@ uint tc_heuristic_recover= 0; ...@@ -349,7 +349,7 @@ uint tc_heuristic_recover= 0;
uint volatile thread_count, thread_running; uint volatile thread_count, thread_running;
ulong back_log, connect_timeout, concurrency; ulong back_log, connect_timeout, concurrency;
ulong server_id, thd_startup_options; ulong server_id, thd_startup_options;
ulong table_cache_size, thread_stack, thread_stack_min, what_to_log; ulong table_cache_size, thread_stack, what_to_log;
ulong query_buff_size, slow_launch_time, slave_open_temp_tables; ulong query_buff_size, slow_launch_time, slave_open_temp_tables;
ulong open_files_limit, max_binlog_size, max_relay_log_size; ulong open_files_limit, max_binlog_size, max_relay_log_size;
ulong slave_net_timeout, slave_trans_retries; ulong slave_net_timeout, slave_trans_retries;
...@@ -2090,7 +2090,13 @@ static void start_signal_handler(void) ...@@ -2090,7 +2090,13 @@ static void start_signal_handler(void)
(void) pthread_attr_setdetachstate(&thr_attr,PTHREAD_CREATE_DETACHED); (void) pthread_attr_setdetachstate(&thr_attr,PTHREAD_CREATE_DETACHED);
if (!(opt_specialflag & SPECIAL_NO_PRIOR)) if (!(opt_specialflag & SPECIAL_NO_PRIOR))
my_pthread_attr_setprio(&thr_attr,INTERRUPT_PRIOR); my_pthread_attr_setprio(&thr_attr,INTERRUPT_PRIOR);
#if defined(__ia64__) || defined(__ia64)
/* Peculiar things with ia64 platforms - it seems we only have half the
stack size in reality, so we have to double it here */
pthread_attr_setstacksize(&thr_attr,thread_stack*2);
#else
pthread_attr_setstacksize(&thr_attr,thread_stack); pthread_attr_setstacksize(&thr_attr,thread_stack);
#endif
#endif #endif
(void) pthread_mutex_lock(&LOCK_thread_count); (void) pthread_mutex_lock(&LOCK_thread_count);
...@@ -3011,23 +3017,35 @@ int main(int argc, char **argv) ...@@ -3011,23 +3017,35 @@ int main(int argc, char **argv)
init_signals(); init_signals();
if (!(opt_specialflag & SPECIAL_NO_PRIOR)) if (!(opt_specialflag & SPECIAL_NO_PRIOR))
my_pthread_setprio(pthread_self(),CONNECT_PRIOR); my_pthread_setprio(pthread_self(),CONNECT_PRIOR);
#if defined(__ia64__) || defined(__ia64)
/* Peculiar things with ia64 platforms - it seems we only have half the
stack size in reality, so we have to double it here */
pthread_attr_setstacksize(&connection_attrib,thread_stack*2);
#else
pthread_attr_setstacksize(&connection_attrib,thread_stack); pthread_attr_setstacksize(&connection_attrib,thread_stack);
#endif
#ifdef HAVE_PTHREAD_ATTR_GETSTACKSIZE #ifdef HAVE_PTHREAD_ATTR_GETSTACKSIZE
{ {
/* Retrieve used stack size; Needed for checking stack overflows */ /* Retrieve used stack size; Needed for checking stack overflows */
size_t stack_size= 0; size_t stack_size= 0;
pthread_attr_getstacksize(&connection_attrib, &stack_size); pthread_attr_getstacksize(&connection_attrib, &stack_size);
#if defined(__ia64__) || defined(__ia64)
stack_size/= 2;
#endif
/* We must check if stack_size = 0 as Solaris 2.9 can return 0 here */ /* We must check if stack_size = 0 as Solaris 2.9 can return 0 here */
if (stack_size && stack_size < thread_stack) if (stack_size && stack_size < thread_stack)
{ {
if (global_system_variables.log_warnings) if (global_system_variables.log_warnings)
sql_print_warning("Asked for %ld thread stack, but got %ld", sql_print_warning("Asked for %ld thread stack, but got %ld",
thread_stack, stack_size); thread_stack, stack_size);
#if defined(__ia64__) || defined(__ia64)
thread_stack= stack_size*2;
#else
thread_stack= stack_size; thread_stack= stack_size;
#endif
} }
} }
#endif #endif
thread_stack_min=thread_stack - STACK_MIN_SIZE;
(void) thr_setconcurrency(concurrency); // 10 by default (void) thr_setconcurrency(concurrency); // 10 by default
......
...@@ -564,13 +564,11 @@ sp_head::execute(THD *thd) ...@@ -564,13 +564,11 @@ sp_head::execute(THD *thd)
Item_change_list old_change_list; Item_change_list old_change_list;
String old_packet; String old_packet;
/* Use some extra margin for possible SP recursion and functions */
#ifndef EMBEDDED_LIBRARY if (check_stack_overrun(thd, 4*STACK_MIN_SIZE))
if (check_stack_overrun(thd, olddb))
{ {
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
#endif
dbchanged= FALSE; dbchanged= FALSE;
if (m_db.length && if (m_db.length &&
......
...@@ -4986,11 +4986,11 @@ long max_stack_used; ...@@ -4986,11 +4986,11 @@ long max_stack_used;
#endif #endif
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
bool check_stack_overrun(THD *thd,char *buf __attribute__((unused))) bool check_stack_overrun(THD *thd, long margin)
{ {
long stack_used; long stack_used;
if ((stack_used=used_stack(thd->thread_stack,(char*) &stack_used)) >= if ((stack_used=used_stack(thd->thread_stack,(char*) &stack_used)) >=
(long) thread_stack_min) thread_stack - margin)
{ {
sprintf(errbuff[0],ER(ER_STACK_OVERRUN),stack_used,thread_stack); sprintf(errbuff[0],ER(ER_STACK_OVERRUN),stack_used,thread_stack);
my_message(ER_STACK_OVERRUN,errbuff[0],MYF(0)); my_message(ER_STACK_OVERRUN,errbuff[0],MYF(0));
......
...@@ -6511,6 +6511,11 @@ flush: ...@@ -6511,6 +6511,11 @@ flush:
FLUSH_SYM opt_no_write_to_binlog FLUSH_SYM opt_no_write_to_binlog
{ {
LEX *lex=Lex; LEX *lex=Lex;
if (lex->sphead && lex->sphead->m_type == TYPE_ENUM_FUNCTION)
{
my_error(ER_SP_BADSTATEMENT, MYF(0), "FLUSH");
YYABORT;
}
lex->sql_command= SQLCOM_FLUSH; lex->type=0; lex->sql_command= SQLCOM_FLUSH; lex->type=0;
lex->no_write_to_binlog= $2; lex->no_write_to_binlog= $2;
} }
......
...@@ -1815,7 +1815,7 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, ...@@ -1815,7 +1815,7 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds,
bool res= FALSE; bool res= FALSE;
DBUG_ENTER("st_table_list::setup_ancestor"); DBUG_ENTER("st_table_list::setup_ancestor");
if (check_stack_overrun(thd, (char *)&res)) if (check_stack_overrun(thd, STACK_MIN_SIZE))
return TRUE; return TRUE;
for (tbl= ancestor; tbl; tbl= tbl->next_local) for (tbl= ancestor; tbl; tbl= tbl->next_local)
......
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