Fixes during review of new pushed code

Change bool in C code to my_bool
Added to mysqltest --enable_parsning and --disable_parsing to avoid to have to comment parts of tests
Added comparison of LEX_STRING's and use this to compare file types for view and trigger files.
This commit is contained in:
monty@mishka.local 2005-07-31 12:49:55 +03:00
parent e60d786dde
commit 8437e9c1be
32 changed files with 384 additions and 296 deletions

View File

@ -49,5 +49,6 @@ enum options_client
#ifdef HAVE_NDBCLUSTER_DB #ifdef HAVE_NDBCLUSTER_DB
OPT_NDBCLUSTER, OPT_NDB_CONNECTSTRING, OPT_NDBCLUSTER, OPT_NDB_CONNECTSTRING,
#endif #endif
OPT_IGNORE_TABLE,OPT_INSERT_IGNORE,OPT_SHOW_WARNINGS,OPT_DROP_DATABASE OPT_TRIGGERS,
OPT_IGNORE_TABLE,OPT_INSERT_IGNORE,OPT_SHOW_WARNINGS,OPT_DROP_DATABASE,
}; };

View File

@ -432,7 +432,7 @@ int main(int argc,char *argv[])
put_info((char*) glob_buffer.ptr(),INFO_INFO); put_info((char*) glob_buffer.ptr(),INFO_INFO);
#ifdef HAVE_READLINE #ifdef HAVE_READLINE
initialize_readline(my_progname); initialize_readline((char*) my_progname);
if (!status.batch && !quick && !opt_html && !opt_xml) if (!status.batch && !quick && !opt_html && !opt_xml)
{ {
/* read-history from file, default ~/.mysql_history*/ /* read-history from file, default ~/.mysql_history*/

View File

@ -372,7 +372,7 @@ static struct my_option my_long_options[] =
(gptr*) &path, (gptr*) &path, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, (gptr*) &path, (gptr*) &path, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"tables", OPT_TABLES, "Overrides option --databases (-B).", {"tables", OPT_TABLES, "Overrides option --databases (-B).",
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
{"triggers", '/0', "Dump triggers for each dumped table", {"triggers", OPT_TRIGGERS, "Dump triggers for each dumped table",
(gptr*) &opt_dump_triggers, (gptr*) &opt_dump_triggers, 0, GET_BOOL, (gptr*) &opt_dump_triggers, (gptr*) &opt_dump_triggers, 0, GET_BOOL,
NO_ARG, 1, 0, 0, 0, 0, 0}, NO_ARG, 1, 0, 0, 0, 0, 0},
#ifndef DONT_ALLOW_USER_CHANGE #ifndef DONT_ALLOW_USER_CHANGE
@ -424,6 +424,7 @@ void check_io(FILE *file)
if (ferror(file)) if (ferror(file))
{ {
fprintf(stderr, "%s: Got errno %d on write\n", my_progname, errno); fprintf(stderr, "%s: Got errno %d on write\n", my_progname, errno);
ignore_errors= 0; /* We can't ignore this error */
safe_exit(EX_EOF); safe_exit(EX_EOF);
} }
} }
@ -2610,7 +2611,7 @@ static int do_show_master_status(MYSQL *mysql_con)
{ {
/* SHOW MASTER STATUS reports nothing and --force is not enabled */ /* SHOW MASTER STATUS reports nothing and --force is not enabled */
my_printf_error(0, "Error: Binlogging on server not active", my_printf_error(0, "Error: Binlogging on server not active",
MYF(0), mysql_error(mysql_con)); MYF(0));
mysql_free_result(master); mysql_free_result(master);
return 1; return 1;
} }
@ -2979,11 +2980,12 @@ static my_bool get_view_structure(char *table, char* db)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
MY_INIT("mysqldump");
compatible_mode_normal_str[0]= 0; compatible_mode_normal_str[0]= 0;
default_charset= (char *)mysql_universal_client_charset; default_charset= (char *)mysql_universal_client_charset;
bzero((char*) &ignore_table, sizeof(ignore_table)); bzero((char*) &ignore_table, sizeof(ignore_table));
MY_INIT("mysqldump");
if (get_options(&argc, &argv)) if (get_options(&argc, &argv))
{ {
my_end(0); my_end(0);

View File

@ -42,7 +42,7 @@
**********************************************************************/ **********************************************************************/
#define MTEST_VERSION "2.4" #define MTEST_VERSION "2.5"
#include <my_global.h> #include <my_global.h>
#include <mysql_embed.h> #include <mysql_embed.h>
@ -151,6 +151,7 @@ const char* user = 0, *host = 0, *unix_sock = 0, *opt_basedir="./";
static int port = 0; static int port = 0;
static my_bool opt_big_test= 0, opt_compress= 0, silent= 0, verbose = 0; static my_bool opt_big_test= 0, opt_compress= 0, silent= 0, verbose = 0;
static my_bool tty_password= 0, ps_protocol= 0, ps_protocol_enabled= 0; static my_bool tty_password= 0, ps_protocol= 0, ps_protocol_enabled= 0;
static int parsing_disabled= 0;
static uint start_lineno, *lineno; static uint start_lineno, *lineno;
const char* manager_user="root",*manager_host=0; const char* manager_user="root",*manager_host=0;
char *manager_pass=0; char *manager_pass=0;
@ -308,6 +309,7 @@ Q_CHARACTER_SET, Q_DISABLE_PS_PROTOCOL, Q_ENABLE_PS_PROTOCOL,
Q_EXIT, Q_EXIT,
Q_DISABLE_RECONNECT, Q_ENABLE_RECONNECT, Q_DISABLE_RECONNECT, Q_ENABLE_RECONNECT,
Q_IF, Q_IF,
Q_DISABLE_PARSING, Q_ENABLE_PARSING,
Q_UNKNOWN, /* Unknown command. */ Q_UNKNOWN, /* Unknown command. */
Q_COMMENT, /* Comments, ignored. */ Q_COMMENT, /* Comments, ignored. */
@ -399,6 +401,8 @@ const char *command_names[]=
"disable_reconnect", "disable_reconnect",
"enable_reconnect", "enable_reconnect",
"if", "if",
"disable_parsing",
"enable_parsing",
0 0
}; };
@ -2141,7 +2145,7 @@ int read_line(char* buf, int size)
} }
break; break;
case R_LINE_START: case R_LINE_START:
if (c == '#' || c == '-') if (c == '#' || c == '-' || parsing_disabled)
{ {
state = R_COMMENT; state = R_COMMENT;
} }
@ -2268,18 +2272,22 @@ int read_query(struct st_query** q_ptr)
/* This goto is to avoid losing the "expected error" info. */ /* This goto is to avoid losing the "expected error" info. */
goto end; goto end;
} }
memcpy((gptr) q->expected_errno, (gptr) global_expected_errno, if (!parsing_disabled)
sizeof(global_expected_errno)); {
q->expected_errors= global_expected_errors; memcpy((gptr) q->expected_errno, (gptr) global_expected_errno,
q->abort_on_error= (global_expected_errors == 0 && abort_on_error); sizeof(global_expected_errno));
bzero((gptr) global_expected_errno, sizeof(global_expected_errno)); q->expected_errors= global_expected_errors;
global_expected_errors=0; q->abort_on_error= (global_expected_errors == 0 && abort_on_error);
bzero((gptr) global_expected_errno, sizeof(global_expected_errno));
global_expected_errors=0;
}
if (p[0] == '-' && p[1] == '-') if (p[0] == '-' && p[1] == '-')
{ {
q->type= Q_COMMENT_WITH_COMMAND; q->type= Q_COMMENT_WITH_COMMAND;
p+= 2; /* To calculate first word */ p+= 2; /* To calculate first word */
} }
else else if (!parsing_disabled)
{ {
if (*p == '!') if (*p == '!')
{ {
@ -3586,20 +3594,29 @@ void get_query_type(struct st_query* q)
uint type; uint type;
DBUG_ENTER("get_query_type"); DBUG_ENTER("get_query_type");
if (*q->query == '}') if (!parsing_disabled && *q->query == '}')
{ {
q->type = Q_END_BLOCK; q->type = Q_END_BLOCK;
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
if (q->type != Q_COMMENT_WITH_COMMAND) if (q->type != Q_COMMENT_WITH_COMMAND)
q->type = Q_QUERY; q->type= parsing_disabled ? Q_COMMENT : Q_QUERY;
save=q->query[q->first_word_len]; save=q->query[q->first_word_len];
q->query[q->first_word_len]=0; q->query[q->first_word_len]=0;
type=find_type(q->query, &command_typelib, 1+2); type=find_type(q->query, &command_typelib, 1+2);
q->query[q->first_word_len]=save; q->query[q->first_word_len]=save;
if (type > 0) if (type > 0)
{
q->type=(enum enum_commands) type; /* Found command */ q->type=(enum enum_commands) type; /* Found command */
/*
If queries are disabled, only recognize
--enable-queries and --disable-queries
*/
if (parsing_disabled && q->type != Q_ENABLE_PARSING &&
q->type != Q_DISABLE_PARSING)
q->type= Q_COMMENT;
}
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
@ -3963,6 +3980,17 @@ int main(int argc, char **argv)
case Q_ENABLE_RECONNECT: case Q_ENABLE_RECONNECT:
cur_con->mysql.reconnect= 1; cur_con->mysql.reconnect= 1;
break; break;
case Q_DISABLE_PARSING:
parsing_disabled++;
break;
case Q_ENABLE_PARSING:
/*
Ensure we don't get parsing_disabled < 0 as this would accidently
disable code we don't want to have disabled
*/
if (parsing_disabled > 0)
parsing_disabled--;
break;
case Q_EXIT: case Q_EXIT:
abort_flag= 1; abort_flag= 1;

View File

@ -218,7 +218,7 @@ extern int errno; /* declare errno */
#endif /* #ifndef errno */ #endif /* #ifndef errno */
extern char NEAR errbuff[NRERRBUFFS][ERRMSGSIZE]; extern char NEAR errbuff[NRERRBUFFS][ERRMSGSIZE];
extern char *home_dir; /* Home directory for user */ extern char *home_dir; /* Home directory for user */
extern char *my_progname; /* program-name (printed in errors) */ extern const char *my_progname; /* program-name (printed in errors) */
extern char NEAR curr_dir[]; /* Current directory for user */ extern char NEAR curr_dir[]; /* Current directory for user */
extern int (*error_handler_hook)(uint my_err, const char *str,myf MyFlags); extern int (*error_handler_hook)(uint my_err, const char *str,myf MyFlags);
extern int (*fatal_error_handler_hook)(uint my_err, const char *str, extern int (*fatal_error_handler_hook)(uint my_err, const char *str,

View File

@ -60,8 +60,8 @@ ulonglong TIME_to_ulonglong_time(const MYSQL_TIME *time);
ulonglong TIME_to_ulonglong(const MYSQL_TIME *time); ulonglong TIME_to_ulonglong(const MYSQL_TIME *time);
bool str_to_time(const char *str,uint length, MYSQL_TIME *l_time, my_bool str_to_time(const char *str,uint length, MYSQL_TIME *l_time,
int *was_cut); int *was_cut);
long calc_daynr(uint year,uint month,uint day); long calc_daynr(uint year,uint month,uint day);
uint calc_days_in_year(uint year); uint calc_days_in_year(uint year);
@ -69,7 +69,8 @@ uint calc_days_in_year(uint year);
void init_time(void); void init_time(void);
my_time_t my_time_t
my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap); my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone,
my_bool *in_dst_time_gap);
void set_zero_time(MYSQL_TIME *tm, enum enum_mysql_timestamp_type time_type); void set_zero_time(MYSQL_TIME *tm, enum enum_mysql_timestamp_type time_type);

View File

@ -504,7 +504,7 @@ comment='Procedure privileges';
CREATE TABLE proc ( CREATE TABLE proc (
db char(64) binary DEFAULT '' NOT NULL, db char(64) collate utf8_bin DEFAULT '' NOT NULL,
name char(64) DEFAULT '' NOT NULL, name char(64) DEFAULT '' NOT NULL,
type enum('FUNCTION','PROCEDURE') NOT NULL, type enum('FUNCTION','PROCEDURE') NOT NULL,
specific_name char(64) DEFAULT '' NOT NULL, specific_name char(64) DEFAULT '' NOT NULL,
@ -519,7 +519,7 @@ CREATE TABLE proc (
param_list blob DEFAULT '' NOT NULL, param_list blob DEFAULT '' NOT NULL,
returns char(64) DEFAULT '' NOT NULL, returns char(64) DEFAULT '' NOT NULL,
body blob DEFAULT '' NOT NULL, body blob DEFAULT '' NOT NULL,
definer char(77) binary DEFAULT '' NOT NULL, definer char(77) collate utf8_bin DEFAULT '' NOT NULL,
created timestamp, created timestamp,
modified timestamp, modified timestamp,
sql_mode set( sql_mode set(
@ -554,6 +554,6 @@ CREATE TABLE proc (
'NO_AUTO_CREATE_USER', 'NO_AUTO_CREATE_USER',
'HIGH_NOT_PRECEDENCE' 'HIGH_NOT_PRECEDENCE'
) DEFAULT '' NOT NULL, ) DEFAULT '' NOT NULL,
comment char(64) binary DEFAULT '' NOT NULL, comment char(64) collate utf8_bin DEFAULT '' NOT NULL,
PRIMARY KEY (db,name,type) PRIMARY KEY (db,name,type)
) comment='Stored Procedures'; ) character set utf8 comment='Stored Procedures';

View File

@ -164,3 +164,5 @@ root@localhost
. - is longer then 80 characters and . - is longer then 80 characters and
. - consists of several lines . - consists of several lines
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
this will be executed
this will be executed

View File

@ -526,14 +526,14 @@ ERROR HY000: Variable 'warning_count' is a read only variable
set @@global.error_count=1; set @@global.error_count=1;
ERROR HY000: Variable 'error_count' is a read only variable ERROR HY000: Variable 'error_count' is a read only variable
set @@max_heap_table_size= 4294967296; set @@max_heap_table_size= 4294967296;
select @@max_heap_table_size; select @@max_heap_table_size > 0;
@@max_heap_table_size @@max_heap_table_size > 0
4294967296 1
set global max_heap_table_size= 4294967296; set global max_heap_table_size= 4294967296;
select @@max_heap_table_size; select @@max_heap_table_size > 0;
@@max_heap_table_size @@max_heap_table_size > 0
4294967296 1
set @@max_heap_table_size= 4294967296; set @@max_heap_table_size= 4294967296;
select @@max_heap_table_size; select @@max_heap_table_size > 0;
@@max_heap_table_size @@max_heap_table_size > 0
4294967296 1

View File

@ -249,25 +249,27 @@ flush privileges;
# QQ This results in NULLs instead of the version numbers when # QQ This results in NULLs instead of the version numbers when
# QQ a LOCK TABLES is in effect when selecting from # QQ a LOCK TABLES is in effect when selecting from
# QQ information_schema.tables. Until this bug has been fixed, # QQ information_schema.tables.
# QQ this test is disabled /pem
#delimiter //; --disable_parsing until bug is fixes
#create procedure px5 () delimiter //;
#begin create procedure px5 ()
#declare v int; begin
#declare c cursor for select version from declare v int;
#information_schema.tables where table_schema <> 'information_schema'; declare c cursor for select version from
#open c; information_schema.tables where table_schema <> 'information_schema';
#fetch c into v; open c;
#select v; fetch c into v;
#close c; select v;
#end;// close c;
# end;//
#call px5()//
#call px5()// call px5()//
#delimiter ;// call px5()//
#select sql_mode from information_schema.ROUTINES; delimiter ;//
#drop procedure px5; select sql_mode from information_schema.ROUTINES;
drop procedure px5;
--enable_parsing
create table t1 (a int not null auto_increment,b int, primary key (a)); create table t1 (a int not null auto_increment,b int, primary key (a));
insert into t1 values (1,1),(NULL,3),(NULL,4); insert into t1 values (1,1),(NULL,3),(NULL,4);

View File

@ -324,3 +324,14 @@ let $message= . Here comes a very very long message that
. - consists of several lines; . - consists of several lines;
--source include/show_msg80.inc --source include/show_msg80.inc
#
# Test --enable_parsning / disable_parsning
#
--disable_query_log
--disable_parsing
# The following will not enable query logging
--enable_query_log
select "this will not be executed";
--enable_parsing
select "this will be executed";
--enable_query_log

View File

@ -1232,12 +1232,14 @@ begin
end| end|
select f5(1)| select f5(1)|
# This should generate an error about insuficient number of tables locked # This should generate an error about insuficient number of tables locked
# Nuw this crash server, comented until bug#11394 fix # Now this crash server
#--error 1100 --disable_parsing until bug#11394 fix
#select f5(2)| --error 1100
select f5(2)|
# But now it simply miserably fails because we are trying to use the same # But now it simply miserably fails because we are trying to use the same
# lex on the next iteration :/ It should generate some error too... # lex on the next iteration :/ It should generate some error too...
# select f5(3)| select f5(3)|
--enable_parsing
# OTOH this should work # OTOH this should work
create function f6() returns int create function f6() returns int
@ -1285,9 +1287,11 @@ create function f1() returns int
return (select sum(data) from t1) + (select sum(data) from v1)| return (select sum(data) from t1) + (select sum(data) from v1)|
# This queries will crash server because we can't use LEX in # This queries will crash server because we can't use LEX in
# reenterable fashion yet. Patch disabling recursion will heal this. # reenterable fashion yet. Patch disabling recursion will heal this.
#select f1()| --disable_parsing
#select * from v1| select f1()|
#select * from v2| select * from v1|
select * from v2|
--enable_parsing
# Back to the normal cases # Back to the normal cases
drop function f1| drop function f1|
create function f1() returns int create function f1() returns int
@ -1499,54 +1503,55 @@ show procedure status like '%p%'|
# #
# This part of test is disabled until we implement support for # This part of test is disabled until we implement support for
# recursive stored procedures. # recursive stored procedures.
#--disable_warnings --disable_parsing
#drop table if exists fib| --disable_warnings
#--enable_warnings drop table if exists fib|
#create table fib ( f bigint unsigned not null )| --enable_warnings
# create table fib ( f bigint unsigned not null )|
## We deliberately do it the awkward way, fetching the last two
## values from the table, in order to exercise various statements
## and table accesses at each turn.
#--disable_warnings
#drop procedure if exists fib|
#--enable_warnings
#create procedure fib(n int unsigned)
#begin
# if n > 1 then
# begin
# declare x, y bigint unsigned;
# declare c cursor for select f from fib order by f desc limit 2;
#
# open c;
# fetch c into y;
# fetch c into x;
# close c;
# insert into fib values (x+y);
# call fib(n-1);
# end;
# end if;
#end|
#
## Minimum test: recursion of 3 levels
#
#insert into fib values (0), (1)|
#
#call fib(3)|
#
#select * from fib order by f asc|
#
#delete from fib|
#
## Original test: 20 levels (may run into memory limits!)
#
#insert into fib values (0), (1)|
#
#call fib(20)|
#
#select * from fib order by f asc|
#drop table fib|
#drop procedure fib|
# We deliberately do it the awkward way, fetching the last two
# values from the table, in order to exercise various statements
# and table accesses at each turn.
--disable_warnings
drop procedure if exists fib|
--enable_warnings
create procedure fib(n int unsigned)
begin
if n > 1 then
begin
declare x, y bigint unsigned;
declare c cursor for select f from fib order by f desc limit 2;
open c;
fetch c into y;
fetch c into x;
close c;
insert into fib values (x+y);
call fib(n-1);
end;
end if;
end|
# Minimum test: recursion of 3 levels
insert into fib values (0), (1)|
call fib(3)|
select * from fib order by f asc|
delete from fib|
# Original test: 20 levels (may run into memory limits!)
insert into fib values (0), (1)|
call fib(20)|
select * from fib order by f asc|
drop table fib|
drop procedure fib|
--enable_parsing
# #
# Comment & suid # Comment & suid
@ -1830,49 +1835,51 @@ drop procedure bug2260|
# FIXME: Other solution would be to use preopened proc table # FIXME: Other solution would be to use preopened proc table
# instead of opening it anew. # instead of opening it anew.
# #
#--disable_warnings --disable_parsing
#drop procedure if exists bug2267_1| --disable_warnings
#--enable_warnings drop procedure if exists bug2267_1|
#create procedure bug2267_1() --enable_warnings
#begin create procedure bug2267_1()
# show procedure status; begin
#end| show procedure status;
# end|
#--disable_warnings
#drop procedure if exists bug2267_2| --disable_warnings
#--enable_warnings drop procedure if exists bug2267_2|
#create procedure bug2267_2() --enable_warnings
#begin create procedure bug2267_2()
# show function status; begin
#end| show function status;
# end|
#--disable_warnings
#drop procedure if exists bug2267_3| --disable_warnings
#--enable_warnings drop procedure if exists bug2267_3|
#create procedure bug2267_3() --enable_warnings
#begin create procedure bug2267_3()
# show create procedure bug2267_1; begin
#end| show create procedure bug2267_1;
# end|
#--disable_warnings
#drop procedure if exists bug2267_4| --disable_warnings
#--enable_warnings drop procedure if exists bug2267_4|
#create procedure bug2267_4() --enable_warnings
#begin create procedure bug2267_4()
# show create function fac; begin
#end| show create function fac;
# end|
#--replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
#call bug2267_1()| --replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
#--replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00' call bug2267_1()|
#call bug2267_2()| --replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
#call bug2267_3()| call bug2267_2()|
#call bug2267_4()| call bug2267_3()|
# call bug2267_4()|
#drop procedure bug2267_1|
#drop procedure bug2267_2| drop procedure bug2267_1|
#drop procedure bug2267_3| drop procedure bug2267_2|
#drop procedure bug2267_4| drop procedure bug2267_3|
drop procedure bug2267_4|
--enable_parsing
# #
# BUG#2227 # BUG#2227
@ -1901,23 +1908,25 @@ drop procedure bug2227|
# QQ For this reason we can't run this test any more (i.e., if we modify # QQ For this reason we can't run this test any more (i.e., if we modify
# QQ it, it's no longer a test case for the bug), but we keep it here # QQ it, it's no longer a test case for the bug), but we keep it here
# QQ anyway, for tracability. # QQ anyway, for tracability.
#--disable_warnings --disable_parsing
#drop procedure if exists bug2614| --disable_warnings
#--enable_warnings drop procedure if exists bug2614|
#create procedure bug2614() --enable_warnings
#begin create procedure bug2614()
# drop temporary table if exists t3; begin
# create temporary table t3 (id int default '0' not null); drop temporary table if exists t3;
# insert into t3 select 12; create temporary table t3 (id int default '0' not null);
# insert into t3 select * from t3; insert into t3 select 12;
#end| insert into t3 select * from t3;
# end|
#--disable_warnings
#call bug2614()| --disable_warnings
#--enable_warnings call bug2614()|
#call bug2614()| --enable_warnings
#drop temporary table t3| call bug2614()|
#drop procedure bug2614| drop temporary table t3|
drop procedure bug2614|
--enable_parsing
# #
# BUG#2674 # BUG#2674
@ -2508,27 +2517,29 @@ drop table t3|
# BUG#4318 # BUG#4318
# #
#QQ Don't know if HANDLER commands can work with SPs, or at all... #QQ Don't know if HANDLER commands can work with SPs, or at all...
#--disable_warnings --disable_parsing
#drop table if exists t3| --disable_warnings
#--enable_warnings drop table if exists t3|
# --enable_warnings
#create table t3 (s1 int)|
#insert into t3 values (3), (4)| create table t3 (s1 int)|
# insert into t3 values (3), (4)|
#--disable_warnings
#drop procedure if exists bug4318| --disable_warnings
#--enable_warnings drop procedure if exists bug4318|
#create procedure bug4318() --enable_warnings
# handler t3 read next| create procedure bug4318()
# handler t3 read next|
#handler t3 open|
## Expect no results, as tables are closed, but there shouldn't be any errors handler t3 open|
#call bug4318()| # Expect no results, as tables are closed, but there shouldn't be any errors
#call bug4318()| call bug4318()|
#handler t3 close| call bug4318()|
# handler t3 close|
#drop procedure bug4318|
#drop table t3| drop procedure bug4318|
drop table t3|
--enable_parsing
# #
# BUG#4902: Stored procedure with SHOW WARNINGS leads to packet error # BUG#4902: Stored procedure with SHOW WARNINGS leads to packet error
@ -2563,11 +2574,13 @@ begin
show variables like 'foo'; show variables like 'foo';
show warnings; show warnings;
end| end|
#show binlog events; --disable_parsing
#show storage engines; show binlog events;
#show master status; show storage engines;
#show slave hosts; show master status;
#show slave status; show slave hosts;
show slave status;
--enable_parsing
call bug4902()| call bug4902()|
call bug4902()| call bug4902()|
@ -3912,7 +3925,6 @@ drop table t3|
#--enable_warnings #--enable_warnings
#create procedure bugNNNN... #create procedure bugNNNN...
# Add bugs above this line. Use existing tables t1 and t2 when # Add bugs above this line. Use existing tables t1 and t2 when
# practical, or create table t3, t4 etc temporarily (and drop them). # practical, or create table t3, t4 etc temporarily (and drop them).
delimiter ;| delimiter ;|

View File

@ -413,8 +413,9 @@ set @@global.error_count=1;
# Bug #10351: Setting max_heap_table_size to 4G fails # Bug #10351: Setting max_heap_table_size to 4G fails
# #
set @@max_heap_table_size= 4294967296; set @@max_heap_table_size= 4294967296;
select @@max_heap_table_size; select @@max_heap_table_size > 0;
set global max_heap_table_size= 4294967296; set global max_heap_table_size= 4294967296;
select @@max_heap_table_size; select @@max_heap_table_size > 0;
set @@max_heap_table_size= 4294967296; set @@max_heap_table_size= 4294967296;
select @@max_heap_table_size; select @@max_heap_table_size > 0;

View File

@ -147,10 +147,11 @@ insert into t1 values (1), (2), (3);
create view v1 (a) as select a+1 from t1; create view v1 (a) as select a+1 from t1;
create view v2 (a) as select a-1 from t1; create view v2 (a) as select a-1 from t1;
# WL #2486 should enable these tests --disable_parsing WL #2486 should enable these tests
#select * from t1 natural left join v1; select * from t1 natural left join v1;
#select * from v2 natural left join t1; select * from v2 natural left join t1;
#select * from v2 natural left join v1; select * from v2 natural left join v1;
--enable_parsing
drop view v1, v2; drop view v1, v2;
drop table t1; drop table t1;

View File

@ -96,7 +96,7 @@ my_bool my_init(void)
#endif #endif
{ {
DBUG_ENTER("my_init"); DBUG_ENTER("my_init");
DBUG_PROCESS(my_progname ? my_progname : (char*) "unknown"); DBUG_PROCESS((char*) (my_progname ? my_progname : "unknown"));
if (!home_dir) if (!home_dir)
{ /* Don't initialize twice */ { /* Don't initialize twice */
my_win_init(); my_win_init();

View File

@ -28,7 +28,8 @@
my_bool timed_mutexes= 0; my_bool timed_mutexes= 0;
/* from my_init */ /* from my_init */
my_string home_dir=0,my_progname=0; my_string home_dir=0;
const char *my_progname=0;
char NEAR curr_dir[FN_REFLEN]= {0}, char NEAR curr_dir[FN_REFLEN]= {0},
NEAR home_dir_buff[FN_REFLEN]= {0}; NEAR home_dir_buff[FN_REFLEN]= {0};
ulong my_stream_opened=0,my_file_opened=0, my_tmp_file_created=0; ulong my_stream_opened=0,my_file_opened=0, my_tmp_file_created=0;

View File

@ -509,7 +509,7 @@ thr_lock(THR_LOCK_DATA *data, THR_LOCK_OWNER *owner,
(*lock->read.last)=data; /* Add to running FIFO */ (*lock->read.last)=data; /* Add to running FIFO */
data->prev=lock->read.last; data->prev=lock->read.last;
lock->read.last= &data->next; lock->read.last= &data->next;
if ((int) lock_type == (int) TL_READ_NO_INSERT) if (lock_type == TL_READ_NO_INSERT)
lock->read_no_write_count++; lock->read_no_write_count++;
check_locks(lock,"read lock with old write lock",0); check_locks(lock,"read lock with old write lock",0);
if (lock->get_status) if (lock->get_status)
@ -535,14 +535,14 @@ thr_lock(THR_LOCK_DATA *data, THR_LOCK_OWNER *owner,
lock->read.last= &data->next; lock->read.last= &data->next;
if (lock->get_status) if (lock->get_status)
(*lock->get_status)(data->status_param, 0); (*lock->get_status)(data->status_param, 0);
if ((int) lock_type == (int) TL_READ_NO_INSERT) if (lock_type == TL_READ_NO_INSERT)
lock->read_no_write_count++; lock->read_no_write_count++;
check_locks(lock,"read lock with no write locks",0); check_locks(lock,"read lock with no write locks",0);
statistic_increment(locks_immediate,&THR_LOCK_lock); statistic_increment(locks_immediate,&THR_LOCK_lock);
goto end; goto end;
} }
/* /*
We're here if there is an active write lock or no write We're here if there is an active write lock or no write
lock but a high priority write waiting in the write_wait queue. lock but a high priority write waiting in the write_wait queue.
In the latter case we should yield the lock to the writer. In the latter case we should yield the lock to the writer.
*/ */

View File

@ -60,11 +60,11 @@ uint calc_days_in_year(uint year)
SYNOPSIS SYNOPSIS
check_date() check_date()
ltime - Date to check. ltime Date to check.
not_zero_date - ltime is not the zero date not_zero_date ltime is not the zero date
flags - flags to check flags flags to check
was_cut - set to whether the value was truncated was_cut set to 2 if value was truncated.
NOTE: This is not touched if value was not truncated
NOTES NOTES
Here we assume that year and month is ok ! Here we assume that year and month is ok !
If month is 0 we allow any date. (This only happens if we allow zero If month is 0 we allow any date. (This only happens if we allow zero
@ -75,10 +75,9 @@ uint calc_days_in_year(uint year)
1 error 1 error
*/ */
bool check_date(const MYSQL_TIME *ltime, bool not_zero_date, ulong flags, static my_bool check_date(const MYSQL_TIME *ltime, my_bool not_zero_date,
int *was_cut) ulong flags, int *was_cut)
{ {
if (not_zero_date) if (not_zero_date)
{ {
if ((((flags & TIME_NO_ZERO_IN_DATE) || !(flags & TIME_FUZZY_DATE)) && if ((((flags & TIME_NO_ZERO_IN_DATE) || !(flags & TIME_FUZZY_DATE)) &&
@ -165,11 +164,11 @@ str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time,
uint date[MAX_DATE_PARTS], date_len[MAX_DATE_PARTS]; uint date[MAX_DATE_PARTS], date_len[MAX_DATE_PARTS];
uint add_hours= 0, start_loop; uint add_hours= 0, start_loop;
ulong not_zero_date, allow_space; ulong not_zero_date, allow_space;
bool is_internal_format; my_bool is_internal_format;
const char *pos, *last_field_pos; const char *pos, *last_field_pos;
const char *end=str+length; const char *end=str+length;
const uchar *format_position; const uchar *format_position;
bool found_delimitier= 0, found_space= 0; my_bool found_delimitier= 0, found_space= 0;
uint frac_pos, frac_len; uint frac_pos, frac_len;
DBUG_ENTER("str_to_datetime"); DBUG_ENTER("str_to_datetime");
DBUG_PRINT("ENTER",("str: %.*s",length,str)); DBUG_PRINT("ENTER",("str: %.*s",length,str));
@ -472,12 +471,12 @@ err:
1 error 1 error
*/ */
bool str_to_time(const char *str, uint length, MYSQL_TIME *l_time, my_bool str_to_time(const char *str, uint length, MYSQL_TIME *l_time,
int *was_cut) int *was_cut)
{ {
long date[5],value; long date[5],value;
const char *end=str+length, *end_of_days; const char *end=str+length, *end_of_days;
bool found_days,found_hours; my_bool found_days,found_hours;
uint state; uint state;
l_time->neg=0; l_time->neg=0;
@ -644,7 +643,7 @@ void init_time(void)
time_t seconds; time_t seconds;
struct tm *l_time,tm_tmp; struct tm *l_time,tm_tmp;
MYSQL_TIME my_time; MYSQL_TIME my_time;
bool not_used; my_bool not_used;
seconds= (time_t) time((time_t*) 0); seconds= (time_t) time((time_t*) 0);
localtime_r(&seconds,&tm_tmp); localtime_r(&seconds,&tm_tmp);
@ -710,7 +709,8 @@ long calc_daynr(uint year,uint month,uint day)
Time in UTC seconds since Unix Epoch representation. Time in UTC seconds since Unix Epoch representation.
*/ */
my_time_t my_time_t
my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap) my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone,
my_bool *in_dst_time_gap)
{ {
uint loop; uint loop;
time_t tmp; time_t tmp;
@ -961,11 +961,10 @@ longlong number_to_datetime(longlong nr, MYSQL_TIME *time_res,
return nr; return nr;
/* Don't want to have was_cut get set if NO_ZERO_DATE was violated. */ /* Don't want to have was_cut get set if NO_ZERO_DATE was violated. */
if (!nr && flags & TIME_NO_ZERO_DATE) if (!nr && (flags & TIME_NO_ZERO_DATE))
return LL(-1); return LL(-1);
err: err:
*was_cut= 1; *was_cut= 1;
return LL(-1); return LL(-1);
} }

View File

@ -4468,7 +4468,7 @@ int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs)
my_time_t tmp= 0; my_time_t tmp= 0;
int error; int error;
bool have_smth_to_conv; bool have_smth_to_conv;
bool in_dst_time_gap; my_bool in_dst_time_gap;
THD *thd= table->in_use; THD *thd= table->in_use;
/* We don't want to store invalid or fuzzy datetime values in TIMESTAMP */ /* We don't want to store invalid or fuzzy datetime values in TIMESTAMP */
@ -4539,14 +4539,14 @@ int Field_timestamp::store(longlong nr)
TIME l_time; TIME l_time;
my_time_t timestamp= 0; my_time_t timestamp= 0;
int error; int error;
bool in_dst_time_gap; my_bool in_dst_time_gap;
THD *thd= table->in_use; THD *thd= table->in_use;
/* We don't want to store invalid or fuzzy datetime values in TIMESTAMP */ /* We don't want to store invalid or fuzzy datetime values in TIMESTAMP */
longlong tmp= number_to_datetime(nr, &l_time, (thd->variables.sql_mode & longlong tmp= number_to_datetime(nr, &l_time, (thd->variables.sql_mode &
MODE_NO_ZERO_DATE) | MODE_NO_ZERO_DATE) |
MODE_NO_ZERO_IN_DATE, &error); MODE_NO_ZERO_IN_DATE, &error);
if (tmp < 0) if (tmp == LL(-1))
{ {
error= 2; error= 2;
} }
@ -5215,7 +5215,7 @@ int Field_date::store(longlong nr)
MODE_NO_ZERO_DATE | MODE_NO_ZERO_DATE |
MODE_INVALID_DATES))), &error); MODE_INVALID_DATES))), &error);
if (nr < 0) if (nr == LL(-1))
{ {
nr= 0; nr= 0;
error= 2; error= 2;
@ -5391,12 +5391,12 @@ int Field_newdate::store(longlong nr)
TIME l_time; TIME l_time;
longlong tmp; longlong tmp;
int error; int error;
if ((tmp= number_to_datetime(nr, &l_time, if (number_to_datetime(nr, &l_time,
(TIME_FUZZY_DATE | (TIME_FUZZY_DATE |
(table->in_use->variables.sql_mode & (table->in_use->variables.sql_mode &
(MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE | (MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE |
MODE_INVALID_DATES))), MODE_INVALID_DATES))),
&error) < 0)) &error) == LL(-1))
{ {
tmp= 0L; tmp= 0L;
error= 2; error= 2;
@ -5593,7 +5593,7 @@ int Field_datetime::store(longlong nr)
MODE_NO_ZERO_DATE | MODE_NO_ZERO_DATE |
MODE_INVALID_DATES))), &error); MODE_INVALID_DATES))), &error);
if (nr < 0) if (nr == LL(-1))
{ {
nr= 0; nr= 0;
error= 2; error= 2;

View File

@ -1150,8 +1150,7 @@ class Item_uint :public Item_int
{ {
public: public:
Item_uint(const char *str_arg, uint length); Item_uint(const char *str_arg, uint length);
Item_uint(uint32 i) :Item_int((ulonglong) i, 10) {} Item_uint(ulonglong i) :Item_int((ulonglong) i, 10) {}
Item_uint(ulong i) :Item_int((ulonglong) i, 10) {}
Item_uint(const char *str_arg, longlong i, uint length); Item_uint(const char *str_arg, longlong i, uint length);
double val_real() double val_real()
{ DBUG_ASSERT(fixed == 1); return ulonglong2double((ulonglong)value); } { DBUG_ASSERT(fixed == 1); return ulonglong2double((ulonglong)value); }

View File

@ -1070,7 +1070,7 @@ longlong Item_func_year::val_int()
longlong Item_func_unix_timestamp::val_int() longlong Item_func_unix_timestamp::val_int()
{ {
TIME ltime; TIME ltime;
bool not_used; my_bool not_used;
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
if (arg_count == 0) if (arg_count == 0)
@ -1798,7 +1798,6 @@ bool Item_func_convert_tz::get_date(TIME *ltime,
uint fuzzy_date __attribute__((unused))) uint fuzzy_date __attribute__((unused)))
{ {
my_time_t my_time_tmp; my_time_t my_time_tmp;
bool not_used;
String str; String str;
if (!from_tz_cached) if (!from_tz_cached)
@ -1824,6 +1823,7 @@ bool Item_func_convert_tz::get_date(TIME *ltime,
ltime->year==TIMESTAMP_MAX_YEAR && ltime->month==1 && ltime->day==1 || ltime->year==TIMESTAMP_MAX_YEAR && ltime->month==1 && ltime->day==1 ||
ltime->year==TIMESTAMP_MIN_YEAR && ltime->month==12 && ltime->day==31) ltime->year==TIMESTAMP_MIN_YEAR && ltime->month==12 && ltime->day==31)
{ {
my_bool not_used;
my_time_tmp= from_tz->TIME_to_gmt_sec(ltime, &not_used); my_time_tmp= from_tz->TIME_to_gmt_sec(ltime, &not_used);
if (my_time_tmp >= TIMESTAMP_MIN_VALUE && my_time_tmp <= TIMESTAMP_MAX_VALUE) if (my_time_tmp >= TIMESTAMP_MIN_VALUE && my_time_tmp <= TIMESTAMP_MAX_VALUE)
to_tz->gmt_sec_to_TIME(ltime, my_time_tmp); to_tz->gmt_sec_to_TIME(ltime, my_time_tmp);

View File

@ -58,7 +58,11 @@ static handlerton binlog_hton = {
binlog_prepare, binlog_prepare,
NULL, /* recover */ NULL, /* recover */
NULL, /* commit_by_xid */ NULL, /* commit_by_xid */
NULL /* rollback_by_xid */ NULL, /* rollback_by_xid */
NULL, /* create_cursor_read_view */
NULL, /* set_cursor_read_view */
NULL, /* close_cursor_read_view */
HTON_NO_FLAGS
}; };
/* /*

View File

@ -823,8 +823,6 @@ bool mysqld_show_column_types(THD *thd);
bool mysqld_help (THD *thd, const char *text); bool mysqld_help (THD *thd, const char *text);
void calc_sum_of_all_status(STATUS_VAR *to); void calc_sum_of_all_status(STATUS_VAR *to);
/* information schema */ /* information schema */
extern LEX_STRING information_schema_name; extern LEX_STRING information_schema_name;
LEX_STRING *make_lex_string(THD *thd, LEX_STRING *lex_str, LEX_STRING *make_lex_string(THD *thd, LEX_STRING *lex_str,
@ -952,6 +950,7 @@ bool rename_temporary_table(THD* thd, TABLE *table, const char *new_db,
const char *table_name); const char *table_name);
void remove_db_from_cache(const char *db); void remove_db_from_cache(const char *db);
void flush_tables(); void flush_tables();
bool is_equal(const LEX_STRING *a, const LEX_STRING *b);
/* bits for last argument to remove_table_from_cache() */ /* bits for last argument to remove_table_from_cache() */
#define RTFC_NO_FLAG 0x0000 #define RTFC_NO_FLAG 0x0000
@ -1191,6 +1190,7 @@ extern TABLE *unused_tables;
extern I_List<i_string> binlog_do_db, binlog_ignore_db; extern I_List<i_string> binlog_do_db, binlog_ignore_db;
extern const char* any_db; extern const char* any_db;
extern struct my_option my_long_options[]; extern struct my_option my_long_options[];
extern const LEX_STRING view_type;
/* optional things, have_* variables */ /* optional things, have_* variables */
@ -1273,7 +1273,7 @@ ulong convert_period_to_month(ulong period);
ulong convert_month_to_period(ulong month); ulong convert_month_to_period(ulong month);
void get_date_from_daynr(long daynr,uint *year, uint *month, void get_date_from_daynr(long daynr,uint *year, uint *month,
uint *day); uint *day);
my_time_t TIME_to_timestamp(THD *thd, const TIME *t, bool *not_exist); my_time_t TIME_to_timestamp(THD *thd, const TIME *t, my_bool *not_exist);
bool str_to_time_with_warn(const char *str,uint length,TIME *l_time); bool str_to_time_with_warn(const char *str,uint length,TIME *l_time);
timestamp_type str_to_datetime_with_warn(const char *str, uint length, timestamp_type str_to_datetime_with_warn(const char *str, uint length,
TIME *l_time, uint flags); TIME *l_time, uint flags);

View File

@ -1426,6 +1426,12 @@ bool sys_var_thd_ulong::update(THD *thd, set_var *var)
if ((ulong) tmp > max_system_variables.*offset) if ((ulong) tmp > max_system_variables.*offset)
tmp= max_system_variables.*offset; tmp= max_system_variables.*offset;
#if SIZEOF_LONG == 4
/* Avoid overflows on 32 bit systems */
if (tmp > (ulonglong) ~(ulong) 0)
tmp= ((ulonglong) ~(ulong) 0);
#endif
if (option_limits) if (option_limits)
tmp= (ulong) getopt_ull_limit_value(tmp, option_limits); tmp= (ulong) getopt_ull_limit_value(tmp, option_limits);
if (var->type == OPT_GLOBAL) if (var->type == OPT_GLOBAL)
@ -1679,7 +1685,7 @@ Item *sys_var::item(THD *thd, enum_var_type var_type, LEX_STRING *base)
pthread_mutex_lock(&LOCK_global_system_variables); pthread_mutex_lock(&LOCK_global_system_variables);
value= *(uint*) value_ptr(thd, var_type, base); value= *(uint*) value_ptr(thd, var_type, base);
pthread_mutex_unlock(&LOCK_global_system_variables); pthread_mutex_unlock(&LOCK_global_system_variables);
return new Item_uint((uint32) value); return new Item_uint((ulonglong) value);
} }
case SHOW_LONG: case SHOW_LONG:
{ {
@ -1687,7 +1693,7 @@ Item *sys_var::item(THD *thd, enum_var_type var_type, LEX_STRING *base)
pthread_mutex_lock(&LOCK_global_system_variables); pthread_mutex_lock(&LOCK_global_system_variables);
value= *(ulong*) value_ptr(thd, var_type, base); value= *(ulong*) value_ptr(thd, var_type, base);
pthread_mutex_unlock(&LOCK_global_system_variables); pthread_mutex_unlock(&LOCK_global_system_variables);
return new Item_uint(value); return new Item_uint((ulonglong) value);
} }
case SHOW_LONGLONG: case SHOW_LONGLONG:
{ {

View File

@ -4258,7 +4258,7 @@ open_new_frm(const char *path, const char *alias,
if ((parser= sql_parse_prepare(&pathstr, mem_root, 1))) if ((parser= sql_parse_prepare(&pathstr, mem_root, 1)))
{ {
if (!strncmp("VIEW", parser->type()->str, parser->type()->length)) if (is_equal(&view_type, parser->type()))
{ {
if (table_desc == 0 || table_desc->required_type == FRMTYPE_TABLE) if (table_desc == 0 || table_desc->required_type == FRMTYPE_TABLE)
{ {
@ -4281,3 +4281,9 @@ err:
bzero(outparam, sizeof(TABLE)); // do not run repair bzero(outparam, sizeof(TABLE)); // do not run repair
DBUG_RETURN(1); DBUG_RETURN(1);
} }
bool is_equal(const LEX_STRING *a, const LEX_STRING *b)
{
return a->length == b->length && !strncmp(a->str, b->str, a->length);
}

View File

@ -523,6 +523,10 @@ bool THD::store_globals()
if this is the slave SQL thread. if this is the slave SQL thread.
*/ */
variables.pseudo_thread_id= thread_id; variables.pseudo_thread_id= thread_id;
/*
We have to call thr_lock_info_init() again here as THD may have been
created in another thread
*/
thr_lock_info_init(&lock_info); thr_lock_info_init(&lock_info);
return 0; return 0;
} }

View File

@ -1762,7 +1762,7 @@ Cursor::init_from_thd(THD *thd)
for (handlerton **pht= thd->transaction.stmt.ht; *pht; pht++) for (handlerton **pht= thd->transaction.stmt.ht; *pht; pht++)
{ {
const handlerton *ht= *pht; const handlerton *ht= *pht;
close_at_commit|= (ht->flags & HTON_CLOSE_CURSORS_AT_COMMIT); close_at_commit|= test(ht->flags & HTON_CLOSE_CURSORS_AT_COMMIT);
if (ht->create_cursor_read_view) if (ht->create_cursor_read_view)
{ {
info->ht= ht; info->ht= ht;
@ -8033,11 +8033,13 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
bool table_cant_handle_bit_fields, bool table_cant_handle_bit_fields,
uint convert_blob_length) uint convert_blob_length)
{ {
Item *org_item= item; if (type != Item::FIELD_ITEM &&
if (item->real_item()->type() == Item::FIELD_ITEM) item->real_item()->type() == Item::FIELD_ITEM &&
(item->type() != Item::REF_ITEM ||
!((Item_ref *) item)->depended_from))
{ {
item= item->real_item(); item= item->real_item();
type= item->type(); type= Item::FIELD_ITEM;
} }
switch (type) { switch (type) {
case Item::SUM_FUNC_ITEM: case Item::SUM_FUNC_ITEM:
@ -8051,23 +8053,18 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
case Item::FIELD_ITEM: case Item::FIELD_ITEM:
case Item::DEFAULT_VALUE_ITEM: case Item::DEFAULT_VALUE_ITEM:
{ {
if (org_item->type() != Item::REF_ITEM || Item_field *field= (Item_field*) item;
!((Item_ref *)org_item)->depended_from) if (table_cant_handle_bit_fields &&
{ field->field->type() == FIELD_TYPE_BIT)
Item_field *field= (Item_field*) item; return create_tmp_field_from_item(thd, item, table, copy_func,
if (table_cant_handle_bit_fields && modify_item, convert_blob_length);
field->field->type() == FIELD_TYPE_BIT) return create_tmp_field_from_field(thd, (*from_field= field->field),
return create_tmp_field_from_item(thd, item, table, copy_func, item->name, table,
modify_item, convert_blob_length); modify_item ? (Item_field*) item :
return create_tmp_field_from_field(thd, (*from_field= field->field), NULL,
item->name, table, convert_blob_length);
modify_item ? (Item_field*) item :
NULL,
convert_blob_length);
}
else
item= org_item;
} }
/* Fall through */
case Item::FUNC_ITEM: case Item::FUNC_ITEM:
case Item::COND_ITEM: case Item::COND_ITEM:
case Item::FIELD_AVG_ITEM: case Item::FIELD_AVG_ITEM:
@ -10910,13 +10907,13 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
usable_keys.set_all(); usable_keys.set_all();
for (ORDER *tmp_order=order; tmp_order ; tmp_order=tmp_order->next) for (ORDER *tmp_order=order; tmp_order ; tmp_order=tmp_order->next)
{ {
if ((*tmp_order->item)->real_item()->type() != Item::FIELD_ITEM) Item *item= (*tmp_order->item)->real_item();
if (item->type() != Item::FIELD_ITEM)
{ {
usable_keys.clear_all(); usable_keys.clear_all();
DBUG_RETURN(0); DBUG_RETURN(0);
} }
usable_keys.intersect(((Item_field*) (*tmp_order->item)->real_item())-> usable_keys.intersect(((Item_field*) item)->field->part_of_sortkey);
field->part_of_sortkey);
if (usable_keys.is_clear_all()) if (usable_keys.is_clear_all())
DBUG_RETURN(0); // No usable keys DBUG_RETURN(0); // No usable keys
} }

View File

@ -226,7 +226,7 @@ bool Table_triggers_list::create_trigger(THD *thd, TABLE_LIST *tables)
/* Trigger must be in the same schema as target table. */ /* Trigger must be in the same schema as target table. */
if (my_strcasecmp(system_charset_info, table->s->db, if (my_strcasecmp(table_alias_charset, table->s->db,
lex->spname->m_db.str ? lex->spname->m_db.str : lex->spname->m_db.str ? lex->spname->m_db.str :
thd->db)) thd->db))
{ {
@ -396,7 +396,7 @@ bool Table_triggers_list::drop_trigger(THD *thd, TABLE_LIST *tables)
{ {
it_def++; it_def++;
if (my_strcasecmp(system_charset_info, lex->spname->m_name.str, if (my_strcasecmp(table_alias_charset, lex->spname->m_name.str,
name->str) == 0) name->str) == 0)
{ {
/* /*
@ -541,8 +541,7 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db,
if ((parser= sql_parse_prepare(&path, &table->mem_root, 1))) if ((parser= sql_parse_prepare(&path, &table->mem_root, 1)))
{ {
if (!strncmp(triggers_file_type.str, parser->type()->str, if (is_equal(&triggers_file_type, parser->type()))
parser->type()->length))
{ {
Table_triggers_list *triggers= Table_triggers_list *triggers=
new (&table->mem_root) Table_triggers_list(table); new (&table->mem_root) Table_triggers_list(table);
@ -601,7 +600,8 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db,
triggers->bodies[lex.trg_chistics.event] triggers->bodies[lex.trg_chistics.event]
[lex.trg_chistics.action_time]= lex.sphead; [lex.trg_chistics.action_time]= lex.sphead;
if (triggers->names_list.push_back(&lex.sphead->m_name, &table->mem_root)) if (triggers->names_list.push_back(&lex.sphead->m_name,
&table->mem_root))
goto err_with_lex_cleanup; goto err_with_lex_cleanup;
if (names_only) if (names_only)
@ -615,8 +615,9 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db,
in old/new versions of row in trigger to Field objects in table being in old/new versions of row in trigger to Field objects in table being
opened. opened.
We ignore errors here, because if even something is wrong we still will We ignore errors here, because if even something is wrong we still
be willing to open table to perform some operations (e.g. SELECT)... will be willing to open table to perform some operations
(e.g. SELECT)...
Anyway some things can be checked only during trigger execution. Anyway some things can be checked only during trigger execution.
*/ */
for (Item_trigger_field *trg_field= for (Item_trigger_field *trg_field=
@ -647,7 +648,7 @@ err_with_lex_cleanup:
be merged into .FRM anyway. be merged into .FRM anyway.
*/ */
my_error(ER_WRONG_OBJECT, MYF(0), my_error(ER_WRONG_OBJECT, MYF(0),
table_name, triggers_file_ext, "TRIGGER"); table_name, triggers_file_ext+1, "TRIGGER");
DBUG_RETURN(1); DBUG_RETURN(1);
} }
@ -726,10 +727,9 @@ static TABLE_LIST *add_table_for_trigger(THD *thd, sp_name *trig)
if (!(parser= sql_parse_prepare(&path, thd->mem_root, 1))) if (!(parser= sql_parse_prepare(&path, thd->mem_root, 1)))
DBUG_RETURN(0); DBUG_RETURN(0);
if (strncmp(trigname_file_type.str, parser->type()->str, if (!is_equal(&trigname_file_type, parser->type()))
parser->type()->length))
{ {
my_error(ER_WRONG_OBJECT, MYF(0), trig->m_name.str, trigname_file_ext, my_error(ER_WRONG_OBJECT, MYF(0), trig->m_name.str, trigname_file_ext+1,
"TRIGGERNAME"); "TRIGGERNAME");
DBUG_RETURN(0); DBUG_RETURN(0);
} }

View File

@ -24,6 +24,8 @@
#define MD5_BUFF_LENGTH 33 #define MD5_BUFF_LENGTH 33
const LEX_STRING view_type= { (char*) STRING_WITH_LEN("VIEW") };
static int mysql_register_view(THD *thd, TABLE_LIST *view, static int mysql_register_view(THD *thd, TABLE_LIST *view,
enum_view_create_mode mode); enum_view_create_mode mode);
@ -431,7 +433,7 @@ static File_option view_parameters[]=
FILE_OPTIONS_STRING} FILE_OPTIONS_STRING}
}; };
static LEX_STRING view_file_type[]= {{(char*)"VIEW", 4}}; static LEX_STRING view_file_type[]= {{(char*) STRING_WITH_LEN("VIEW") }};
/* /*
@ -470,7 +472,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
thd->variables.sql_mode|= sql_mode; thd->variables.sql_mode|= sql_mode;
} }
str.append('\0'); str.append('\0');
DBUG_PRINT("VIEW", ("View: %s", str.ptr())); DBUG_PRINT("info", ("View: %s", str.ptr()));
/* print file name */ /* print file name */
(void) my_snprintf(dir_buff, FN_REFLEN, "%s/%s/", (void) my_snprintf(dir_buff, FN_REFLEN, "%s/%s/",
@ -507,8 +509,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
if (!(parser= sql_parse_prepare(&path, thd->mem_root, 0))) if (!(parser= sql_parse_prepare(&path, thd->mem_root, 0)))
DBUG_RETURN(1); DBUG_RETURN(1);
if (!parser->ok() || if (!parser->ok() || !is_equal(&view_type, parser->type()))
strncmp("VIEW", parser->type()->str, parser->type()->length))
{ {
my_error(ER_WRONG_OBJECT, MYF(0), my_error(ER_WRONG_OBJECT, MYF(0),
(view->db ? view->db : thd->db), view->table_name, "VIEW"); (view->db ? view->db : thd->db), view->table_name, "VIEW");

View File

@ -223,7 +223,7 @@ str_to_datetime_with_warn(const char *str, uint length, TIME *l_time,
0 - t contains datetime value which is out of TIMESTAMP range. 0 - t contains datetime value which is out of TIMESTAMP range.
*/ */
my_time_t TIME_to_timestamp(THD *thd, const TIME *t, bool *in_dst_time_gap) my_time_t TIME_to_timestamp(THD *thd, const TIME *t, my_bool *in_dst_time_gap)
{ {
my_time_t timestamp; my_time_t timestamp;

View File

@ -880,12 +880,12 @@ sec_since_epoch(int year, int mon, int mday, int hour, int min ,int sec)
0 in case of error. 0 in case of error.
*/ */
static my_time_t static my_time_t
TIME_to_gmt_sec(const TIME *t, const TIME_ZONE_INFO *sp, bool *in_dst_time_gap) TIME_to_gmt_sec(const TIME *t, const TIME_ZONE_INFO *sp,
my_bool *in_dst_time_gap)
{ {
my_time_t local_t; my_time_t local_t;
uint saved_seconds; uint saved_seconds;
uint i; uint i;
DBUG_ENTER("TIME_to_gmt_sec"); DBUG_ENTER("TIME_to_gmt_sec");
/* We need this for correct leap seconds handling */ /* We need this for correct leap seconds handling */
@ -962,7 +962,7 @@ class Time_zone_system : public Time_zone
{ {
public: public:
virtual my_time_t TIME_to_gmt_sec(const TIME *t, virtual my_time_t TIME_to_gmt_sec(const TIME *t,
bool *in_dst_time_gap) const; my_bool *in_dst_time_gap) const;
virtual void gmt_sec_to_TIME(TIME *tmp, my_time_t t) const; virtual void gmt_sec_to_TIME(TIME *tmp, my_time_t t) const;
virtual const String * get_name() const; virtual const String * get_name() const;
}; };
@ -994,7 +994,7 @@ public:
Corresponding my_time_t value or 0 in case of error Corresponding my_time_t value or 0 in case of error
*/ */
my_time_t my_time_t
Time_zone_system::TIME_to_gmt_sec(const TIME *t, bool *in_dst_time_gap) const Time_zone_system::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const
{ {
long not_used; long not_used;
return my_system_gmt_sec(t, &not_used, in_dst_time_gap); return my_system_gmt_sec(t, &not_used, in_dst_time_gap);
@ -1055,7 +1055,7 @@ class Time_zone_utc : public Time_zone
{ {
public: public:
virtual my_time_t TIME_to_gmt_sec(const TIME *t, virtual my_time_t TIME_to_gmt_sec(const TIME *t,
bool *in_dst_time_gap) const; my_bool *in_dst_time_gap) const;
virtual void gmt_sec_to_TIME(TIME *tmp, my_time_t t) const; virtual void gmt_sec_to_TIME(TIME *tmp, my_time_t t) const;
virtual const String * get_name() const; virtual const String * get_name() const;
}; };
@ -1081,7 +1081,7 @@ public:
0 0
*/ */
my_time_t my_time_t
Time_zone_utc::TIME_to_gmt_sec(const TIME *t, bool *in_dst_time_gap) const Time_zone_utc::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const
{ {
/* Should be never called */ /* Should be never called */
DBUG_ASSERT(0); DBUG_ASSERT(0);
@ -1144,7 +1144,7 @@ class Time_zone_db : public Time_zone
public: public:
Time_zone_db(TIME_ZONE_INFO *tz_info_arg, const String * tz_name_arg); Time_zone_db(TIME_ZONE_INFO *tz_info_arg, const String * tz_name_arg);
virtual my_time_t TIME_to_gmt_sec(const TIME *t, virtual my_time_t TIME_to_gmt_sec(const TIME *t,
bool *in_dst_time_gap) const; my_bool *in_dst_time_gap) const;
virtual void gmt_sec_to_TIME(TIME *tmp, my_time_t t) const; virtual void gmt_sec_to_TIME(TIME *tmp, my_time_t t) const;
virtual const String * get_name() const; virtual const String * get_name() const;
private: private:
@ -1193,7 +1193,7 @@ Time_zone_db::Time_zone_db(TIME_ZONE_INFO *tz_info_arg,
Corresponding my_time_t value or 0 in case of error Corresponding my_time_t value or 0 in case of error
*/ */
my_time_t my_time_t
Time_zone_db::TIME_to_gmt_sec(const TIME *t, bool *in_dst_time_gap) const Time_zone_db::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const
{ {
return ::TIME_to_gmt_sec(t, tz_info, in_dst_time_gap); return ::TIME_to_gmt_sec(t, tz_info, in_dst_time_gap);
} }
@ -1240,7 +1240,7 @@ class Time_zone_offset : public Time_zone
public: public:
Time_zone_offset(long tz_offset_arg); Time_zone_offset(long tz_offset_arg);
virtual my_time_t TIME_to_gmt_sec(const TIME *t, virtual my_time_t TIME_to_gmt_sec(const TIME *t,
bool *in_dst_time_gap) const; my_bool *in_dst_time_gap) const;
virtual void gmt_sec_to_TIME(TIME *tmp, my_time_t t) const; virtual void gmt_sec_to_TIME(TIME *tmp, my_time_t t) const;
virtual const String * get_name() const; virtual const String * get_name() const;
/* /*
@ -1292,7 +1292,7 @@ Time_zone_offset::Time_zone_offset(long tz_offset_arg):
Corresponding my_time_t value or 0 in case of error Corresponding my_time_t value or 0 in case of error
*/ */
my_time_t my_time_t
Time_zone_offset::TIME_to_gmt_sec(const TIME *t, bool *in_dst_time_gap) const Time_zone_offset::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const
{ {
return sec_since_epoch(t->year, t->month, t->day, return sec_since_epoch(t->year, t->month, t->day,
t->hour, t->minute, t->second) - t->hour, t->minute, t->second) -
@ -2549,8 +2549,6 @@ main(int argc, char **argv)
time_t t, t1, t2; time_t t, t1, t2;
char fullname[FN_REFLEN+1]; char fullname[FN_REFLEN+1];
char *str_end; char *str_end;
long not_used;
bool not_used_2;
MEM_ROOT tz_storage; MEM_ROOT tz_storage;
MY_INIT(argv[0]); MY_INIT(argv[0]);
@ -2660,14 +2658,21 @@ main(int argc, char **argv)
dates. dates.
*/ */
for (time_tmp.year= 1980; time_tmp.year < 2010; time_tmp.year++) for (time_tmp.year= 1980; time_tmp.year < 2010; time_tmp.year++)
{
for (time_tmp.month= 1; time_tmp.month < 13; time_tmp.month++) for (time_tmp.month= 1; time_tmp.month < 13; time_tmp.month++)
{
for (time_tmp.day= 1; for (time_tmp.day= 1;
time_tmp.day < mon_lengths[isleap(time_tmp.year)][time_tmp.month-1]; time_tmp.day < mon_lengths[isleap(time_tmp.year)][time_tmp.month-1];
time_tmp.day++) time_tmp.day++)
{
for (time_tmp.hour= 0; time_tmp.hour < 24; time_tmp.hour++) for (time_tmp.hour= 0; time_tmp.hour < 24; time_tmp.hour++)
{
for (time_tmp.minute= 0; time_tmp.minute < 60; time_tmp.minute+= 5) for (time_tmp.minute= 0; time_tmp.minute < 60; time_tmp.minute+= 5)
{
for (time_tmp.second=0; time_tmp.second<60; time_tmp.second+=25) for (time_tmp.second=0; time_tmp.second<60; time_tmp.second+=25)
{ {
long not_used;
my_bool not_used_2;
t= (time_t)my_system_gmt_sec(&time_tmp, &not_used, &not_used_2); t= (time_t)my_system_gmt_sec(&time_tmp, &not_used, &not_used_2);
t1= (time_t)TIME_to_gmt_sec(&time_tmp, &tz_info, &not_used_2); t1= (time_t)TIME_to_gmt_sec(&time_tmp, &tz_info, &not_used_2);
if (t != t1) if (t != t1)
@ -2699,6 +2704,11 @@ main(int argc, char **argv)
return 1; return 1;
} }
} }
}
}
}
}
}
printf("TIME_to_gmt_sec = my_system_gmt_sec for test range\n"); printf("TIME_to_gmt_sec = my_system_gmt_sec for test range\n");

View File

@ -37,7 +37,7 @@ public:
falls into spring time-gap (or lefts it untouched otherwise). falls into spring time-gap (or lefts it untouched otherwise).
*/ */
virtual my_time_t TIME_to_gmt_sec(const TIME *t, virtual my_time_t TIME_to_gmt_sec(const TIME *t,
bool *in_dst_time_gap) const = 0; my_bool *in_dst_time_gap) const = 0;
/* /*
Converts time in my_time_t representation to local time in Converts time in my_time_t representation to local time in
broken down TIME representation. broken down TIME representation.