WL#2110 (SIGNAL)
WL#2265 (RESIGNAL) Manual merge of SIGNAL and RESIGNAL to mysql-trunk-signal, plus required dependencies.
This commit is contained in:
parent
905d715f10
commit
63e56390a3
@ -39,6 +39,17 @@ extern int NEAR my_errno; /* Last error in mysys */
|
||||
#define MYSYS_PROGRAM_DONT_USE_CURSES() { error_handler_hook = my_message_no_curses; mysys_uses_curses=0;}
|
||||
#define MY_INIT(name); { my_progname= name; my_init(); }
|
||||
|
||||
/**
|
||||
Max length of an error message generated by mysys utilities.
|
||||
Some mysys functions produce error messages. These mostly go
|
||||
to stderr.
|
||||
This constant defines the size of the buffer used to format
|
||||
the message. It should be kept in sync with MYSQL_ERRMSG_SIZE,
|
||||
since sometimes mysys errors are stored in the server diagnostics
|
||||
area, and we would like to avoid unexpected truncation.
|
||||
*/
|
||||
#define MYSYS_ERRMSG_SIZE (512)
|
||||
|
||||
#define MY_FILE_ERROR ((size_t) -1)
|
||||
|
||||
/* General bitmaps for my_func's */
|
||||
@ -89,8 +100,6 @@ extern int NEAR my_errno; /* Last error in mysys */
|
||||
#define ME_COLOUR2 ((2 << ME_HIGHBYTE))
|
||||
#define ME_COLOUR3 ((3 << ME_HIGHBYTE))
|
||||
#define ME_FATALERROR 1024 /* Fatal statement error */
|
||||
#define ME_NO_WARNING_FOR_ERROR 2048 /* Don't push a warning for error */
|
||||
#define ME_NO_SP_HANDLER 4096 /* Don't call stored routine error handlers */
|
||||
|
||||
/* Bits in last argument to fn_format */
|
||||
#define MY_REPLACE_DIR 1 /* replace dir in name with 'dir' */
|
||||
@ -209,8 +218,8 @@ extern int errno; /* declare errno */
|
||||
extern char *home_dir; /* Home directory for user */
|
||||
extern const char *my_progname; /* program-name (printed in errors) */
|
||||
extern char NEAR curr_dir[]; /* Current directory for user */
|
||||
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 void (*error_handler_hook)(uint my_err, const char *str,myf MyFlags);
|
||||
extern void (*fatal_error_handler_hook)(uint my_err, const char *str,
|
||||
myf MyFlags);
|
||||
extern uint my_file_limit;
|
||||
extern ulong my_thread_stack_size;
|
||||
@ -645,15 +654,15 @@ extern int my_chsize(File fd,my_off_t newlength, int filler, myf MyFlags);
|
||||
extern int my_sync(File fd, myf my_flags);
|
||||
extern int my_sync_dir(const char *dir_name, myf my_flags);
|
||||
extern int my_sync_dir_by_file(const char *file_name, myf my_flags);
|
||||
extern int my_error _VARARGS((int nr,myf MyFlags, ...));
|
||||
extern int my_printf_error _VARARGS((uint my_err, const char *format,
|
||||
myf MyFlags, ...))
|
||||
ATTRIBUTE_FORMAT(printf, 2, 4);
|
||||
extern void my_error _VARARGS((int nr,myf MyFlags, ...));
|
||||
extern void my_printf_error _VARARGS((uint my_err, const char *format,
|
||||
myf MyFlags, ...))
|
||||
ATTRIBUTE_FORMAT(printf, 2, 4);
|
||||
extern int my_error_register(const char **errmsgs, int first, int last);
|
||||
extern const char **my_error_unregister(int first, int last);
|
||||
extern int my_message(uint my_err, const char *str,myf MyFlags);
|
||||
extern int my_message_no_curses(uint my_err, const char *str,myf MyFlags);
|
||||
extern int my_message_curses(uint my_err, const char *str,myf MyFlags);
|
||||
extern void my_message(uint my_err, const char *str,myf MyFlags);
|
||||
extern void my_message_no_curses(uint my_err, const char *str,myf MyFlags);
|
||||
extern void my_message_curses(uint my_err, const char *str,myf MyFlags);
|
||||
extern my_bool my_init(void);
|
||||
extern void my_end(int infoflag);
|
||||
extern int my_redel(const char *from, const char *to, int MyFlags);
|
||||
|
@ -139,6 +139,7 @@ SET(LIBMYSQLD_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
|
||||
../sql/time.cc ../sql/tztime.cc ../sql/uniques.cc ../sql/unireg.cc
|
||||
../sql/partition_info.cc ../sql/sql_connect.cc
|
||||
../sql/scheduler.cc ../sql/event_parse_data.cc
|
||||
./sql/sql_signal.cc
|
||||
${GEN_SOURCES}
|
||||
${LIB_SOURCES})
|
||||
|
||||
|
@ -77,7 +77,7 @@ sqlsources = derror.cc field.cc field_conv.cc strfunc.cc filesort.cc \
|
||||
rpl_filter.cc sql_partition.cc sql_builtin.cc sql_plugin.cc \
|
||||
sql_tablespace.cc \
|
||||
rpl_injector.cc my_user.c partition_info.cc \
|
||||
sql_servers.cc event_parse_data.cc
|
||||
sql_servers.cc event_parse_data.cc sql_signal.cc
|
||||
|
||||
libmysqld_int_a_SOURCES= $(libmysqld_sources)
|
||||
nodist_libmysqld_int_a_SOURCES= $(libmysqlsources) $(sqlsources)
|
||||
|
@ -483,7 +483,8 @@ int emb_load_querycache_result(THD *thd, Querycache_stream *src)
|
||||
*prev_row= NULL;
|
||||
data->embedded_info->prev_ptr= prev_row;
|
||||
return_ok:
|
||||
net_send_eof(thd, thd->server_status, thd->total_warn_count);
|
||||
net_send_eof(thd, thd->server_status,
|
||||
thd->warning_info->statement_warn_count());
|
||||
DBUG_RETURN(0);
|
||||
err:
|
||||
DBUG_RETURN(1);
|
||||
|
@ -112,7 +112,7 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||
|
||||
/* Clear result variables */
|
||||
thd->clear_error();
|
||||
thd->main_da.reset_diagnostics_area();
|
||||
thd->stmt_da->reset_diagnostics_area();
|
||||
mysql->affected_rows= ~(my_ulonglong) 0;
|
||||
mysql->field_count= 0;
|
||||
net_clear_error(net);
|
||||
@ -217,7 +217,7 @@ static my_bool emb_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt)
|
||||
stmt->stmt_id= thd->client_stmt_id;
|
||||
stmt->param_count= thd->client_param_count;
|
||||
stmt->field_count= 0;
|
||||
mysql->warning_count= thd->total_warn_count;
|
||||
mysql->warning_count= thd->warning_info->statement_warn_count();
|
||||
|
||||
if (thd->first_data)
|
||||
{
|
||||
@ -402,7 +402,7 @@ static void emb_free_embedded_thd(MYSQL *mysql)
|
||||
static const char * emb_read_statistics(MYSQL *mysql)
|
||||
{
|
||||
THD *thd= (THD*)mysql->thd;
|
||||
return thd->is_error() ? thd->main_da.message() : "";
|
||||
return thd->is_error() ? thd->stmt_da->message() : "";
|
||||
}
|
||||
|
||||
|
||||
@ -703,9 +703,10 @@ int check_embedded_connection(MYSQL *mysql, const char *db)
|
||||
err:
|
||||
{
|
||||
NET *net= &mysql->net;
|
||||
strmake(net->last_error, thd->main_da.message(), sizeof(net->last_error)-1);
|
||||
strmake(net->last_error, thd->stmt_da->message(),
|
||||
sizeof(net->last_error)-1);
|
||||
memcpy(net->sqlstate,
|
||||
mysql_errno_to_sqlstate(thd->main_da.sql_errno()),
|
||||
mysql_errno_to_sqlstate(thd->stmt_da->sql_errno()),
|
||||
sizeof(net->sqlstate)-1);
|
||||
}
|
||||
return result;
|
||||
@ -729,8 +730,8 @@ void THD::clear_data_list()
|
||||
|
||||
void THD::clear_error()
|
||||
{
|
||||
if (main_da.is_error())
|
||||
main_da.reset_diagnostics_area();
|
||||
if (stmt_da->is_error())
|
||||
stmt_da->reset_diagnostics_area();
|
||||
}
|
||||
|
||||
static char *dup_str_aux(MEM_ROOT *root, const char *from, uint length,
|
||||
@ -804,7 +805,7 @@ MYSQL_DATA *THD::alloc_new_dataset()
|
||||
|
||||
static
|
||||
bool
|
||||
write_eof_packet(THD *thd, uint server_status, uint total_warn_count)
|
||||
write_eof_packet(THD *thd, uint server_status, uint statement_warn_count)
|
||||
{
|
||||
if (!thd->mysql) // bootstrap file handling
|
||||
return FALSE;
|
||||
@ -821,7 +822,7 @@ write_eof_packet(THD *thd, uint server_status, uint total_warn_count)
|
||||
is cleared between substatements, and mysqltest gets confused
|
||||
*/
|
||||
thd->cur_data->embedded_info->warning_count=
|
||||
(thd->spcont ? 0 : min(total_warn_count, 65535));
|
||||
(thd->spcont ? 0 : min(statement_warn_count, 65535));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -978,7 +979,8 @@ bool Protocol::send_fields(List<Item> *list, uint flags)
|
||||
}
|
||||
|
||||
if (flags & SEND_EOF)
|
||||
write_eof_packet(thd, thd->server_status, thd->total_warn_count);
|
||||
write_eof_packet(thd, thd->server_status,
|
||||
thd->warning_info->statement_warn_count());
|
||||
|
||||
DBUG_RETURN(prepare_for_send(list));
|
||||
err:
|
||||
@ -1040,25 +1042,24 @@ bool Protocol_binary::write()
|
||||
|
||||
bool
|
||||
net_send_ok(THD *thd,
|
||||
uint server_status, uint total_warn_count,
|
||||
ha_rows affected_rows, ulonglong id, const char *message)
|
||||
uint server_status, uint statement_warn_count,
|
||||
ulonglong affected_rows, ulonglong id, const char *message)
|
||||
{
|
||||
DBUG_ENTER("emb_net_send_ok");
|
||||
MYSQL_DATA *data;
|
||||
bool error;
|
||||
MYSQL *mysql= thd->mysql;
|
||||
|
||||
if (!mysql) // bootstrap file handling
|
||||
DBUG_RETURN(FALSE);
|
||||
if (!(data= thd->alloc_new_dataset()))
|
||||
return TRUE;
|
||||
DBUG_RETURN(TRUE);
|
||||
data->embedded_info->affected_rows= affected_rows;
|
||||
data->embedded_info->insert_id= id;
|
||||
if (message)
|
||||
strmake(data->embedded_info->info, message,
|
||||
sizeof(data->embedded_info->info)-1);
|
||||
|
||||
error= write_eof_packet(thd, server_status, total_warn_count);
|
||||
bool error= write_eof_packet(thd, server_status, statement_warn_count);
|
||||
thd->cur_data= 0;
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
@ -1075,15 +1076,16 @@ net_send_ok(THD *thd,
|
||||
*/
|
||||
|
||||
bool
|
||||
net_send_eof(THD *thd, uint server_status, uint total_warn_count)
|
||||
net_send_eof(THD *thd, uint server_status, uint statement_warn_count)
|
||||
{
|
||||
bool error= write_eof_packet(thd, server_status, total_warn_count);
|
||||
bool error= write_eof_packet(thd, server_status, statement_warn_count);
|
||||
thd->cur_data= 0;
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
bool net_send_error_packet(THD *thd, uint sql_errno, const char *err)
|
||||
bool net_send_error_packet(THD *thd, uint sql_errno, const char *err,
|
||||
const char *sqlstate)
|
||||
{
|
||||
MYSQL_DATA *data= thd->cur_data;
|
||||
struct embedded_query_result *ei;
|
||||
@ -1100,7 +1102,7 @@ bool net_send_error_packet(THD *thd, uint sql_errno, const char *err)
|
||||
ei= data->embedded_info;
|
||||
ei->last_errno= sql_errno;
|
||||
strmake(ei->info, err, sizeof(ei->info)-1);
|
||||
strmov(ei->sqlstate, mysql_errno_to_sqlstate(sql_errno));
|
||||
strmov(ei->sqlstate, sqlstate);
|
||||
ei->server_status= thd->server_status;
|
||||
thd->cur_data= 0;
|
||||
return FALSE;
|
||||
|
@ -362,12 +362,12 @@ select cast(19999999999999999999 as signed);
|
||||
cast(19999999999999999999 as signed)
|
||||
9223372036854775807
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select cast(-19999999999999999999 as signed);
|
||||
cast(-19999999999999999999 as signed)
|
||||
-9223372036854775808
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select -9223372036854775808;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def -9223372036854775808 8 20 20 N 32897 0 63
|
||||
|
@ -380,7 +380,7 @@ select cast(s1 as decimal(7,2)) from t1;
|
||||
cast(s1 as decimal(7,2))
|
||||
99999.99
|
||||
Warnings:
|
||||
Error 1264 Out of range value for column 'cast(s1 as decimal(7,2))' at row 1
|
||||
Warning 1264 Out of range value for column 'cast(s1 as decimal(7,2))' at row 1
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (v varchar(10), tt tinytext, t text,
|
||||
mt mediumtext, lt longtext);
|
||||
|
@ -1631,27 +1631,27 @@ select char(0xff,0x8f using utf8);
|
||||
char(0xff,0x8f using utf8)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1300 Invalid utf8 character string: 'FF8F'
|
||||
Warning 1300 Invalid utf8 character string: 'FF8F'
|
||||
select char(195 using utf8);
|
||||
char(195 using utf8)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1300 Invalid utf8 character string: 'C3'
|
||||
Warning 1300 Invalid utf8 character string: 'C3'
|
||||
select char(196 using utf8);
|
||||
char(196 using utf8)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1300 Invalid utf8 character string: 'C4'
|
||||
Warning 1300 Invalid utf8 character string: 'C4'
|
||||
select char(2557 using utf8);
|
||||
char(2557 using utf8)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1300 Invalid utf8 character string: 'FD'
|
||||
Warning 1300 Invalid utf8 character string: 'FD'
|
||||
select convert(char(0xff,0x8f) using utf8);
|
||||
convert(char(0xff,0x8f) using utf8)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1300 Invalid utf8 character string: 'FF8F'
|
||||
Warning 1300 Invalid utf8 character string: 'FF8F'
|
||||
select hex(convert(char(2557 using latin1) using utf8));
|
||||
hex(convert(char(2557 using latin1) using utf8))
|
||||
09C3BD
|
||||
@ -1815,12 +1815,12 @@ select hex(char(0xFF using utf8));
|
||||
hex(char(0xFF using utf8))
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1300 Invalid utf8 character string: 'FF'
|
||||
Warning 1300 Invalid utf8 character string: 'FF'
|
||||
select hex(convert(0xFF using utf8));
|
||||
hex(convert(0xFF using utf8))
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1300 Invalid utf8 character string: 'FF'
|
||||
Warning 1300 Invalid utf8 character string: 'FF'
|
||||
select hex(_utf8 0x616263FF);
|
||||
ERROR HY000: Invalid utf8 character string: 'FF'
|
||||
select hex(_utf8 X'616263FF');
|
||||
|
@ -89,7 +89,7 @@ select STR_TO_DATE('2004.12.12 22.30.61','%Y.%m.%d %T');
|
||||
STR_TO_DATE('2004.12.12 22.30.61','%Y.%m.%d %T')
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1411 Incorrect time value: '22.30.61' for function str_to_date
|
||||
Warning 1411 Incorrect time value: '22.30.61' for function str_to_date
|
||||
create table t1 (date char(30), format char(30) not null);
|
||||
insert into t1 values
|
||||
('2003-01-02 10:11:12', '%Y-%m-%d %H:%i:%S'),
|
||||
@ -361,21 +361,21 @@ Tuesday 52 2001 %W %u %x NULL
|
||||
7 53 1998 %w %u %Y NULL
|
||||
NULL %m.%d.%Y NULL
|
||||
Warnings:
|
||||
Error 1411 Incorrect datetime value: '2003-01-02 10:11:12 PM' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '2003-01-02 10:11:12.123456' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '2003-01-02 10:11:12AM' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '2003-01-02 10:11:12AN' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '2003-01-02 10:11:12 PM' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '10:20:10AM' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '15 Septembei 2001' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '15 Ju 2001' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: 'Sund 15 MA' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: 'Thursdai 12 1998' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: 'Sunday 01 2001' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: 'Tuesday 52 2001' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: 'Tuesday 52 2001' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: 'Tuesday 52 2001' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '7 53 1998' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '2003-01-02 10:11:12 PM' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '2003-01-02 10:11:12.123456' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '2003-01-02 10:11:12AM' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '2003-01-02 10:11:12AN' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '2003-01-02 10:11:12 PM' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '10:20:10AM' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '15 Septembei 2001' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '15 Ju 2001' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: 'Sund 15 MA' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: 'Thursdai 12 1998' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: 'Sunday 01 2001' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: 'Tuesday 52 2001' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: 'Tuesday 52 2001' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: 'Tuesday 52 2001' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '7 53 1998' for function str_to_date
|
||||
select date,format,concat(str_to_date(date, format),'') as con from t1;
|
||||
date format con
|
||||
2003-01-02 10:11:12 PM %Y-%m-%d %H:%i:%S %p NULL
|
||||
@ -395,21 +395,21 @@ Tuesday 52 2001 %W %u %x NULL
|
||||
7 53 1998 %w %u %Y NULL
|
||||
NULL %m.%d.%Y NULL
|
||||
Warnings:
|
||||
Error 1411 Incorrect datetime value: '2003-01-02 10:11:12 PM' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '2003-01-02 10:11:12.123456' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '2003-01-02 10:11:12AM' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '2003-01-02 10:11:12AN' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '2003-01-02 10:11:12 PM' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '10:20:10AM' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '15 Septembei 2001' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '15 Ju 2001' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: 'Sund 15 MA' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: 'Thursdai 12 1998' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: 'Sunday 01 2001' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: 'Tuesday 52 2001' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: 'Tuesday 52 2001' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: 'Tuesday 52 2001' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '7 53 1998' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '2003-01-02 10:11:12 PM' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '2003-01-02 10:11:12.123456' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '2003-01-02 10:11:12AM' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '2003-01-02 10:11:12AN' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '2003-01-02 10:11:12 PM' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '10:20:10AM' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '15 Septembei 2001' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '15 Ju 2001' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: 'Sund 15 MA' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: 'Thursdai 12 1998' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: 'Sunday 01 2001' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: 'Tuesday 52 2001' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: 'Tuesday 52 2001' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: 'Tuesday 52 2001' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '7 53 1998' for function str_to_date
|
||||
truncate table t1;
|
||||
insert into t1 values
|
||||
('10:20:10AM', '%h:%i:%s'),
|
||||
@ -449,7 +449,7 @@ select str_to_date('15-01-2001 12:59:59', GET_FORMAT(DATE,'USA'));
|
||||
str_to_date('15-01-2001 12:59:59', GET_FORMAT(DATE,'USA'))
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1411 Incorrect datetime value: '15-01-2001 12:59:59' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '15-01-2001 12:59:59' for function str_to_date
|
||||
explain extended select makedate(1997,1), addtime("31.12.97 11.59.59.999999 PM", "1 1.1.1.000002"),subtime("31.12.97 11.59.59.999999 PM", "1 1.1.1.000002"),timediff("01.01.97 11:59:59.000001 PM","31.12.95 11:59:59.000002 PM"),cast(str_to_date("15-01-2001 12:59:59", "%d-%m-%Y %H:%i:%S") as TIME), maketime(23,11,12),microsecond("1997-12-31 23:59:59.000001");
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
|
@ -65,8 +65,8 @@ NULL
|
||||
50000
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1259 ZLIB: Input data corrupted
|
||||
Error 1256 Uncompressed data size too large; the maximum size is 1048576 (probably, length of uncompressed data was corrupted)
|
||||
Warning 1259 ZLIB: Input data corrupted
|
||||
Warning 1256 Uncompressed data size too large; the maximum size is 1048576 (probably, length of uncompressed data was corrupted)
|
||||
drop table t1;
|
||||
set @@global.max_allowed_packet=1048576*100;
|
||||
select compress(repeat('aaaaaaaaaa', IF(XXX, 10, 10000000))) is null;
|
||||
@ -96,12 +96,12 @@ explain select * from t1 where uncompress(a) is null;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 1
|
||||
Warnings:
|
||||
Error 1259 ZLIB: Input data corrupted
|
||||
Warning 1259 ZLIB: Input data corrupted
|
||||
select * from t1 where uncompress(a) is null;
|
||||
a
|
||||
foo
|
||||
Warnings:
|
||||
Error 1259 ZLIB: Input data corrupted
|
||||
Warning 1259 ZLIB: Input data corrupted
|
||||
explain select *, uncompress(a) from t1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 1
|
||||
@ -109,13 +109,13 @@ select *, uncompress(a) from t1;
|
||||
a uncompress(a)
|
||||
foo NULL
|
||||
Warnings:
|
||||
Error 1259 ZLIB: Input data corrupted
|
||||
Warning 1259 ZLIB: Input data corrupted
|
||||
select *, uncompress(a), uncompress(a) is null from t1;
|
||||
a uncompress(a) uncompress(a) is null
|
||||
foo NULL 1
|
||||
Warnings:
|
||||
Error 1259 ZLIB: Input data corrupted
|
||||
Error 1259 ZLIB: Input data corrupted
|
||||
Warning 1259 ZLIB: Input data corrupted
|
||||
Warning 1259 ZLIB: Input data corrupted
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (c1 INT);
|
||||
INSERT INTO t1 VALUES (1), (1111), (11111);
|
||||
|
@ -124,7 +124,7 @@ select des_encrypt("hello",10);
|
||||
des_encrypt("hello",10)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1108 Incorrect parameters to procedure 'des_encrypt'
|
||||
Warning 1108 Incorrect parameters to procedure 'des_encrypt'
|
||||
select des_encrypt(NULL);
|
||||
des_encrypt(NULL)
|
||||
NULL
|
||||
@ -138,12 +138,12 @@ select des_encrypt(10, NULL);
|
||||
des_encrypt(10, NULL)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1108 Incorrect parameters to procedure 'des_encrypt'
|
||||
Warning 1108 Incorrect parameters to procedure 'des_encrypt'
|
||||
select des_encrypt("hello", NULL);
|
||||
des_encrypt("hello", NULL)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1108 Incorrect parameters to procedure 'des_encrypt'
|
||||
Warning 1108 Incorrect parameters to procedure 'des_encrypt'
|
||||
select des_decrypt("hello",10);
|
||||
des_decrypt("hello",10)
|
||||
hello
|
||||
@ -177,7 +177,7 @@ select hex(des_decrypt(des_encrypt("hello","hidden")));
|
||||
hex(des_decrypt(des_encrypt("hello","hidden")))
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1108 Incorrect parameters to procedure 'des_decrypt'
|
||||
Warning 1108 Incorrect parameters to procedure 'des_decrypt'
|
||||
explain extended select des_decrypt(des_encrypt("hello",4),'password2'), des_decrypt(des_encrypt("hello","hidden"));
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
|
@ -153,10 +153,10 @@ grp group_concat(c)
|
||||
4
|
||||
5 NULL
|
||||
Warnings:
|
||||
Warning 1260 1 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 4 was cut by GROUP_CONCAT()
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Warning 1260 1 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 4 was cut by GROUP_CONCAT()
|
||||
set group_concat_max_len = 1024;
|
||||
select group_concat(sum(c)) from t1 group by grp;
|
||||
ERROR HY000: Invalid use of group function
|
||||
@ -380,25 +380,29 @@ group_concat(b)
|
||||
bb,c
|
||||
BB,C
|
||||
Warnings:
|
||||
Warning 1260 2 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 2 was cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 4 was cut by GROUP_CONCAT()
|
||||
select group_concat(distinct b) from t1 group by a;
|
||||
group_concat(distinct b)
|
||||
bb,c
|
||||
BB,C
|
||||
Warnings:
|
||||
Warning 1260 2 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 2 was cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 4 was cut by GROUP_CONCAT()
|
||||
select group_concat(b order by b) from t1 group by a;
|
||||
group_concat(b order by b)
|
||||
a,bb
|
||||
A,BB
|
||||
Warnings:
|
||||
Warning 1260 2 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 3 was cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 6 was cut by GROUP_CONCAT()
|
||||
select group_concat(distinct b order by b) from t1 group by a;
|
||||
group_concat(distinct b order by b)
|
||||
a,bb
|
||||
A,BB
|
||||
Warnings:
|
||||
Warning 1260 2 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 3 was cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 6 was cut by GROUP_CONCAT()
|
||||
insert into t1 values (1, concat(repeat('1', 300), '2')),
|
||||
(1, concat(repeat('1', 300), '2')), (1, concat(repeat('0', 300), '1')),
|
||||
(2, concat(repeat('1', 300), '2')), (2, concat(repeat('1', 300), '2')),
|
||||
@ -426,25 +430,29 @@ group_concat(b)
|
||||
bb,ccc,a,bb,ccc,1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112,1111111111111111111111111111111111111111111111111111111111111111111111111111111111
|
||||
BB,CCC,A,BB,CCC,1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112,1111111111111111111111111111111111111111111111111111111111111111111111111111111111
|
||||
Warnings:
|
||||
Warning 1260 2 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 7 was cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 14 was cut by GROUP_CONCAT()
|
||||
select group_concat(distinct b) from t1 group by a;
|
||||
group_concat(distinct b)
|
||||
bb,ccc,a,1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112,00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
BB,CCC,A,1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112,00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
Warnings:
|
||||
Warning 1260 2 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 5 was cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 10 was cut by GROUP_CONCAT()
|
||||
select group_concat(b order by b) from t1 group by a;
|
||||
group_concat(b order by b)
|
||||
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001,11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
|
||||
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001,11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
|
||||
Warnings:
|
||||
Warning 1260 2 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 2 was cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 4 was cut by GROUP_CONCAT()
|
||||
select group_concat(distinct b order by b) from t1 group by a;
|
||||
group_concat(distinct b order by b)
|
||||
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001,11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
|
||||
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001,11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
|
||||
Warnings:
|
||||
Warning 1260 2 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 2 was cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 4 was cut by GROUP_CONCAT()
|
||||
drop table t1;
|
||||
create table t1 (a varchar(255) character set cp1250 collate cp1250_general_ci,
|
||||
b varchar(255) character set koi8r);
|
||||
@ -751,22 +759,22 @@ SELECT GROUP_CONCAT( a ) FROM t1;
|
||||
GROUP_CONCAT( a )
|
||||
aaaaaaaaaa,bbbbbbbbb
|
||||
Warnings:
|
||||
Warning 1260 1 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 2 was cut by GROUP_CONCAT()
|
||||
SELECT GROUP_CONCAT( DISTINCT a ) FROM t1;
|
||||
GROUP_CONCAT( DISTINCT a )
|
||||
aaaaaaaaaa,bbbbbbbbb
|
||||
Warnings:
|
||||
Warning 1260 1 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 2 was cut by GROUP_CONCAT()
|
||||
SELECT GROUP_CONCAT( a ORDER BY b ) FROM t1;
|
||||
GROUP_CONCAT( a ORDER BY b )
|
||||
aaaaaaaaaa,bbbbbbbbb
|
||||
Warnings:
|
||||
Warning 1260 1 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 2 was cut by GROUP_CONCAT()
|
||||
SELECT GROUP_CONCAT( DISTINCT a ORDER BY b ) FROM t1;
|
||||
GROUP_CONCAT( DISTINCT a ORDER BY b )
|
||||
aaaaaaaaaa,bbbbbbbbb
|
||||
Warnings:
|
||||
Warning 1260 1 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 2 was cut by GROUP_CONCAT()
|
||||
SET group_concat_max_len = DEFAULT;
|
||||
DROP TABLE t1;
|
||||
SET group_concat_max_len= 65535;
|
||||
@ -979,3 +987,31 @@ GROUP BY t1.a
|
||||
1
|
||||
DROP TABLE t1, t2;
|
||||
End of 5.0 tests
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
CREATE TABLE t1 (a VARCHAR(6), b INT);
|
||||
CREATE TABLE t2 (a VARCHAR(6), b INT);
|
||||
INSERT INTO t1 VALUES ('111111', 1);
|
||||
INSERT INTO t1 VALUES ('222222', 2);
|
||||
INSERT INTO t1 VALUES ('333333', 3);
|
||||
INSERT INTO t1 VALUES ('444444', 4);
|
||||
INSERT INTO t1 VALUES ('555555', 5);
|
||||
SET group_concat_max_len = 5;
|
||||
SET @old_sql_mode = @@sql_mode, @@sql_mode = 'traditional';
|
||||
SELECT GROUP_CONCAT(a), b FROM t1 GROUP BY b LIMIT 3;
|
||||
GROUP_CONCAT(a) b
|
||||
11111 1
|
||||
22222 2
|
||||
33333 3
|
||||
Warnings:
|
||||
Warning 1260 Row 1 was cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 2 was cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 3 was cut by GROUP_CONCAT()
|
||||
INSERT INTO t2 SELECT GROUP_CONCAT(a), b FROM t1 GROUP BY b;
|
||||
ERROR HY000: Row 1 was cut by GROUP_CONCAT()
|
||||
UPDATE t1 SET a = '11111' WHERE b = 1;
|
||||
UPDATE t1 SET a = '22222' WHERE b = 2;
|
||||
INSERT INTO t2 SELECT GROUP_CONCAT(a), b FROM t1 GROUP BY b;
|
||||
ERROR HY000: Row 3 was cut by GROUP_CONCAT()
|
||||
SET group_concat_max_len = DEFAULT;
|
||||
SET @@sql_mode = @old_sql_mode;
|
||||
DROP TABLE t1, t2;
|
||||
|
@ -225,27 +225,27 @@ select ln(-1);
|
||||
ln(-1)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
select log10(-1);
|
||||
log10(-1)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
select log2(-1);
|
||||
log2(-1)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
select log(2,-1);
|
||||
log(2,-1)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
select log(-2,1);
|
||||
log(-2,1)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
set sql_mode='';
|
||||
select round(111,-10);
|
||||
round(111,-10)
|
||||
|
@ -1433,7 +1433,7 @@ select benchmark(-1, 1);
|
||||
benchmark(-1, 1)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1411 Incorrect count value: '-1' for function benchmark
|
||||
Warning 1411 Incorrect count value: '-1' for function benchmark
|
||||
set @password="password";
|
||||
set @my_data="clear text to encode";
|
||||
select md5(encode(@my_data, "password"));
|
||||
@ -1533,7 +1533,7 @@ select locate('lo','hello',-18446744073709551615);
|
||||
locate('lo','hello',-18446744073709551615)
|
||||
0
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select locate('lo','hello',18446744073709551615);
|
||||
locate('lo','hello',18446744073709551615)
|
||||
0
|
||||
@ -1541,22 +1541,22 @@ select locate('lo','hello',-18446744073709551616);
|
||||
locate('lo','hello',-18446744073709551616)
|
||||
0
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select locate('lo','hello',18446744073709551616);
|
||||
locate('lo','hello',18446744073709551616)
|
||||
0
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select locate('lo','hello',-18446744073709551617);
|
||||
locate('lo','hello',-18446744073709551617)
|
||||
0
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select locate('lo','hello',18446744073709551617);
|
||||
locate('lo','hello',18446744073709551617)
|
||||
0
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select left('hello', 10);
|
||||
left('hello', 10)
|
||||
hello
|
||||
@ -1588,8 +1588,8 @@ select left('hello', -18446744073709551615);
|
||||
left('hello', -18446744073709551615)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select left('hello', 18446744073709551615);
|
||||
left('hello', 18446744073709551615)
|
||||
hello
|
||||
@ -1597,26 +1597,26 @@ select left('hello', -18446744073709551616);
|
||||
left('hello', -18446744073709551616)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select left('hello', 18446744073709551616);
|
||||
left('hello', 18446744073709551616)
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select left('hello', -18446744073709551617);
|
||||
left('hello', -18446744073709551617)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select left('hello', 18446744073709551617);
|
||||
left('hello', 18446744073709551617)
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select right('hello', 10);
|
||||
right('hello', 10)
|
||||
hello
|
||||
@ -1648,8 +1648,8 @@ select right('hello', -18446744073709551615);
|
||||
right('hello', -18446744073709551615)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select right('hello', 18446744073709551615);
|
||||
right('hello', 18446744073709551615)
|
||||
hello
|
||||
@ -1657,26 +1657,26 @@ select right('hello', -18446744073709551616);
|
||||
right('hello', -18446744073709551616)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select right('hello', 18446744073709551616);
|
||||
right('hello', 18446744073709551616)
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select right('hello', -18446744073709551617);
|
||||
right('hello', -18446744073709551617)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select right('hello', 18446744073709551617);
|
||||
right('hello', 18446744073709551617)
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', 2, -1);
|
||||
substring('hello', 2, -1)
|
||||
|
||||
@ -1708,8 +1708,8 @@ select substring('hello', -18446744073709551615, 1);
|
||||
substring('hello', -18446744073709551615, 1)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', 18446744073709551615, 1);
|
||||
substring('hello', 18446744073709551615, 1)
|
||||
|
||||
@ -1717,26 +1717,26 @@ select substring('hello', -18446744073709551616, 1);
|
||||
substring('hello', -18446744073709551616, 1)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', 18446744073709551616, 1);
|
||||
substring('hello', 18446744073709551616, 1)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', -18446744073709551617, 1);
|
||||
substring('hello', -18446744073709551617, 1)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', 18446744073709551617, 1);
|
||||
substring('hello', 18446744073709551617, 1)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', 1, -1);
|
||||
substring('hello', 1, -1)
|
||||
|
||||
@ -1762,8 +1762,8 @@ select substring('hello', 1, -18446744073709551615);
|
||||
substring('hello', 1, -18446744073709551615)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', 1, 18446744073709551615);
|
||||
substring('hello', 1, 18446744073709551615)
|
||||
hello
|
||||
@ -1771,26 +1771,26 @@ select substring('hello', 1, -18446744073709551616);
|
||||
substring('hello', 1, -18446744073709551616)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', 1, 18446744073709551616);
|
||||
substring('hello', 1, 18446744073709551616)
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', 1, -18446744073709551617);
|
||||
substring('hello', 1, -18446744073709551617)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', 1, 18446744073709551617);
|
||||
substring('hello', 1, 18446744073709551617)
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', -1, -1);
|
||||
substring('hello', -1, -1)
|
||||
|
||||
@ -1816,10 +1816,10 @@ select substring('hello', -18446744073709551615, -18446744073709551615);
|
||||
substring('hello', -18446744073709551615, -18446744073709551615)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', 18446744073709551615, 18446744073709551615);
|
||||
substring('hello', 18446744073709551615, 18446744073709551615)
|
||||
|
||||
@ -1827,34 +1827,34 @@ select substring('hello', -18446744073709551616, -18446744073709551616);
|
||||
substring('hello', -18446744073709551616, -18446744073709551616)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', 18446744073709551616, 18446744073709551616);
|
||||
substring('hello', 18446744073709551616, 18446744073709551616)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', -18446744073709551617, -18446744073709551617);
|
||||
substring('hello', -18446744073709551617, -18446744073709551617)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select substring('hello', 18446744073709551617, 18446744073709551617);
|
||||
substring('hello', 18446744073709551617, 18446744073709551617)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', -1, 1, 'hi');
|
||||
insert('hello', -1, 1, 'hi')
|
||||
hello
|
||||
@ -1880,7 +1880,7 @@ select insert('hello', -18446744073709551615, 1, 'hi');
|
||||
insert('hello', -18446744073709551615, 1, 'hi')
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', 18446744073709551615, 1, 'hi');
|
||||
insert('hello', 18446744073709551615, 1, 'hi')
|
||||
hello
|
||||
@ -1888,22 +1888,22 @@ select insert('hello', -18446744073709551616, 1, 'hi');
|
||||
insert('hello', -18446744073709551616, 1, 'hi')
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', 18446744073709551616, 1, 'hi');
|
||||
insert('hello', 18446744073709551616, 1, 'hi')
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', -18446744073709551617, 1, 'hi');
|
||||
insert('hello', -18446744073709551617, 1, 'hi')
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', 18446744073709551617, 1, 'hi');
|
||||
insert('hello', 18446744073709551617, 1, 'hi')
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', 1, -1, 'hi');
|
||||
insert('hello', 1, -1, 'hi')
|
||||
hi
|
||||
@ -1929,7 +1929,7 @@ select insert('hello', 1, -18446744073709551615, 'hi');
|
||||
insert('hello', 1, -18446744073709551615, 'hi')
|
||||
hi
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', 1, 18446744073709551615, 'hi');
|
||||
insert('hello', 1, 18446744073709551615, 'hi')
|
||||
hi
|
||||
@ -1937,22 +1937,22 @@ select insert('hello', 1, -18446744073709551616, 'hi');
|
||||
insert('hello', 1, -18446744073709551616, 'hi')
|
||||
hi
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', 1, 18446744073709551616, 'hi');
|
||||
insert('hello', 1, 18446744073709551616, 'hi')
|
||||
hi
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', 1, -18446744073709551617, 'hi');
|
||||
insert('hello', 1, -18446744073709551617, 'hi')
|
||||
hi
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', 1, 18446744073709551617, 'hi');
|
||||
insert('hello', 1, 18446744073709551617, 'hi')
|
||||
hi
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', -1, -1, 'hi');
|
||||
insert('hello', -1, -1, 'hi')
|
||||
hello
|
||||
@ -1978,8 +1978,8 @@ select insert('hello', -18446744073709551615, -18446744073709551615, 'hi');
|
||||
insert('hello', -18446744073709551615, -18446744073709551615, 'hi')
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', 18446744073709551615, 18446744073709551615, 'hi');
|
||||
insert('hello', 18446744073709551615, 18446744073709551615, 'hi')
|
||||
hello
|
||||
@ -1987,26 +1987,26 @@ select insert('hello', -18446744073709551616, -18446744073709551616, 'hi');
|
||||
insert('hello', -18446744073709551616, -18446744073709551616, 'hi')
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', 18446744073709551616, 18446744073709551616, 'hi');
|
||||
insert('hello', 18446744073709551616, 18446744073709551616, 'hi')
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', -18446744073709551617, -18446744073709551617, 'hi');
|
||||
insert('hello', -18446744073709551617, -18446744073709551617, 'hi')
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select insert('hello', 18446744073709551617, 18446744073709551617, 'hi');
|
||||
insert('hello', 18446744073709551617, 18446744073709551617, 'hi')
|
||||
hello
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select repeat('hello', -1);
|
||||
repeat('hello', -1)
|
||||
|
||||
@ -2038,8 +2038,8 @@ select repeat('hello', -18446744073709551615);
|
||||
repeat('hello', -18446744073709551615)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select repeat('hello', 18446744073709551615);
|
||||
repeat('hello', 18446744073709551615)
|
||||
NULL
|
||||
@ -2049,27 +2049,27 @@ select repeat('hello', -18446744073709551616);
|
||||
repeat('hello', -18446744073709551616)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select repeat('hello', 18446744073709551616);
|
||||
repeat('hello', 18446744073709551616)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1301 Result of repeat() was larger than max_allowed_packet (1048576) - truncated
|
||||
select repeat('hello', -18446744073709551617);
|
||||
repeat('hello', -18446744073709551617)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select repeat('hello', 18446744073709551617);
|
||||
repeat('hello', 18446744073709551617)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1301 Result of repeat() was larger than max_allowed_packet (1048576) - truncated
|
||||
select space(-1);
|
||||
space(-1)
|
||||
@ -2102,8 +2102,8 @@ select space(-18446744073709551615);
|
||||
space(-18446744073709551615)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select space(18446744073709551615);
|
||||
space(18446744073709551615)
|
||||
NULL
|
||||
@ -2113,27 +2113,27 @@ select space(-18446744073709551616);
|
||||
space(-18446744073709551616)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select space(18446744073709551616);
|
||||
space(18446744073709551616)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1301 Result of repeat() was larger than max_allowed_packet (1048576) - truncated
|
||||
select space(-18446744073709551617);
|
||||
space(-18446744073709551617)
|
||||
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select space(18446744073709551617);
|
||||
space(18446744073709551617)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1301 Result of repeat() was larger than max_allowed_packet (1048576) - truncated
|
||||
select rpad('hello', -1, '1');
|
||||
rpad('hello', -1, '1')
|
||||
@ -2166,8 +2166,8 @@ select rpad('hello', -18446744073709551615, '1');
|
||||
rpad('hello', -18446744073709551615, '1')
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select rpad('hello', 18446744073709551615, '1');
|
||||
rpad('hello', 18446744073709551615, '1')
|
||||
NULL
|
||||
@ -2177,27 +2177,27 @@ select rpad('hello', -18446744073709551616, '1');
|
||||
rpad('hello', -18446744073709551616, '1')
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select rpad('hello', 18446744073709551616, '1');
|
||||
rpad('hello', 18446744073709551616, '1')
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1301 Result of rpad() was larger than max_allowed_packet (1048576) - truncated
|
||||
select rpad('hello', -18446744073709551617, '1');
|
||||
rpad('hello', -18446744073709551617, '1')
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select rpad('hello', 18446744073709551617, '1');
|
||||
rpad('hello', 18446744073709551617, '1')
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1301 Result of rpad() was larger than max_allowed_packet (1048576) - truncated
|
||||
select lpad('hello', -1, '1');
|
||||
lpad('hello', -1, '1')
|
||||
@ -2230,8 +2230,8 @@ select lpad('hello', -18446744073709551615, '1');
|
||||
lpad('hello', -18446744073709551615, '1')
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select lpad('hello', 18446744073709551615, '1');
|
||||
lpad('hello', 18446744073709551615, '1')
|
||||
NULL
|
||||
@ -2241,27 +2241,27 @@ select lpad('hello', -18446744073709551616, '1');
|
||||
lpad('hello', -18446744073709551616, '1')
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select lpad('hello', 18446744073709551616, '1');
|
||||
lpad('hello', 18446744073709551616, '1')
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1301 Result of lpad() was larger than max_allowed_packet (1048576) - truncated
|
||||
select lpad('hello', -18446744073709551617, '1');
|
||||
lpad('hello', -18446744073709551617, '1')
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select lpad('hello', 18446744073709551617, '1');
|
||||
lpad('hello', 18446744073709551617, '1')
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1301 Result of lpad() was larger than max_allowed_packet (1048576) - truncated
|
||||
SET @orig_sql_mode = @@SQL_MODE;
|
||||
SET SQL_MODE=traditional;
|
||||
@ -2269,12 +2269,12 @@ SELECT CHAR(0xff,0x8f USING utf8);
|
||||
CHAR(0xff,0x8f USING utf8)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1300 Invalid utf8 character string: 'FF8F'
|
||||
Warning 1300 Invalid utf8 character string: 'FF8F'
|
||||
SELECT CHAR(0xff,0x8f USING utf8) IS NULL;
|
||||
CHAR(0xff,0x8f USING utf8) IS NULL
|
||||
1
|
||||
Warnings:
|
||||
Error 1300 Invalid utf8 character string: 'FF8F'
|
||||
Warning 1300 Invalid utf8 character string: 'FF8F'
|
||||
SET SQL_MODE=@orig_sql_mode;
|
||||
select substring('abc', cast(2 as unsigned int));
|
||||
substring('abc', cast(2 as unsigned int))
|
||||
|
@ -942,25 +942,29 @@ group_concat(t1.b,t2.c)
|
||||
aaaaa
|
||||
bbbbb
|
||||
Warnings:
|
||||
Warning 1260 2 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 1 was cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 2 was cut by GROUP_CONCAT()
|
||||
select group_concat(t1.b,t2.c) from t1 inner join t2 using(a) group by t1.a;
|
||||
group_concat(t1.b,t2.c)
|
||||
aaaaa
|
||||
bbbbb
|
||||
Warnings:
|
||||
Warning 1260 2 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 1 was cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 2 was cut by GROUP_CONCAT()
|
||||
select group_concat(t1.b,t2.c) from t1 left join t2 using(a) group by a;
|
||||
group_concat(t1.b,t2.c)
|
||||
aaaaa
|
||||
bbbbb
|
||||
Warnings:
|
||||
Warning 1260 2 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 1 was cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 2 was cut by GROUP_CONCAT()
|
||||
select group_concat(t1.b,t2.c) from t1 inner join t2 using(a) group by a;
|
||||
group_concat(t1.b,t2.c)
|
||||
aaaaa
|
||||
bbbbb
|
||||
Warnings:
|
||||
Warning 1260 2 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 1 was cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 2 was cut by GROUP_CONCAT()
|
||||
drop table t1, t2;
|
||||
set group_concat_max_len=default;
|
||||
create table t1 (gid smallint(5) unsigned not null, x int(11) not null, y int(11) not null, art int(11) not null, primary key (gid,x,y));
|
||||
|
@ -914,7 +914,7 @@ SELECT * FROM tm1;
|
||||
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
|
||||
CHECK TABLE tm1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.tm1 check Error Table 'test.t2' is differently defined or of non-MyISAM type or doesn't exist
|
||||
test.tm1 check Warning Table 'test.t2' is differently defined or of non-MyISAM type or doesn't exist
|
||||
test.tm1 check Error Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
|
||||
test.tm1 check error Corrupt
|
||||
ALTER TABLE t2 MODIFY a INT;
|
||||
|
@ -2,7 +2,7 @@ drop table if exists t1,t2;
|
||||
create table t1 (a int) engine=myisam;
|
||||
drop table if exists t1;
|
||||
Warnings:
|
||||
Error 2 Can't find file: 't1' (errno: 2)
|
||||
Warning 2 Can't find file: 't1' (errno: 2)
|
||||
create table t1 (a int) engine=myisam;
|
||||
drop table t1;
|
||||
Got one of the listed errors
|
||||
|
@ -1226,7 +1226,6 @@ COMMIT;
|
||||
END|
|
||||
CALL test.p1(12);
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||
CALL test.p1(13);
|
||||
Warnings:
|
||||
|
@ -2748,17 +2748,21 @@ Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
call proc_1();
|
||||
Level Code Message
|
||||
Note 1051 Unknown table 't1'
|
||||
drop table if exists t2;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't2'
|
||||
call proc_1();
|
||||
Level Code Message
|
||||
Note 1051 Unknown table 't2'
|
||||
drop table if exists t1, t2;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
Note 1051 Unknown table 't2'
|
||||
call proc_1();
|
||||
Level Code Message
|
||||
Note 1051 Unknown table 't1'
|
||||
Note 1051 Unknown table 't2'
|
||||
drop procedure proc_1;
|
||||
create function func_1() returns int begin show warnings; return 1; end|
|
||||
ERROR 0A000: Not allowed to return a result set from a function
|
||||
|
@ -889,7 +889,7 @@ select group_concat(a) FROM t1 group by b;
|
||||
group_concat(a)
|
||||
1234567890
|
||||
Warnings:
|
||||
Warning 1260 1 line(s) were cut by GROUP_CONCAT()
|
||||
Warning 1260 Row 1 was cut by GROUP_CONCAT()
|
||||
set group_concat_max_len=1024;
|
||||
select group_concat(a) FROM t1 group by b;
|
||||
group_concat(a)
|
||||
@ -992,19 +992,19 @@ COUNT(*)
|
||||
0
|
||||
Warnings:
|
||||
Warning 1292 Incorrect datetime value: '20050327 invalid' for column 'date' at row 1
|
||||
Warning 1292 Incorrect datetime value: '20050327 invalid' for column 'date' at row 0
|
||||
Warning 1292 Incorrect datetime value: '20050327 invalid' for column 'date' at row 1
|
||||
SELECT COUNT(*) FROM t1 WHERE date BETWEEN '20050326' AND '20050328 invalid';
|
||||
COUNT(*)
|
||||
0
|
||||
Warnings:
|
||||
Warning 1292 Incorrect datetime value: '20050328 invalid' for column 'date' at row 1
|
||||
Warning 1292 Incorrect datetime value: '20050328 invalid' for column 'date' at row 0
|
||||
Warning 1292 Incorrect datetime value: '20050328 invalid' for column 'date' at row 1
|
||||
SELECT COUNT(*) FROM t1 WHERE date BETWEEN '20050326' AND '20050327 invalid';
|
||||
COUNT(*)
|
||||
0
|
||||
Warnings:
|
||||
Warning 1292 Incorrect datetime value: '20050327 invalid' for column 'date' at row 1
|
||||
Warning 1292 Incorrect datetime value: '20050327 invalid' for column 'date' at row 0
|
||||
Warning 1292 Incorrect datetime value: '20050327 invalid' for column 'date' at row 1
|
||||
show status like "Qcache_queries_in_cache";
|
||||
Variable_name Value
|
||||
Qcache_queries_in_cache 0
|
||||
|
2362
mysql-test/r/signal.result
Normal file
2362
mysql-test/r/signal.result
Normal file
File diff suppressed because it is too large
Load Diff
35
mysql-test/r/signal_code.result
Normal file
35
mysql-test/r/signal_code.result
Normal file
@ -0,0 +1,35 @@
|
||||
use test;
|
||||
drop procedure if exists signal_proc;
|
||||
drop function if exists signal_func;
|
||||
create procedure signal_proc()
|
||||
begin
|
||||
DECLARE foo CONDITION FOR SQLSTATE '12345';
|
||||
SIGNAL foo;
|
||||
SIGNAL foo SET MESSAGE_TEXT = "This is an error message";
|
||||
RESIGNAL foo;
|
||||
RESIGNAL foo SET MESSAGE_TEXT = "This is an error message";
|
||||
end $$
|
||||
create function signal_func() returns int
|
||||
begin
|
||||
DECLARE foo CONDITION FOR SQLSTATE '12345';
|
||||
SIGNAL foo;
|
||||
SIGNAL foo SET MESSAGE_TEXT = "This is an error message";
|
||||
RESIGNAL foo;
|
||||
RESIGNAL foo SET MESSAGE_TEXT = "This is an error message";
|
||||
return 0;
|
||||
end $$
|
||||
show procedure code signal_proc;
|
||||
Pos Instruction
|
||||
0 stmt 136 "SIGNAL foo"
|
||||
1 stmt 136 "SIGNAL foo SET MESSAGE_TEXT = "This i..."
|
||||
2 stmt 137 "RESIGNAL foo"
|
||||
3 stmt 137 "RESIGNAL foo SET MESSAGE_TEXT = "This..."
|
||||
drop procedure signal_proc;
|
||||
show function code signal_func;
|
||||
Pos Instruction
|
||||
0 stmt 136 "SIGNAL foo"
|
||||
1 stmt 136 "SIGNAL foo SET MESSAGE_TEXT = "This i..."
|
||||
2 stmt 137 "RESIGNAL foo"
|
||||
3 stmt 137 "RESIGNAL foo SET MESSAGE_TEXT = "This..."
|
||||
4 freturn 3 0
|
||||
drop function signal_func;
|
270
mysql-test/r/signal_demo1.result
Normal file
270
mysql-test/r/signal_demo1.result
Normal file
@ -0,0 +1,270 @@
|
||||
drop database if exists demo;
|
||||
create database demo;
|
||||
use demo;
|
||||
create table ab_physical_person (
|
||||
person_id integer,
|
||||
first_name VARCHAR(50),
|
||||
middle_initial CHAR,
|
||||
last_name VARCHAR(50),
|
||||
primary key (person_id));
|
||||
create table ab_moral_person (
|
||||
company_id integer,
|
||||
name VARCHAR(100),
|
||||
primary key (company_id));
|
||||
create table in_inventory (
|
||||
item_id integer,
|
||||
descr VARCHAR(50),
|
||||
stock integer,
|
||||
primary key (item_id));
|
||||
create table po_order (
|
||||
po_id integer auto_increment,
|
||||
cust_type char, /* arc relationship, see cust_id */
|
||||
cust_id integer, /* FK to ab_physical_person *OR* ab_moral_person */
|
||||
primary key (po_id));
|
||||
create table po_order_line (
|
||||
po_id integer, /* FK to po_order.po_id */
|
||||
line_no integer,
|
||||
item_id integer, /* FK to in_inventory.item_id */
|
||||
qty integer);
|
||||
#
|
||||
# Schema integrity enforcement
|
||||
#
|
||||
create procedure check_pk_person(in person_type char, in id integer)
|
||||
begin
|
||||
declare x integer;
|
||||
declare msg varchar(128);
|
||||
/*
|
||||
Test integrity constraints for an 'arc' relationship.
|
||||
Based on 'person_type', 'id' points to either a
|
||||
physical person, or a moral person.
|
||||
*/
|
||||
case person_type
|
||||
when 'P' then
|
||||
begin
|
||||
select count(person_id) from ab_physical_person
|
||||
where ab_physical_person.person_id = id
|
||||
into x;
|
||||
if (x != 1)
|
||||
then
|
||||
set msg= concat('No such physical person, PK:', id);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 10000;
|
||||
end if;
|
||||
end;
|
||||
when 'M' then
|
||||
begin
|
||||
select count(company_id) from ab_moral_person
|
||||
where ab_moral_person.company_id = id
|
||||
into x;
|
||||
if (x != 1)
|
||||
then
|
||||
set msg= concat('No such moral person, PK:', id);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 10000;
|
||||
end if;
|
||||
end;
|
||||
else
|
||||
begin
|
||||
set msg= concat('No such person type:', person_type);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 20000;
|
||||
end;
|
||||
end case;
|
||||
end
|
||||
$$
|
||||
create procedure check_pk_inventory(in id integer)
|
||||
begin
|
||||
declare x integer;
|
||||
declare msg varchar(128);
|
||||
select count(item_id) from in_inventory
|
||||
where in_inventory.item_id = id
|
||||
into x;
|
||||
if (x != 1)
|
||||
then
|
||||
set msg= concat('Failed integrity constraint, table in_inventory, PK:',
|
||||
id);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 10000;
|
||||
end if;
|
||||
end
|
||||
$$
|
||||
create procedure check_pk_order(in id integer)
|
||||
begin
|
||||
declare x integer;
|
||||
declare msg varchar(128);
|
||||
select count(po_id) from po_order
|
||||
where po_order.po_id = id
|
||||
into x;
|
||||
if (x != 1)
|
||||
then
|
||||
set msg= concat('Failed integrity constraint, table po_order, PK:', id);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 10000;
|
||||
end if;
|
||||
end
|
||||
$$
|
||||
create trigger po_order_bi before insert on po_order
|
||||
for each row
|
||||
begin
|
||||
call check_pk_person(NEW.cust_type, NEW.cust_id);
|
||||
end
|
||||
$$
|
||||
create trigger po_order_bu before update on po_order
|
||||
for each row
|
||||
begin
|
||||
call check_pk_person(NEW.cust_type, NEW.cust_id);
|
||||
end
|
||||
$$
|
||||
create trigger po_order_line_bi before insert on po_order_line
|
||||
for each row
|
||||
begin
|
||||
call check_pk_order(NEW.po_id);
|
||||
call check_pk_inventory(NEW.item_id);
|
||||
end
|
||||
$$
|
||||
create trigger po_order_line_bu before update on po_order_line
|
||||
for each row
|
||||
begin
|
||||
call check_pk_order(NEW.po_id);
|
||||
call check_pk_inventory(NEW.item_id);
|
||||
end
|
||||
$$
|
||||
#
|
||||
# Application helpers
|
||||
#
|
||||
create procedure po_create_order(
|
||||
in p_cust_type char,
|
||||
in p_cust_id integer,
|
||||
out id integer)
|
||||
begin
|
||||
insert into po_order set cust_type = p_cust_type, cust_id = p_cust_id;
|
||||
set id = last_insert_id();
|
||||
end
|
||||
$$
|
||||
create procedure po_add_order_line(
|
||||
in po integer,
|
||||
in line integer,
|
||||
in item integer,
|
||||
in q integer)
|
||||
begin
|
||||
insert into po_order_line set
|
||||
po_id = po, line_no = line, item_id = item, qty = q;
|
||||
end
|
||||
$$
|
||||
#
|
||||
# Create sample data
|
||||
#
|
||||
insert into ab_physical_person values
|
||||
( 1, "John", "A", "Doe"),
|
||||
( 2, "Marry", "B", "Smith")
|
||||
;
|
||||
insert into ab_moral_person values
|
||||
( 3, "ACME real estate, INC"),
|
||||
( 4, "Local school")
|
||||
;
|
||||
insert into in_inventory values
|
||||
( 100, "Table, dinner", 5),
|
||||
( 101, "Chair", 20),
|
||||
( 200, "Table, coffee", 3),
|
||||
( 300, "School table", 25),
|
||||
( 301, "School chairs", 50)
|
||||
;
|
||||
select * from ab_physical_person order by person_id;
|
||||
person_id first_name middle_initial last_name
|
||||
1 John A Doe
|
||||
2 Marry B Smith
|
||||
select * from ab_moral_person order by company_id;
|
||||
company_id name
|
||||
3 ACME real estate, INC
|
||||
4 Local school
|
||||
select * from in_inventory order by item_id;
|
||||
item_id descr stock
|
||||
100 Table, dinner 5
|
||||
101 Chair 20
|
||||
200 Table, coffee 3
|
||||
300 School table 25
|
||||
301 School chairs 50
|
||||
#
|
||||
# Entering an order
|
||||
#
|
||||
set @my_po = 0;
|
||||
/* John Doe wants 1 table and 4 chairs */
|
||||
call po_create_order("P", 1, @my_po);
|
||||
call po_add_order_line (@my_po, 1, 100, 1);
|
||||
call po_add_order_line (@my_po, 2, 101, 4);
|
||||
/* Marry Smith wants a coffee table */
|
||||
call po_create_order("P", 2, @my_po);
|
||||
call po_add_order_line (@my_po, 1, 200, 1);
|
||||
#
|
||||
# Entering bad data in an order
|
||||
#
|
||||
call po_add_order_line (@my_po, 1, 999, 1);
|
||||
ERROR 45000: Failed integrity constraint, table in_inventory, PK:999
|
||||
#
|
||||
# Entering bad data in an unknown order
|
||||
#
|
||||
call po_add_order_line (99, 1, 100, 1);
|
||||
ERROR 45000: Failed integrity constraint, table po_order, PK:99
|
||||
#
|
||||
# Entering an order for an unknown company
|
||||
#
|
||||
call po_create_order("M", 7, @my_po);
|
||||
ERROR 45000: No such moral person, PK:7
|
||||
#
|
||||
# Entering an order for an unknown person type
|
||||
#
|
||||
call po_create_order("X", 1, @my_po);
|
||||
ERROR 45000: No such person type:X
|
||||
/* The local school wants 10 class tables and 20 chairs */
|
||||
call po_create_order("M", 4, @my_po);
|
||||
call po_add_order_line (@my_po, 1, 300, 10);
|
||||
call po_add_order_line (@my_po, 2, 301, 20);
|
||||
select * from po_order;
|
||||
po_id cust_type cust_id
|
||||
1 P 1
|
||||
2 P 2
|
||||
3 M 4
|
||||
select * from po_order_line;
|
||||
po_id line_no item_id qty
|
||||
1 1 100 1
|
||||
1 2 101 4
|
||||
2 1 200 1
|
||||
3 1 300 10
|
||||
3 2 301 20
|
||||
select po_id as "PO#",
|
||||
( case cust_type
|
||||
when "P" then concat (pp.first_name,
|
||||
" ",
|
||||
pp.middle_initial,
|
||||
" ",
|
||||
pp.last_name)
|
||||
when "M" then mp.name
|
||||
end ) as "Sold to"
|
||||
from po_order po
|
||||
left join ab_physical_person pp on po.cust_id = pp.person_id
|
||||
left join ab_moral_person mp on po.cust_id = company_id
|
||||
;
|
||||
PO# Sold to
|
||||
1 John A Doe
|
||||
2 Marry B Smith
|
||||
3 Local school
|
||||
select po_id as "PO#",
|
||||
ol.line_no as "Line",
|
||||
ol.item_id as "Item",
|
||||
inv.descr as "Description",
|
||||
ol.qty as "Quantity"
|
||||
from po_order_line ol, in_inventory inv
|
||||
where inv.item_id = ol.item_id
|
||||
order by ol.item_id, ol.line_no;
|
||||
PO# Line Item Description Quantity
|
||||
1 1 100 Table, dinner 1
|
||||
1 2 101 Chair 4
|
||||
2 1 200 Table, coffee 1
|
||||
3 1 300 School table 10
|
||||
3 2 301 School chairs 20
|
||||
drop database demo;
|
197
mysql-test/r/signal_demo2.result
Normal file
197
mysql-test/r/signal_demo2.result
Normal file
@ -0,0 +1,197 @@
|
||||
drop database if exists demo;
|
||||
create database demo;
|
||||
use demo;
|
||||
create procedure proc_top_a(p1 integer)
|
||||
begin
|
||||
## DECLARE CONTINUE HANDLER for SQLEXCEPTION, NOT FOUND
|
||||
begin
|
||||
end;
|
||||
select "Starting ...";
|
||||
call proc_middle_a(p1);
|
||||
select "The end";
|
||||
end
|
||||
$$
|
||||
create procedure proc_middle_a(p1 integer)
|
||||
begin
|
||||
DECLARE l integer;
|
||||
# without RESIGNAL:
|
||||
# Should be: DECLARE EXIT HANDLER for SQLEXCEPTION, NOT FOUND
|
||||
DECLARE EXIT HANDLER for 1 /* not sure how to handle exceptions */
|
||||
begin
|
||||
select "Oops ... now what ?";
|
||||
end;
|
||||
select "In prod_middle()";
|
||||
create temporary table t1(a integer, b integer);
|
||||
select GET_LOCK("user_mutex", 10) into l;
|
||||
insert into t1 set a = p1, b = p1;
|
||||
call proc_bottom_a(p1);
|
||||
select RELEASE_LOCK("user_mutex") into l;
|
||||
drop temporary table t1;
|
||||
end
|
||||
$$
|
||||
create procedure proc_bottom_a(p1 integer)
|
||||
begin
|
||||
select "In proc_bottom()";
|
||||
if (p1 = 1) then
|
||||
begin
|
||||
select "Doing something that works ...";
|
||||
select * from t1;
|
||||
end;
|
||||
end if;
|
||||
if (p1 = 2) then
|
||||
begin
|
||||
select "Doing something that fail (simulate an error) ...";
|
||||
drop table no_such_table;
|
||||
end;
|
||||
end if;
|
||||
if (p1 = 3) then
|
||||
begin
|
||||
select "Doing something that *SHOULD* works ...";
|
||||
select * from t1;
|
||||
end;
|
||||
end if;
|
||||
end
|
||||
$$
|
||||
call proc_top_a(1);
|
||||
Starting ...
|
||||
Starting ...
|
||||
In prod_middle()
|
||||
In prod_middle()
|
||||
In proc_bottom()
|
||||
In proc_bottom()
|
||||
Doing something that works ...
|
||||
Doing something that works ...
|
||||
a b
|
||||
1 1
|
||||
The end
|
||||
The end
|
||||
call proc_top_a(2);
|
||||
Starting ...
|
||||
Starting ...
|
||||
In prod_middle()
|
||||
In prod_middle()
|
||||
In proc_bottom()
|
||||
In proc_bottom()
|
||||
Doing something that fail (simulate an error) ...
|
||||
Doing something that fail (simulate an error) ...
|
||||
ERROR 42S02: Unknown table 'no_such_table'
|
||||
call proc_top_a(3);
|
||||
Starting ...
|
||||
Starting ...
|
||||
In prod_middle()
|
||||
In prod_middle()
|
||||
ERROR 42S01: Table 't1' already exists
|
||||
call proc_top_a(1);
|
||||
Starting ...
|
||||
Starting ...
|
||||
In prod_middle()
|
||||
In prod_middle()
|
||||
ERROR 42S01: Table 't1' already exists
|
||||
drop temporary table if exists t1;
|
||||
create procedure proc_top_b(p1 integer)
|
||||
begin
|
||||
select "Starting ...";
|
||||
call proc_middle_b(p1);
|
||||
select "The end";
|
||||
end
|
||||
$$
|
||||
create procedure proc_middle_b(p1 integer)
|
||||
begin
|
||||
DECLARE l integer;
|
||||
DECLARE EXIT HANDLER for SQLEXCEPTION, NOT FOUND
|
||||
begin
|
||||
begin
|
||||
DECLARE CONTINUE HANDLER for SQLEXCEPTION, NOT FOUND
|
||||
begin
|
||||
/* Ignore errors from the cleanup code */
|
||||
end;
|
||||
select "Doing cleanup !";
|
||||
select RELEASE_LOCK("user_mutex") into l;
|
||||
drop temporary table t1;
|
||||
end;
|
||||
RESIGNAL;
|
||||
end;
|
||||
select "In prod_middle()";
|
||||
create temporary table t1(a integer, b integer);
|
||||
select GET_LOCK("user_mutex", 10) into l;
|
||||
insert into t1 set a = p1, b = p1;
|
||||
call proc_bottom_b(p1);
|
||||
select RELEASE_LOCK("user_mutex") into l;
|
||||
drop temporary table t1;
|
||||
end
|
||||
$$
|
||||
create procedure proc_bottom_b(p1 integer)
|
||||
begin
|
||||
select "In proc_bottom()";
|
||||
if (p1 = 1) then
|
||||
begin
|
||||
select "Doing something that works ...";
|
||||
select * from t1;
|
||||
end;
|
||||
end if;
|
||||
if (p1 = 2) then
|
||||
begin
|
||||
select "Doing something that fail (simulate an error) ...";
|
||||
drop table no_such_table;
|
||||
end;
|
||||
end if;
|
||||
if (p1 = 3) then
|
||||
begin
|
||||
select "Doing something that *SHOULD* works ...";
|
||||
select * from t1;
|
||||
end;
|
||||
end if;
|
||||
end
|
||||
$$
|
||||
call proc_top_b(1);
|
||||
Starting ...
|
||||
Starting ...
|
||||
In prod_middle()
|
||||
In prod_middle()
|
||||
In proc_bottom()
|
||||
In proc_bottom()
|
||||
Doing something that works ...
|
||||
Doing something that works ...
|
||||
a b
|
||||
1 1
|
||||
The end
|
||||
The end
|
||||
call proc_top_b(2);
|
||||
Starting ...
|
||||
Starting ...
|
||||
In prod_middle()
|
||||
In prod_middle()
|
||||
In proc_bottom()
|
||||
In proc_bottom()
|
||||
Doing something that fail (simulate an error) ...
|
||||
Doing something that fail (simulate an error) ...
|
||||
Doing cleanup !
|
||||
Doing cleanup !
|
||||
ERROR 42S02: Unknown table 'no_such_table'
|
||||
call proc_top_b(3);
|
||||
Starting ...
|
||||
Starting ...
|
||||
In prod_middle()
|
||||
In prod_middle()
|
||||
In proc_bottom()
|
||||
In proc_bottom()
|
||||
Doing something that *SHOULD* works ...
|
||||
Doing something that *SHOULD* works ...
|
||||
a b
|
||||
3 3
|
||||
The end
|
||||
The end
|
||||
call proc_top_b(1);
|
||||
Starting ...
|
||||
Starting ...
|
||||
In prod_middle()
|
||||
In prod_middle()
|
||||
In proc_bottom()
|
||||
In proc_bottom()
|
||||
Doing something that works ...
|
||||
Doing something that works ...
|
||||
a b
|
||||
1 1
|
||||
The end
|
||||
The end
|
||||
drop database demo;
|
143
mysql-test/r/signal_demo3.result
Normal file
143
mysql-test/r/signal_demo3.result
Normal file
@ -0,0 +1,143 @@
|
||||
SET @start_global_value = @@global.max_error_count;
|
||||
SELECT @start_global_value;
|
||||
@start_global_value
|
||||
64
|
||||
SET @start_session_value = @@session.max_error_count;
|
||||
SELECT @start_session_value;
|
||||
@start_session_value
|
||||
64
|
||||
drop database if exists demo;
|
||||
create database demo;
|
||||
use demo;
|
||||
create procedure proc_1()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_1';
|
||||
call proc_2();
|
||||
end
|
||||
$$
|
||||
create procedure proc_2()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_2';
|
||||
call proc_3();
|
||||
end
|
||||
$$
|
||||
create procedure proc_3()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_3';
|
||||
call proc_4();
|
||||
end
|
||||
$$
|
||||
create procedure proc_4()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_4';
|
||||
call proc_5();
|
||||
end
|
||||
$$
|
||||
create procedure proc_5()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_5';
|
||||
call proc_6();
|
||||
end
|
||||
$$
|
||||
create procedure proc_6()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_6';
|
||||
call proc_7();
|
||||
end
|
||||
$$
|
||||
create procedure proc_7()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_7';
|
||||
call proc_8();
|
||||
end
|
||||
$$
|
||||
create procedure proc_8()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_8';
|
||||
call proc_9();
|
||||
end
|
||||
$$
|
||||
create procedure proc_9()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_9';
|
||||
## Do something that fails, to see how errors are reported
|
||||
drop table oops_it_is_not_here;
|
||||
end
|
||||
$$
|
||||
call proc_1();
|
||||
ERROR 45000: Oops in proc_1
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1051 Unknown table 'oops_it_is_not_here'
|
||||
Error 1642 Oops in proc_9
|
||||
Error 1642 Oops in proc_8
|
||||
Error 1642 Oops in proc_7
|
||||
Error 1642 Oops in proc_6
|
||||
Error 1642 Oops in proc_5
|
||||
Error 1642 Oops in proc_4
|
||||
Error 1642 Oops in proc_3
|
||||
Error 1642 Oops in proc_2
|
||||
Error 1642 Oops in proc_1
|
||||
SET @@session.max_error_count = 5;
|
||||
SELECT @@session.max_error_count;
|
||||
@@session.max_error_count
|
||||
5
|
||||
call proc_1();
|
||||
ERROR 45000: Oops in proc_1
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1642 Oops in proc_5
|
||||
Error 1642 Oops in proc_4
|
||||
Error 1642 Oops in proc_3
|
||||
Error 1642 Oops in proc_2
|
||||
Error 1642 Oops in proc_1
|
||||
SET @@session.max_error_count = 7;
|
||||
SELECT @@session.max_error_count;
|
||||
@@session.max_error_count
|
||||
7
|
||||
call proc_1();
|
||||
ERROR 45000: Oops in proc_1
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1642 Oops in proc_7
|
||||
Error 1642 Oops in proc_6
|
||||
Error 1642 Oops in proc_5
|
||||
Error 1642 Oops in proc_4
|
||||
Error 1642 Oops in proc_3
|
||||
Error 1642 Oops in proc_2
|
||||
Error 1642 Oops in proc_1
|
||||
SET @@session.max_error_count = 9;
|
||||
SELECT @@session.max_error_count;
|
||||
@@session.max_error_count
|
||||
9
|
||||
call proc_1();
|
||||
ERROR 45000: Oops in proc_1
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1642 Oops in proc_9
|
||||
Error 1642 Oops in proc_8
|
||||
Error 1642 Oops in proc_7
|
||||
Error 1642 Oops in proc_6
|
||||
Error 1642 Oops in proc_5
|
||||
Error 1642 Oops in proc_4
|
||||
Error 1642 Oops in proc_3
|
||||
Error 1642 Oops in proc_2
|
||||
Error 1642 Oops in proc_1
|
||||
drop database demo;
|
||||
SET @@global.max_error_count = @start_global_value;
|
||||
SELECT @@global.max_error_count;
|
||||
@@global.max_error_count
|
||||
64
|
||||
SET @@session.max_error_count = @start_session_value;
|
||||
SELECT @@session.max_error_count;
|
||||
@@session.max_error_count
|
||||
64
|
86
mysql-test/r/signal_sqlmode.result
Normal file
86
mysql-test/r/signal_sqlmode.result
Normal file
@ -0,0 +1,86 @@
|
||||
SET @save_sql_mode=@@sql_mode;
|
||||
SET sql_mode='';
|
||||
drop procedure if exists p;
|
||||
drop procedure if exists p2;
|
||||
drop procedure if exists p3;
|
||||
create procedure p()
|
||||
begin
|
||||
declare utf8_var VARCHAR(128) CHARACTER SET UTF8;
|
||||
set utf8_var = concat(repeat('A', 128), 'X');
|
||||
select length(utf8_var), utf8_var;
|
||||
end
|
||||
$$
|
||||
create procedure p2()
|
||||
begin
|
||||
declare msg VARCHAR(129) CHARACTER SET UTF8;
|
||||
set msg = concat(repeat('A', 128), 'X');
|
||||
select length(msg), msg;
|
||||
signal sqlstate '55555' set message_text = msg;
|
||||
end
|
||||
$$
|
||||
create procedure p3()
|
||||
begin
|
||||
declare name VARCHAR(65) CHARACTER SET UTF8;
|
||||
set name = concat(repeat('A', 64), 'X');
|
||||
select length(name), name;
|
||||
signal sqlstate '55555' set
|
||||
message_text = 'Message',
|
||||
table_name = name;
|
||||
end
|
||||
$$
|
||||
call p;
|
||||
length(utf8_var) utf8_var
|
||||
128 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'utf8_var' at row 1
|
||||
call p2;
|
||||
length(msg) msg
|
||||
129 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX
|
||||
ERROR 55555: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
call p3;
|
||||
length(name) name
|
||||
65 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX
|
||||
ERROR 55555: Message
|
||||
drop procedure p;
|
||||
drop procedure p2;
|
||||
drop procedure p3;
|
||||
SET sql_mode='STRICT_ALL_TABLES';
|
||||
create procedure p()
|
||||
begin
|
||||
declare utf8_var VARCHAR(128) CHARACTER SET UTF8;
|
||||
set utf8_var = concat(repeat('A', 128), 'X');
|
||||
select length(utf8_var), utf8_var;
|
||||
end
|
||||
$$
|
||||
create procedure p2()
|
||||
begin
|
||||
declare msg VARCHAR(129) CHARACTER SET UTF8;
|
||||
set msg = concat(repeat('A', 128), 'X');
|
||||
select length(msg), msg;
|
||||
signal sqlstate '55555' set message_text = msg;
|
||||
end
|
||||
$$
|
||||
create procedure p3()
|
||||
begin
|
||||
declare name VARCHAR(65) CHARACTER SET UTF8;
|
||||
set name = concat(repeat('A', 64), 'X');
|
||||
select length(name), name;
|
||||
signal sqlstate '55555' set
|
||||
message_text = 'Message',
|
||||
table_name = name;
|
||||
end
|
||||
$$
|
||||
call p;
|
||||
ERROR 22001: Data too long for column 'utf8_var' at row 1
|
||||
call p2;
|
||||
length(msg) msg
|
||||
129 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX
|
||||
ERROR HY000: Data too long for condition item 'MESSAGE_TEXT'
|
||||
call p3;
|
||||
length(name) name
|
||||
65 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX
|
||||
ERROR HY000: Data too long for condition item 'TABLE_NAME'
|
||||
drop procedure p;
|
||||
drop procedure p2;
|
||||
drop procedure p3;
|
||||
SET @@sql_mode=@save_sql_mode;
|
@ -97,8 +97,6 @@ end|
|
||||
call p1()|
|
||||
a
|
||||
1
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
call p1()|
|
||||
a
|
||||
1
|
||||
@ -371,9 +369,6 @@ call p1(@a)|
|
||||
create table t1 (a int)
|
||||
@rsql
|
||||
create table t2 (a int)
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
Note 1051 Unknown table 't2'
|
||||
select @a|
|
||||
@a
|
||||
0
|
||||
@ -382,9 +377,6 @@ call p1(@a)|
|
||||
create table t1 (a int)
|
||||
@rsql
|
||||
create table t2 (a int)
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
Note 1051 Unknown table 't2'
|
||||
select @a|
|
||||
@a
|
||||
0
|
||||
|
@ -110,24 +110,6 @@ v7 v8 v9 v10 v11 v12 v13 v14 v15 v16
|
||||
v17 v18 v19 v20
|
||||
12.00 12.12 12.00 12.12
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'v1' at row 1
|
||||
Warning 1264 Out of range value for column 'v1u' at row 1
|
||||
Warning 1264 Out of range value for column 'v2' at row 1
|
||||
Warning 1264 Out of range value for column 'v2u' at row 1
|
||||
Warning 1264 Out of range value for column 'v3' at row 1
|
||||
Warning 1264 Out of range value for column 'v3u' at row 1
|
||||
Warning 1264 Out of range value for column 'v4' at row 1
|
||||
Warning 1264 Out of range value for column 'v4u' at row 1
|
||||
Warning 1264 Out of range value for column 'v5' at row 1
|
||||
Warning 1264 Out of range value for column 'v5u' at row 1
|
||||
Warning 1264 Out of range value for column 'v6' at row 1
|
||||
Warning 1264 Out of range value for column 'v6u' at row 1
|
||||
Warning 1366 Incorrect integer value: 'String 10 ' for column 'v10' at row 1
|
||||
Warning 1366 Incorrect integer value: 'String10' for column 'v11' at row 1
|
||||
Warning 1265 Data truncated for column 'v12' at row 1
|
||||
Warning 1265 Data truncated for column 'v13' at row 1
|
||||
Warning 1366 Incorrect integer value: 'Hello, world' for column 'v16' at row 1
|
||||
Note 1265 Data truncated for column 'v18' at row 1
|
||||
Note 1265 Data truncated for column 'v20' at row 1
|
||||
CALL sp_vars_check_assignment();
|
||||
i1 i2 i3 i4
|
||||
@ -143,21 +125,6 @@ d1 d2 d3
|
||||
d1 d2 d3
|
||||
1234.00 1234.12 1234.12
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'i1' at row 1
|
||||
Warning 1264 Out of range value for column 'i2' at row 1
|
||||
Warning 1264 Out of range value for column 'i3' at row 1
|
||||
Warning 1264 Out of range value for column 'i4' at row 1
|
||||
Warning 1264 Out of range value for column 'i1' at row 1
|
||||
Warning 1264 Out of range value for column 'i2' at row 1
|
||||
Warning 1264 Out of range value for column 'i3' at row 1
|
||||
Warning 1264 Out of range value for column 'i4' at row 1
|
||||
Warning 1264 Out of range value for column 'u1' at row 1
|
||||
Warning 1264 Out of range value for column 'u2' at row 1
|
||||
Warning 1264 Out of range value for column 'u3' at row 1
|
||||
Warning 1264 Out of range value for column 'u4' at row 1
|
||||
Warning 1264 Out of range value for column 'u1' at row 1
|
||||
Warning 1264 Out of range value for column 'u2' at row 1
|
||||
Note 1265 Data truncated for column 'd3' at row 1
|
||||
Note 1265 Data truncated for column 'd3' at row 1
|
||||
SELECT sp_vars_check_ret1();
|
||||
sp_vars_check_ret1()
|
||||
@ -198,24 +165,6 @@ v7 v8 v9 v10 v11 v12 v13 v14 v15 v16
|
||||
v17 v18 v19 v20
|
||||
12.00 12.12 12.00 12.12
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'v1' at row 1
|
||||
Warning 1264 Out of range value for column 'v1u' at row 1
|
||||
Warning 1264 Out of range value for column 'v2' at row 1
|
||||
Warning 1264 Out of range value for column 'v2u' at row 1
|
||||
Warning 1264 Out of range value for column 'v3' at row 1
|
||||
Warning 1264 Out of range value for column 'v3u' at row 1
|
||||
Warning 1264 Out of range value for column 'v4' at row 1
|
||||
Warning 1264 Out of range value for column 'v4u' at row 1
|
||||
Warning 1264 Out of range value for column 'v5' at row 1
|
||||
Warning 1264 Out of range value for column 'v5u' at row 1
|
||||
Warning 1264 Out of range value for column 'v6' at row 1
|
||||
Warning 1264 Out of range value for column 'v6u' at row 1
|
||||
Warning 1366 Incorrect integer value: 'String 10 ' for column 'v10' at row 1
|
||||
Warning 1366 Incorrect integer value: 'String10' for column 'v11' at row 1
|
||||
Warning 1265 Data truncated for column 'v12' at row 1
|
||||
Warning 1265 Data truncated for column 'v13' at row 1
|
||||
Warning 1366 Incorrect integer value: 'Hello, world' for column 'v16' at row 1
|
||||
Note 1265 Data truncated for column 'v18' at row 1
|
||||
Note 1265 Data truncated for column 'v20' at row 1
|
||||
CALL sp_vars_check_assignment();
|
||||
i1 i2 i3 i4
|
||||
@ -231,21 +180,6 @@ d1 d2 d3
|
||||
d1 d2 d3
|
||||
1234.00 1234.12 1234.12
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'i1' at row 1
|
||||
Warning 1264 Out of range value for column 'i2' at row 1
|
||||
Warning 1264 Out of range value for column 'i3' at row 1
|
||||
Warning 1264 Out of range value for column 'i4' at row 1
|
||||
Warning 1264 Out of range value for column 'i1' at row 1
|
||||
Warning 1264 Out of range value for column 'i2' at row 1
|
||||
Warning 1264 Out of range value for column 'i3' at row 1
|
||||
Warning 1264 Out of range value for column 'i4' at row 1
|
||||
Warning 1264 Out of range value for column 'u1' at row 1
|
||||
Warning 1264 Out of range value for column 'u2' at row 1
|
||||
Warning 1264 Out of range value for column 'u3' at row 1
|
||||
Warning 1264 Out of range value for column 'u4' at row 1
|
||||
Warning 1264 Out of range value for column 'u1' at row 1
|
||||
Warning 1264 Out of range value for column 'u2' at row 1
|
||||
Note 1265 Data truncated for column 'd3' at row 1
|
||||
Note 1265 Data truncated for column 'd3' at row 1
|
||||
SELECT sp_vars_check_ret1();
|
||||
sp_vars_check_ret1()
|
||||
@ -451,10 +385,6 @@ FF
|
||||
HEX(v10)
|
||||
FF
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'v8' at row 1
|
||||
Warning 1264 Out of range value for column 'v9' at row 1
|
||||
Warning 1264 Out of range value for column 'v10' at row 1
|
||||
Warning 1264 Out of range value for column 'v1' at row 1
|
||||
Warning 1264 Out of range value for column 'v5' at row 1
|
||||
DROP PROCEDURE p1;
|
||||
|
||||
|
@ -526,8 +526,6 @@ end|
|
||||
delete from t1|
|
||||
create table t3 ( s char(16), d int)|
|
||||
call into_test4()|
|
||||
Warnings:
|
||||
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||
select * from t3|
|
||||
s d
|
||||
into4 NULL
|
||||
@ -1120,8 +1118,6 @@ end|
|
||||
select f9()|
|
||||
f9()
|
||||
6
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't3'
|
||||
select f9() from t1 limit 1|
|
||||
f9()
|
||||
6
|
||||
@ -1162,8 +1158,6 @@ drop temporary table t3|
|
||||
select f12_1()|
|
||||
f12_1()
|
||||
3
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't3'
|
||||
select f12_1() from t1 limit 1|
|
||||
f12_1()
|
||||
3
|
||||
@ -2069,12 +2063,7 @@ end if;
|
||||
insert into t4 values (2, rc, t3);
|
||||
end|
|
||||
call bug1863(10)|
|
||||
Warnings:
|
||||
Note 1051 Unknown table 'temp_t1'
|
||||
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||
call bug1863(10)|
|
||||
Warnings:
|
||||
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||
select * from t4|
|
||||
f1 rc t3
|
||||
2 0 NULL
|
||||
@ -2339,11 +2328,7 @@ begin
|
||||
end|
|
||||
call bug4579_1()|
|
||||
call bug4579_1()|
|
||||
Warnings:
|
||||
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||
call bug4579_1()|
|
||||
Warnings:
|
||||
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||
drop procedure bug4579_1|
|
||||
drop procedure bug4579_2|
|
||||
drop table t3|
|
||||
@ -3736,9 +3721,6 @@ Table Create Table
|
||||
tm1 CREATE TEMPORARY TABLE `tm1` (
|
||||
`spv1` decimal(3,3) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'spv1' at row 1
|
||||
Warning 1366 Incorrect decimal value: 'test' for column 'spv1' at row 1
|
||||
call bug12589_2()|
|
||||
Table Create Table
|
||||
tm1 CREATE TEMPORARY TABLE `tm1` (
|
||||
@ -6106,35 +6088,6 @@ bug5274_f2()
|
||||
x
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
Warning 1265 Data truncated for column 'bug5274_f1' at row 1
|
||||
DROP FUNCTION bug5274_f1|
|
||||
DROP FUNCTION bug5274_f2|
|
||||
drop procedure if exists proc_21513|
|
||||
@ -6229,20 +6182,17 @@ f1(2)
|
||||
0
|
||||
Warnings:
|
||||
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||
PREPARE s1 FROM 'SELECT f1(2)';
|
||||
EXECUTE s1;
|
||||
f1(2)
|
||||
0
|
||||
Warnings:
|
||||
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||
EXECUTE s1;
|
||||
f1(2)
|
||||
0
|
||||
Warnings:
|
||||
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||
DROP PROCEDURE p1;
|
||||
DROP PROCEDURE p2;
|
||||
DROP FUNCTION f1;
|
||||
@ -6254,6 +6204,7 @@ create procedure mysqltest_db1.sp_bug28551() begin end;
|
||||
call mysqltest_db1.sp_bug28551();
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Note 1008 Can't drop database 'mysqltest_db1'; database doesn't exist
|
||||
drop database mysqltest_db1;
|
||||
drop database if exists mysqltest_db1;
|
||||
drop table if exists test.t1;
|
||||
|
@ -21,9 +21,11 @@ end|
|
||||
call bug4902_2()|
|
||||
show warnings|
|
||||
Level Code Message
|
||||
Note 1305 PROCEDURE bug4902_2 does not exist
|
||||
call bug4902_2()|
|
||||
show warnings|
|
||||
Level Code Message
|
||||
Note 1305 PROCEDURE bug4902_2 does not exist
|
||||
drop procedure bug4902_2|
|
||||
drop table if exists t1|
|
||||
create table t1 (
|
||||
|
@ -315,8 +315,8 @@ MOD(col1,0)
|
||||
NULL
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
INSERT INTO t1 (col1) VALUES(-129);
|
||||
ERROR 22003: Out of range value for column 'col1' at row 1
|
||||
INSERT INTO t1 (col1) VALUES(128);
|
||||
@ -343,7 +343,7 @@ SELECT MOD(col1,0) FROM t1 WHERE col1 > 0 LIMIT 1;
|
||||
MOD(col1,0)
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
UPDATE t1 SET col1 = col1 - 50 WHERE col1 < 0;
|
||||
ERROR 22003: Out of range value for column 'col1' at row 1
|
||||
UPDATE t1 SET col2=col2 + 50 WHERE col2 > 0;
|
||||
@ -353,16 +353,16 @@ ERROR 22012: Division by 0
|
||||
set @@sql_mode='ERROR_FOR_DIVISION_BY_ZERO';
|
||||
INSERT INTO t1 values (1/0,1/0);
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
set @@sql_mode='ansi,traditional';
|
||||
SELECT MOD(col1,0) FROM t1 WHERE col1 > 0 LIMIT 2;
|
||||
MOD(col1,0)
|
||||
NULL
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
INSERT INTO t1 (col1) VALUES ('');
|
||||
ERROR HY000: Incorrect integer value: '' for column 'col1' at row 1
|
||||
INSERT INTO t1 (col1) VALUES ('a59b');
|
||||
@ -374,8 +374,8 @@ Warnings:
|
||||
Warning 1265 Data truncated for column 'col1' at row 1
|
||||
INSERT IGNORE INTO t1 values (1/0,1/0);
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
set @@sql_mode='ansi';
|
||||
INSERT INTO t1 values (1/0,1/0);
|
||||
set @@sql_mode='ansi,traditional';
|
||||
@ -457,8 +457,8 @@ Warnings:
|
||||
Warning 1265 Data truncated for column 'col1' at row 1
|
||||
INSERT IGNORE INTO t1 values (1/0,1/0);
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
INSERT IGNORE INTO t1 VALUES(-32769,-1),(32768,65536);
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'col1' at row 1
|
||||
@ -541,8 +541,8 @@ Warnings:
|
||||
Warning 1265 Data truncated for column 'col1' at row 1
|
||||
INSERT IGNORE INTO t1 values (1/0,1/0);
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
INSERT IGNORE INTO t1 VALUES(-8388609,-1),(8388608,16777216);
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'col1' at row 1
|
||||
@ -625,8 +625,8 @@ Warnings:
|
||||
Warning 1265 Data truncated for column 'col1' at row 1
|
||||
INSERT IGNORE INTO t1 values (1/0,1/0);
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
INSERT IGNORE INTO t1 values (-2147483649, -1),(2147643648,4294967296);
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'col1' at row 1
|
||||
@ -707,8 +707,8 @@ Warnings:
|
||||
Warning 1265 Data truncated for column 'col1' at row 1
|
||||
INSERT IGNORE INTO t1 values (1/0,1/0);
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
INSERT IGNORE INTO t1 VALUES(-9223372036854775809,-1),(9223372036854775808,18446744073709551616);
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'col1' at row 1
|
||||
@ -794,7 +794,7 @@ Warnings:
|
||||
Note 1265 Data truncated for column 'col1' at row 1
|
||||
INSERT IGNORE INTO t1 values (1/0);
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
INSERT IGNORE INTO t1 VALUES(1000),(-1000);
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'col1' at row 1
|
||||
@ -861,7 +861,7 @@ Warnings:
|
||||
Warning 1265 Data truncated for column 'col1' at row 1
|
||||
INSERT IGNORE INTO t1 (col1) VALUES (1/0);
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
INSERT IGNORE INTO t1 VALUES (+3.4E+39,-3.4E+39);
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'col1' at row 1
|
||||
@ -910,7 +910,7 @@ Warnings:
|
||||
Warning 1265 Data truncated for column 'col1' at row 1
|
||||
INSERT IGNORE INTO t1 (col1) values (1/0);
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
INSERT IGNORE INTO t1 VALUES (+1.9E+309,-1.9E+309);
|
||||
ERROR 22007: Illegal double '1.9E+309' value found during parsing
|
||||
INSERT IGNORE INTO t1 VALUES ('+2.0E+309','-2.0E+309');
|
||||
@ -1080,13 +1080,13 @@ Warnings:
|
||||
Warning 1292 Truncated incorrect datetime value: '31.10.2004 15.30 abc'
|
||||
insert into t1 values(STR_TO_DATE('32.10.2004 15.30','%d.%m.%Y %H.%i'));
|
||||
Warnings:
|
||||
Error 1411 Incorrect datetime value: '32.10.2004 15.30' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '32.10.2004 15.30' for function str_to_date
|
||||
insert into t1 values(STR_TO_DATE('2004.12.12 22:22:33 AM','%Y.%m.%d %r'));
|
||||
Warnings:
|
||||
Error 1411 Incorrect time value: '22:22:33 AM' for function str_to_date
|
||||
Warning 1411 Incorrect time value: '22:22:33 AM' for function str_to_date
|
||||
insert into t1 values(STR_TO_DATE('2004.12.12 abc','%Y.%m.%d %T'));
|
||||
Warnings:
|
||||
Error 1411 Incorrect time value: 'abc' for function str_to_date
|
||||
Warning 1411 Incorrect time value: 'abc' for function str_to_date
|
||||
insert into t1 values(STR_TO_DATE('31.10.2004 15.30','%d.%m.%Y %H.%i'));
|
||||
insert into t1 values(STR_TO_DATE('2004.12.12 11:22:33 AM','%Y.%m.%d %r'));
|
||||
insert into t1 values(STR_TO_DATE('2004.12.12 10:22:59','%Y.%m.%d %T'));
|
||||
@ -1104,9 +1104,9 @@ select count(*) from t1 where STR_TO_DATE('2004.12.12 10:22:61','%Y.%m.%d %T') I
|
||||
count(*)
|
||||
7
|
||||
Warnings:
|
||||
Error 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_date
|
||||
Error 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_date
|
||||
Warning 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_date
|
||||
drop table t1;
|
||||
create table t1 (col1 char(3), col2 integer);
|
||||
insert into t1 (col1) values (cast(1000 as char(3)));
|
||||
|
@ -1073,7 +1073,7 @@ NULL
|
||||
SET @x=2;
|
||||
UPDATE t1 SET i1 = @x;
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
SELECT @x;
|
||||
@x
|
||||
NULL
|
||||
@ -1086,8 +1086,8 @@ NULL
|
||||
SET @x=4;
|
||||
UPDATE t1 SET i1 = @x;
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
SELECT @x;
|
||||
@x
|
||||
NULL
|
||||
@ -1190,16 +1190,16 @@ create trigger t4_bu before update on t4 for each row set @t4_bu_called:=1|
|
||||
insert into t1 values(10, 10)|
|
||||
set @a:=1/0|
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
select 1/0 from t1|
|
||||
1/0
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
create trigger t1_bi before insert on t1 for each row set @a:=1/0|
|
||||
insert into t1 values(20, 20)|
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
drop trigger t1_bi|
|
||||
create trigger t1_bi before insert on t1 for each row
|
||||
begin
|
||||
@ -1219,7 +1219,7 @@ end|
|
||||
set @check=0, @t4_bi_called=0, @t4_bu_called=0|
|
||||
insert into t1 values(30, 30)|
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
select @check, @t4_bi_called, @t4_bu_called|
|
||||
@check @t4_bi_called @t4_bu_called
|
||||
2 1 1
|
||||
|
@ -185,7 +185,7 @@ select 1e10/0e0;
|
||||
1e10/0e0
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
create table wl1612 (col1 int, col2 decimal(38,10), col3 numeric(38,10));
|
||||
insert into wl1612 values(1,12345678901234567890.1234567890,12345678901234567890.1234567890);
|
||||
select * from wl1612;
|
||||
@ -205,27 +205,27 @@ NULL
|
||||
NULL
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
select col2/0 from wl1612;
|
||||
col2/0
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
select col3/0 from wl1612;
|
||||
col3/0
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
insert into wl1612 values(5,5000.0005,5000.0005);
|
||||
insert into wl1612 values(6,5000.0005,5000.0005);
|
||||
select sum(col2),sum(col3) from wl1612;
|
||||
@ -788,12 +788,12 @@ select 1 / 1E-500;
|
||||
1 / 1E-500
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
select 1 / 0;
|
||||
1 / 0
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
set sql_mode='ansi,traditional';
|
||||
CREATE TABLE Sow6_2f (col1 NUMERIC(4,2));
|
||||
INSERT INTO Sow6_2f VALUES (10.55);
|
||||
@ -819,11 +819,11 @@ NULL
|
||||
NULL
|
||||
NULL
|
||||
Warnings:
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Error 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
Warning 1365 Division by 0
|
||||
INSERT INTO Sow6_2f VALUES ('a59b');
|
||||
ERROR HY000: Incorrect decimal value: 'a59b' for column 'col1' at row 1
|
||||
drop table Sow6_2f;
|
||||
@ -838,12 +838,12 @@ select 9999999999999999999999999999999999999999999999999999999999999999999999999
|
||||
x
|
||||
99999999999999999999999999999999999999999999999999999999999999999
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 + 1 as x;
|
||||
x
|
||||
100000000000000000000000000000000000000000000000000000000000000000
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
select 0.190287977636363637 + 0.040372670 * 0 - 0;
|
||||
0.190287977636363637 + 0.040372670 * 0 - 0
|
||||
0.190287977636363637
|
||||
@ -1380,15 +1380,15 @@ create table t1 (c1 decimal(64));
|
||||
insert into t1 values(
|
||||
89000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1264 Out of range value for column 'c1' at row 1
|
||||
insert into t1 values(
|
||||
99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 *
|
||||
99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1264 Out of range value for column 'c1' at row 1
|
||||
insert into t1 values(1e100);
|
||||
Warnings:
|
||||
@ -1432,7 +1432,7 @@ select cast(19999999999999999999 as unsigned);
|
||||
cast(19999999999999999999 as unsigned)
|
||||
18446744073709551615
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
create table t1(a decimal(18));
|
||||
insert into t1 values(123456789012345678);
|
||||
alter table t1 modify column a decimal(19);
|
||||
@ -1444,12 +1444,12 @@ select cast(11.1234 as DECIMAL(3,2));
|
||||
cast(11.1234 as DECIMAL(3,2))
|
||||
9.99
|
||||
Warnings:
|
||||
Error 1264 Out of range value for column 'cast(11.1234 as DECIMAL(3,2))' at row 1
|
||||
Warning 1264 Out of range value for column 'cast(11.1234 as DECIMAL(3,2))' at row 1
|
||||
select * from (select cast(11.1234 as DECIMAL(3,2))) t;
|
||||
cast(11.1234 as DECIMAL(3,2))
|
||||
9.99
|
||||
Warnings:
|
||||
Error 1264 Out of range value for column 'cast(11.1234 as DECIMAL(3,2))' at row 1
|
||||
Warning 1264 Out of range value for column 'cast(11.1234 as DECIMAL(3,2))' at row 1
|
||||
select cast(a as DECIMAL(3,2))
|
||||
from (select 11.1233 as a
|
||||
UNION select 11.1234
|
||||
@ -1460,9 +1460,9 @@ cast(a as DECIMAL(3,2))
|
||||
9.99
|
||||
9.99
|
||||
Warnings:
|
||||
Error 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
|
||||
Error 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
|
||||
Error 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
|
||||
Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
|
||||
Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
|
||||
Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
|
||||
select cast(a as DECIMAL(3,2)), count(*)
|
||||
from (select 11.1233 as a
|
||||
UNION select 11.1234
|
||||
@ -1471,10 +1471,10 @@ UNION select 12.1234
|
||||
cast(a as DECIMAL(3,2)) count(*)
|
||||
9.99 3
|
||||
Warnings:
|
||||
Error 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
|
||||
Error 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
|
||||
Error 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
|
||||
Error 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
|
||||
Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
|
||||
Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
|
||||
Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
|
||||
Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
|
||||
create table t1 (s varchar(100));
|
||||
insert into t1 values (0.00000000010000000000000000364321973154977415791655470655996396089904010295867919921875);
|
||||
drop table t1;
|
||||
@ -1560,7 +1560,7 @@ select cast(143.481 as decimal(2,1));
|
||||
cast(143.481 as decimal(2,1))
|
||||
9.9
|
||||
Warnings:
|
||||
Error 1264 Out of range value for column 'cast(143.481 as decimal(2,1))' at row 1
|
||||
Warning 1264 Out of range value for column 'cast(143.481 as decimal(2,1))' at row 1
|
||||
select cast(-3.4 as decimal(2,1));
|
||||
cast(-3.4 as decimal(2,1))
|
||||
-3.4
|
||||
@ -1568,12 +1568,12 @@ select cast(99.6 as decimal(2,0));
|
||||
cast(99.6 as decimal(2,0))
|
||||
99
|
||||
Warnings:
|
||||
Error 1264 Out of range value for column 'cast(99.6 as decimal(2,0))' at row 1
|
||||
Warning 1264 Out of range value for column 'cast(99.6 as decimal(2,0))' at row 1
|
||||
select cast(-13.4 as decimal(2,1));
|
||||
cast(-13.4 as decimal(2,1))
|
||||
-9.9
|
||||
Warnings:
|
||||
Error 1264 Out of range value for column 'cast(-13.4 as decimal(2,1))' at row 1
|
||||
Warning 1264 Out of range value for column 'cast(-13.4 as decimal(2,1))' at row 1
|
||||
select cast(98.6 as decimal(2,0));
|
||||
cast(98.6 as decimal(2,0))
|
||||
99
|
||||
@ -1674,7 +1674,7 @@ CREATE TABLE t1 SELECT
|
||||
/* 82 */ 1000000000000000000000000000000000000000000000000000000000000000000000000000000001
|
||||
AS c1;
|
||||
Warnings:
|
||||
Error 1292 Truncated incorrect DECIMAL value: ''
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
DESC t1;
|
||||
Field Type Null Key Default Extra
|
||||
c1 decimal(65,0) NO 0
|
||||
@ -1797,7 +1797,7 @@ CREATE TABLE t1 (a DECIMAL(30,30));
|
||||
INSERT INTO t1 VALUES (0.1),(0.2),(0.3);
|
||||
CREATE TABLE t2 SELECT MIN(a + 0.0000000000000000000000000000001) AS c1 FROM t1;
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c1' at row 3
|
||||
Note 1265 Data truncated for column 'c1' at row 4
|
||||
DESC t2;
|
||||
Field Type Null Key Default Extra
|
||||
c1 decimal(32,30) YES NULL
|
||||
|
@ -1111,8 +1111,8 @@ insert into v1 values(3);
|
||||
ERROR HY000: CHECK OPTION failed 'test.v1'
|
||||
insert ignore into v1 values (2),(3),(0);
|
||||
Warnings:
|
||||
Error 1369 CHECK OPTION failed 'test.v1'
|
||||
Error 1369 CHECK OPTION failed 'test.v1'
|
||||
Warning 1369 CHECK OPTION failed 'test.v1'
|
||||
Warning 1369 CHECK OPTION failed 'test.v1'
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
@ -1125,8 +1125,8 @@ create table t2 (a int);
|
||||
insert into t2 values (2),(3),(0);
|
||||
insert ignore into v1 SELECT a from t2;
|
||||
Warnings:
|
||||
Error 1369 CHECK OPTION failed 'test.v1'
|
||||
Error 1369 CHECK OPTION failed 'test.v1'
|
||||
Warning 1369 CHECK OPTION failed 'test.v1'
|
||||
Warning 1369 CHECK OPTION failed 'test.v1'
|
||||
select * from t1 order by a desc;
|
||||
a
|
||||
1
|
||||
@ -1148,7 +1148,7 @@ a
|
||||
update v1 set a=a+1;
|
||||
update ignore v1,t2 set v1.a=v1.a+1 where v1.a=t2.a;
|
||||
Warnings:
|
||||
Error 1369 CHECK OPTION failed 'test.v1'
|
||||
Warning 1369 CHECK OPTION failed 'test.v1'
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
@ -1182,7 +1182,7 @@ insert into v1 values (1) on duplicate key update a=2;
|
||||
ERROR HY000: CHECK OPTION failed 'test.v1'
|
||||
insert ignore into v1 values (1) on duplicate key update a=2;
|
||||
Warnings:
|
||||
Error 1369 CHECK OPTION failed 'test.v1'
|
||||
Warning 1369 CHECK OPTION failed 'test.v1'
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
@ -1283,7 +1283,7 @@ insert ignore into v1 values (6);
|
||||
ERROR HY000: CHECK OPTION failed 'test.v1'
|
||||
insert ignore into v1 values (6),(3);
|
||||
Warnings:
|
||||
Error 1369 CHECK OPTION failed 'test.v1'
|
||||
Warning 1369 CHECK OPTION failed 'test.v1'
|
||||
select * from t1;
|
||||
s1
|
||||
3
|
||||
@ -1328,9 +1328,9 @@ delete from t1;
|
||||
load data infile '../../std_data/loaddata3.dat' ignore into table v1 fields terminated by '' enclosed by '' ignore 1 lines;
|
||||
Warnings:
|
||||
Warning 1366 Incorrect integer value: 'error ' for column 'a' at row 3
|
||||
Error 1369 CHECK OPTION failed 'test.v1'
|
||||
Warning 1369 CHECK OPTION failed 'test.v1'
|
||||
Warning 1366 Incorrect integer value: 'wrong end ' for column 'a' at row 4
|
||||
Error 1369 CHECK OPTION failed 'test.v1'
|
||||
Warning 1369 CHECK OPTION failed 'test.v1'
|
||||
select * from t1 order by a,b;
|
||||
a b
|
||||
1 row 1
|
||||
@ -1354,7 +1354,7 @@ concat('|',a,'|') concat('|',b,'|')
|
||||
delete from t1;
|
||||
load data infile '../../std_data/loaddata2.dat' ignore into table v1 fields terminated by ',' enclosed by '''';
|
||||
Warnings:
|
||||
Error 1369 CHECK OPTION failed 'test.v1'
|
||||
Warning 1369 CHECK OPTION failed 'test.v1'
|
||||
Warning 1261 Row 2 doesn't contain data for all columns
|
||||
select concat('|',a,'|'), concat('|',b,'|') from t1;
|
||||
concat('|',a,'|') concat('|',b,'|')
|
||||
|
@ -34,7 +34,7 @@ purge binary logs TO 'master-bin.000002';
|
||||
ERROR HY000: Fatal error during log purge
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1377 a problem with deleting master-bin.000001; consider examining correspondence of your binlog index file to the actual binlog files
|
||||
Warning 1377 a problem with deleting master-bin.000001; consider examining correspondence of your binlog index file to the actual binlog files
|
||||
Error 1377 Fatal error during log purge
|
||||
reset master;
|
||||
End of tests
|
||||
|
@ -43,12 +43,6 @@ END|
|
||||
CALL proc();
|
||||
Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
---- Insert from stored function ----
|
||||
CREATE FUNCTION func()
|
||||
RETURNS INT
|
||||
@ -67,12 +61,6 @@ func()
|
||||
0
|
||||
Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
---- Insert from trigger ----
|
||||
CREATE TRIGGER trig
|
||||
BEFORE INSERT ON trigger_table
|
||||
@ -90,12 +78,6 @@ INSERT INTO trigger_table VALUES ('bye.');
|
||||
Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
---- Insert from prepared statement ----
|
||||
PREPARE p1 FROM 'INSERT INTO t1 VALUES (@@global.sync_binlog)';
|
||||
PREPARE p2 FROM 'INSERT INTO t1 VALUES (@@session.insert_id)';
|
||||
@ -155,12 +137,6 @@ func5()
|
||||
0
|
||||
Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
==== Variables that should *not* be unsafe ====
|
||||
INSERT INTO t1 VALUES (@@session.pseudo_thread_id);
|
||||
INSERT INTO t1 VALUES (@@session.pseudo_thread_id);
|
||||
@ -215,9 +191,6 @@ END|
|
||||
CALL p1();
|
||||
Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
DROP PROCEDURE p1;
|
||||
DROP TABLE t1;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
|
@ -198,13 +198,11 @@ create table t1 (id int primary key) engine = innodb key_block_size = 0;
|
||||
ERROR HY000: Can't create table 'test.t1' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: invalid KEY_BLOCK_SIZE = 0. Valid values are [1, 2, 4, 8, 16]
|
||||
Error 1005 Can't create table 'test.t1' (errno: 1478)
|
||||
create table t2 (id int primary key) engine = innodb key_block_size = 9;
|
||||
ERROR HY000: Can't create table 'test.t2' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: invalid KEY_BLOCK_SIZE = 9. Valid values are [1, 2, 4, 8, 16]
|
||||
Error 1005 Can't create table 'test.t2' (errno: 1478)
|
||||
create table t3 (id int primary key) engine = innodb key_block_size = 1;
|
||||
create table t4 (id int primary key) engine = innodb key_block_size = 2;
|
||||
@ -235,28 +233,24 @@ key_block_size = 8 row_format = redundant;
|
||||
ERROR HY000: Can't create table 'test.t2' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: cannot specify ROW_FORMAT = REDUNDANT with KEY_BLOCK_SIZE.
|
||||
Error 1005 Can't create table 'test.t2' (errno: 1478)
|
||||
create table t3 (id int primary key) engine = innodb
|
||||
key_block_size = 8 row_format = compact;
|
||||
ERROR HY000: Can't create table 'test.t3' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: cannot specify ROW_FORMAT = COMPACT with KEY_BLOCK_SIZE.
|
||||
Error 1005 Can't create table 'test.t3' (errno: 1478)
|
||||
create table t4 (id int primary key) engine = innodb
|
||||
key_block_size = 8 row_format = dynamic;
|
||||
ERROR HY000: Can't create table 'test.t4' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: cannot specify ROW_FORMAT = DYNAMIC with KEY_BLOCK_SIZE.
|
||||
Error 1005 Can't create table 'test.t4' (errno: 1478)
|
||||
create table t5 (id int primary key) engine = innodb
|
||||
key_block_size = 8 row_format = default;
|
||||
ERROR HY000: Can't create table 'test.t5' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: cannot specify ROW_FORMAT = COMPACT with KEY_BLOCK_SIZE.
|
||||
Error 1005 Can't create table 'test.t5' (errno: 1478)
|
||||
SELECT table_schema, table_name, row_format
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
@ -268,24 +262,18 @@ key_block_size = 9 row_format = redundant;
|
||||
ERROR HY000: Can't create table 'test.t1' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: invalid KEY_BLOCK_SIZE = 9. Valid values are [1, 2, 4, 8, 16]
|
||||
Error 1478 InnoDB: cannot specify ROW_FORMAT = REDUNDANT with KEY_BLOCK_SIZE.
|
||||
Error 1005 Can't create table 'test.t1' (errno: 1478)
|
||||
create table t2 (id int primary key) engine = innodb
|
||||
key_block_size = 9 row_format = compact;
|
||||
ERROR HY000: Can't create table 'test.t2' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: invalid KEY_BLOCK_SIZE = 9. Valid values are [1, 2, 4, 8, 16]
|
||||
Error 1478 InnoDB: cannot specify ROW_FORMAT = COMPACT with KEY_BLOCK_SIZE.
|
||||
Error 1005 Can't create table 'test.t2' (errno: 1478)
|
||||
create table t2 (id int primary key) engine = innodb
|
||||
key_block_size = 9 row_format = dynamic;
|
||||
ERROR HY000: Can't create table 'test.t2' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: invalid KEY_BLOCK_SIZE = 9. Valid values are [1, 2, 4, 8, 16]
|
||||
Error 1478 InnoDB: cannot specify ROW_FORMAT = DYNAMIC with KEY_BLOCK_SIZE.
|
||||
Error 1005 Can't create table 'test.t2' (errno: 1478)
|
||||
SELECT table_schema, table_name, row_format
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
@ -295,43 +283,36 @@ create table t1 (id int primary key) engine = innodb key_block_size = 1;
|
||||
ERROR HY000: Can't create table 'test.t1' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.
|
||||
Error 1005 Can't create table 'test.t1' (errno: 1478)
|
||||
create table t2 (id int primary key) engine = innodb key_block_size = 2;
|
||||
ERROR HY000: Can't create table 'test.t2' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.
|
||||
Error 1005 Can't create table 'test.t2' (errno: 1478)
|
||||
create table t3 (id int primary key) engine = innodb key_block_size = 4;
|
||||
ERROR HY000: Can't create table 'test.t3' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.
|
||||
Error 1005 Can't create table 'test.t3' (errno: 1478)
|
||||
create table t4 (id int primary key) engine = innodb key_block_size = 8;
|
||||
ERROR HY000: Can't create table 'test.t4' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.
|
||||
Error 1005 Can't create table 'test.t4' (errno: 1478)
|
||||
create table t5 (id int primary key) engine = innodb key_block_size = 16;
|
||||
ERROR HY000: Can't create table 'test.t5' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.
|
||||
Error 1005 Can't create table 'test.t5' (errno: 1478)
|
||||
create table t6 (id int primary key) engine = innodb row_format = compressed;
|
||||
ERROR HY000: Can't create table 'test.t6' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table.
|
||||
Error 1005 Can't create table 'test.t6' (errno: 1478)
|
||||
create table t7 (id int primary key) engine = innodb row_format = dynamic;
|
||||
ERROR HY000: Can't create table 'test.t7' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_per_table.
|
||||
Error 1005 Can't create table 'test.t7' (errno: 1478)
|
||||
create table t8 (id int primary key) engine = innodb row_format = compact;
|
||||
create table t9 (id int primary key) engine = innodb row_format = redundant;
|
||||
@ -347,43 +328,36 @@ create table t1 (id int primary key) engine = innodb key_block_size = 1;
|
||||
ERROR HY000: Can't create table 'test.t1' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_format > Antelope.
|
||||
Error 1005 Can't create table 'test.t1' (errno: 1478)
|
||||
create table t2 (id int primary key) engine = innodb key_block_size = 2;
|
||||
ERROR HY000: Can't create table 'test.t2' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_format > Antelope.
|
||||
Error 1005 Can't create table 'test.t2' (errno: 1478)
|
||||
create table t3 (id int primary key) engine = innodb key_block_size = 4;
|
||||
ERROR HY000: Can't create table 'test.t3' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_format > Antelope.
|
||||
Error 1005 Can't create table 'test.t3' (errno: 1478)
|
||||
create table t4 (id int primary key) engine = innodb key_block_size = 8;
|
||||
ERROR HY000: Can't create table 'test.t4' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_format > Antelope.
|
||||
Error 1005 Can't create table 'test.t4' (errno: 1478)
|
||||
create table t5 (id int primary key) engine = innodb key_block_size = 16;
|
||||
ERROR HY000: Can't create table 'test.t5' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_format > Antelope.
|
||||
Error 1005 Can't create table 'test.t5' (errno: 1478)
|
||||
create table t6 (id int primary key) engine = innodb row_format = compressed;
|
||||
ERROR HY000: Can't create table 'test.t6' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelope.
|
||||
Error 1005 Can't create table 'test.t6' (errno: 1478)
|
||||
create table t7 (id int primary key) engine = innodb row_format = dynamic;
|
||||
ERROR HY000: Can't create table 'test.t7' (errno: 1478)
|
||||
show errors;
|
||||
Level Code Message
|
||||
Error 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope.
|
||||
Error 1005 Can't create table 'test.t7' (errno: 1478)
|
||||
create table t8 (id int primary key) engine = innodb row_format = compact;
|
||||
create table t9 (id int primary key) engine = innodb row_format = redundant;
|
||||
|
@ -204,7 +204,7 @@ b int
|
||||
ERROR HY000: Can't create table 'test.t1' (errno: 906)
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1296 Got error 906 'Unsupported attribute type in index' from NDB
|
||||
Warning 1296 Got error 906 'Unsupported attribute type in index' from NDB
|
||||
Error 1005 Can't create table 'test.t1' (errno: 906)
|
||||
create table t1 (
|
||||
pk1 int not null primary key,
|
||||
@ -214,7 +214,7 @@ key(b)
|
||||
ERROR HY000: Can't create table 'test.t1' (errno: 906)
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1296 Got error 906 'Unsupported attribute type in index' from NDB
|
||||
Warning 1296 Got error 906 'Unsupported attribute type in index' from NDB
|
||||
Error 1005 Can't create table 'test.t1' (errno: 906)
|
||||
create table t1 (
|
||||
pk1 int primary key,
|
||||
|
@ -8,20 +8,20 @@ INITIAL_SIZE 16M
|
||||
UNDO_BUFFER_SIZE = 1M
|
||||
ENGINE=MYISAM;
|
||||
Warnings:
|
||||
Error 1478 Table storage engine 'MyISAM' does not support the create option 'TABLESPACE or LOGFILE GROUP'
|
||||
Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TABLESPACE or LOGFILE GROUP'
|
||||
ALTER LOGFILE GROUP lg1
|
||||
ADD UNDOFILE 'undofile02.dat'
|
||||
INITIAL_SIZE = 4M
|
||||
ENGINE=XYZ;
|
||||
Warnings:
|
||||
Warning 1286 Unknown table engine 'XYZ'
|
||||
Error 1478 Table storage engine 'MyISAM' does not support the create option 'TABLESPACE or LOGFILE GROUP'
|
||||
Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TABLESPACE or LOGFILE GROUP'
|
||||
CREATE TABLESPACE ts1
|
||||
ADD DATAFILE 'datafile.dat'
|
||||
USE LOGFILE GROUP lg1
|
||||
INITIAL_SIZE 12M;
|
||||
Warnings:
|
||||
Error 1478 Table storage engine 'MyISAM' does not support the create option 'TABLESPACE or LOGFILE GROUP'
|
||||
Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TABLESPACE or LOGFILE GROUP'
|
||||
set storage_engine=ndb;
|
||||
CREATE LOGFILE GROUP lg1
|
||||
ADD UNDOFILE 'undofile.dat'
|
||||
|
@ -15,7 +15,7 @@ ENGINE NDB;
|
||||
ERROR HY000: Failed to create LOGFILE GROUP
|
||||
SHOW WARNINGS;
|
||||
Level Code Message
|
||||
Error 1296 Got error 1514 'Currently there is a limit of one logfile group' from NDB
|
||||
Warning 1296 Got error 1514 'Currently there is a limit of one logfile group' from NDB
|
||||
Error 1528 Failed to create LOGFILE GROUP
|
||||
CREATE LOGFILE GROUP lg1
|
||||
ADD UNDOFILE 'undofile.dat'
|
||||
|
@ -463,7 +463,7 @@ drop table t1;
|
||||
End of 4.1 tests
|
||||
CREATE TABLE t1 (name VARCHAR(100), square GEOMETRY);
|
||||
Warnings:
|
||||
Error 1478 Table storage engine 'ndbcluster' does not support the create option 'Binlog of table with BLOB attribute and no PK'
|
||||
Warning 1478 Table storage engine 'ndbcluster' does not support the create option 'Binlog of table with BLOB attribute and no PK'
|
||||
INSERT INTO t1 VALUES("center", GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))'));
|
||||
INSERT INTO t1 VALUES("small", GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
|
||||
INSERT INTO t1 VALUES("big", GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
|
||||
@ -1013,7 +1013,7 @@ drop table t1;
|
||||
End of 4.1 tests
|
||||
CREATE TABLE t1 (name VARCHAR(100), square GEOMETRY);
|
||||
Warnings:
|
||||
Error 1478 Table storage engine 'ndbcluster' does not support the create option 'Binlog of table with BLOB attribute and no PK'
|
||||
Warning 1478 Table storage engine 'ndbcluster' does not support the create option 'Binlog of table with BLOB attribute and no PK'
|
||||
INSERT INTO t1 VALUES("center", GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))'));
|
||||
INSERT INTO t1 VALUES("small", GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
|
||||
INSERT INTO t1 VALUES("big", GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
|
||||
|
@ -14,7 +14,7 @@ partition x3 values less than (20) nodegroup 14);
|
||||
ERROR HY000: Can't create table 'test.t1' (errno: 140)
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1296 Got error 771 'Given NODEGROUP doesn't exist in this cluster' from NDB
|
||||
Warning 1296 Got error 771 'Given NODEGROUP doesn't exist in this cluster' from NDB
|
||||
Error 1005 Can't create table 'test.t1' (errno: 140)
|
||||
CREATE TABLE t1 (
|
||||
a int not null,
|
||||
|
@ -8,7 +8,7 @@ ENGINE=NDB;
|
||||
ERROR HY000: Can't create table 'test.t1' (errno: 138)
|
||||
SHOW WARNINGS;
|
||||
Level Code Message
|
||||
Error 1478 Table storage engine 'ndbcluster' does not support the create option 'Row format FIXED incompatible with variable sized attribute'
|
||||
Warning 1478 Table storage engine 'ndbcluster' does not support the create option 'Row format FIXED incompatible with variable sized attribute'
|
||||
Error 1005 Can't create table 'test.t1' (errno: 138)
|
||||
CREATE TABLE t1
|
||||
( a INT KEY,
|
||||
|
@ -9,7 +9,7 @@ ENGINE=NDB;
|
||||
ERROR HY000: Failed to create LOGFILE GROUP
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1296 Got error 299 'Operation not allowed or aborted due to single user mode' from NDB
|
||||
Warning 1296 Got error 299 'Operation not allowed or aborted due to single user mode' from NDB
|
||||
Error 1528 Failed to create LOGFILE GROUP
|
||||
create table t1 (a int key, b int unique, c int) engine ndb;
|
||||
CREATE LOGFILE GROUP lg1
|
||||
@ -25,14 +25,14 @@ ENGINE NDB;
|
||||
ERROR HY000: Failed to create TABLESPACE
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1296 Got error 299 'Operation not allowed or aborted due to single user mode' from NDB
|
||||
Warning 1296 Got error 299 'Operation not allowed or aborted due to single user mode' from NDB
|
||||
Error 1528 Failed to create TABLESPACE
|
||||
DROP LOGFILE GROUP lg1
|
||||
ENGINE =NDB;
|
||||
ERROR HY000: Failed to drop LOGFILE GROUP
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1296 Got error 299 'Operation not allowed or aborted due to single user mode' from NDB
|
||||
Warning 1296 Got error 299 'Operation not allowed or aborted due to single user mode' from NDB
|
||||
Error 1529 Failed to drop LOGFILE GROUP
|
||||
CREATE TABLESPACE ts1
|
||||
ADD DATAFILE 'datafile.dat'
|
||||
@ -45,7 +45,7 @@ ENGINE NDB;
|
||||
ERROR HY000: Failed to alter: DROP DATAFILE
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1296 Got error 299 'Operation not allowed or aborted due to single user mode' from NDB
|
||||
Warning 1296 Got error 299 'Operation not allowed or aborted due to single user mode' from NDB
|
||||
Error 1533 Failed to alter: DROP DATAFILE
|
||||
ALTER TABLESPACE ts1
|
||||
DROP DATAFILE 'datafile.dat'
|
||||
@ -55,7 +55,7 @@ ENGINE NDB;
|
||||
ERROR HY000: Failed to drop TABLESPACE
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1296 Got error 299 'Operation not allowed or aborted due to single user mode' from NDB
|
||||
Warning 1296 Got error 299 'Operation not allowed or aborted due to single user mode' from NDB
|
||||
Error 1529 Failed to drop TABLESPACE
|
||||
DROP TABLESPACE ts1
|
||||
ENGINE NDB;
|
||||
|
@ -8,4 +8,4 @@ create table t1 (a int) engine=myisam;
|
||||
flush tables;
|
||||
drop table if exists t1;
|
||||
Warnings:
|
||||
Error 2 Can't find file: 't1' (errno: 2)
|
||||
Warning 2 Can't find file: 't1' (errno: 2)
|
||||
|
@ -22,8 +22,6 @@ END|
|
||||
< ---- Master selects-- >
|
||||
-------------------------
|
||||
CALL test.p1(12);
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
SELECT * FROM test.t1;
|
||||
num
|
||||
12
|
||||
|
@ -694,3 +694,35 @@ SELECT 1 FROM t1 WHERE t1.a NOT IN
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
#
|
||||
# Bug#36785: Wrong error message when group_concat() exceeds max length
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1 (a VARCHAR(6), b INT);
|
||||
CREATE TABLE t2 (a VARCHAR(6), b INT);
|
||||
|
||||
INSERT INTO t1 VALUES ('111111', 1);
|
||||
INSERT INTO t1 VALUES ('222222', 2);
|
||||
INSERT INTO t1 VALUES ('333333', 3);
|
||||
INSERT INTO t1 VALUES ('444444', 4);
|
||||
INSERT INTO t1 VALUES ('555555', 5);
|
||||
|
||||
SET group_concat_max_len = 5;
|
||||
SET @old_sql_mode = @@sql_mode, @@sql_mode = 'traditional';
|
||||
|
||||
SELECT GROUP_CONCAT(a), b FROM t1 GROUP BY b LIMIT 3;
|
||||
--error ER_CUT_VALUE_GROUP_CONCAT
|
||||
INSERT INTO t2 SELECT GROUP_CONCAT(a), b FROM t1 GROUP BY b;
|
||||
UPDATE t1 SET a = '11111' WHERE b = 1;
|
||||
UPDATE t1 SET a = '22222' WHERE b = 2;
|
||||
--error ER_CUT_VALUE_GROUP_CONCAT
|
||||
INSERT INTO t2 SELECT GROUP_CONCAT(a), b FROM t1 GROUP BY b;
|
||||
|
||||
SET group_concat_max_len = DEFAULT;
|
||||
SET @@sql_mode = @old_sql_mode;
|
||||
DROP TABLE t1, t2;
|
||||
|
2685
mysql-test/t/signal.test
Normal file
2685
mysql-test/t/signal.test
Normal file
File diff suppressed because it is too large
Load Diff
57
mysql-test/t/signal_code.test
Normal file
57
mysql-test/t/signal_code.test
Normal file
@ -0,0 +1,57 @@
|
||||
# Copyright (C) 2008 Sun Microsystems, Inc
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; version 2 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
# Tests for SIGNAL and RESIGNAL
|
||||
|
||||
-- source include/have_debug.inc
|
||||
|
||||
use test;
|
||||
|
||||
--disable_warnings
|
||||
drop procedure if exists signal_proc;
|
||||
drop function if exists signal_func;
|
||||
--enable_warnings
|
||||
|
||||
delimiter $$;
|
||||
|
||||
create procedure signal_proc()
|
||||
begin
|
||||
DECLARE foo CONDITION FOR SQLSTATE '12345';
|
||||
|
||||
SIGNAL foo;
|
||||
SIGNAL foo SET MESSAGE_TEXT = "This is an error message";
|
||||
RESIGNAL foo;
|
||||
RESIGNAL foo SET MESSAGE_TEXT = "This is an error message";
|
||||
end $$
|
||||
|
||||
create function signal_func() returns int
|
||||
begin
|
||||
DECLARE foo CONDITION FOR SQLSTATE '12345';
|
||||
|
||||
SIGNAL foo;
|
||||
SIGNAL foo SET MESSAGE_TEXT = "This is an error message";
|
||||
RESIGNAL foo;
|
||||
RESIGNAL foo SET MESSAGE_TEXT = "This is an error message";
|
||||
return 0;
|
||||
end $$
|
||||
|
||||
delimiter ;$$
|
||||
|
||||
show procedure code signal_proc;
|
||||
drop procedure signal_proc;
|
||||
|
||||
show function code signal_func;
|
||||
drop function signal_func;
|
||||
|
345
mysql-test/t/signal_demo1.test
Normal file
345
mysql-test/t/signal_demo1.test
Normal file
@ -0,0 +1,345 @@
|
||||
# Copyright (C) 2008 Sun Microsystems, Inc
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; version 2 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
#
|
||||
# Demonstrate how SIGNAL can be used to enforce integrity constraints.
|
||||
#
|
||||
|
||||
# Naming:
|
||||
# - PO: Purchase Order
|
||||
# - AB: Address Book
|
||||
# - IN: Inventory
|
||||
|
||||
# Simplified schema:
|
||||
#
|
||||
# Relation 1:
|
||||
# PO_ORDER (PK: po_id) 1:1 <---> 0:N (FK: po_id) PO_ORDER_LINE
|
||||
#
|
||||
# Relation 2:
|
||||
# IN_INVENTORY (PK: item_id) 1:1 <---> 0:N (FK: item_id) PO_ORDER_LINE
|
||||
#
|
||||
# Relation 3:
|
||||
# +--> 0:1 (PK: person_id) AB_PHYSICAL_PERSON
|
||||
# PO_ORDER (FK: cust_id) 1:1 <--|
|
||||
# +--> 0:1 (PK: company_id) AB_MORAL_PERSON
|
||||
# This is an 'arc' relationship :)
|
||||
#
|
||||
|
||||
|
||||
--disable_warnings
|
||||
drop database if exists demo;
|
||||
--enable_warnings
|
||||
|
||||
create database demo;
|
||||
|
||||
use demo;
|
||||
|
||||
create table ab_physical_person (
|
||||
person_id integer,
|
||||
first_name VARCHAR(50),
|
||||
middle_initial CHAR,
|
||||
last_name VARCHAR(50),
|
||||
primary key (person_id));
|
||||
|
||||
create table ab_moral_person (
|
||||
company_id integer,
|
||||
name VARCHAR(100),
|
||||
primary key (company_id));
|
||||
|
||||
create table in_inventory (
|
||||
item_id integer,
|
||||
descr VARCHAR(50),
|
||||
stock integer,
|
||||
primary key (item_id));
|
||||
|
||||
create table po_order (
|
||||
po_id integer auto_increment,
|
||||
cust_type char, /* arc relationship, see cust_id */
|
||||
cust_id integer, /* FK to ab_physical_person *OR* ab_moral_person */
|
||||
primary key (po_id));
|
||||
|
||||
create table po_order_line (
|
||||
po_id integer, /* FK to po_order.po_id */
|
||||
line_no integer,
|
||||
item_id integer, /* FK to in_inventory.item_id */
|
||||
qty integer);
|
||||
|
||||
delimiter $$;
|
||||
|
||||
--echo #
|
||||
--echo # Schema integrity enforcement
|
||||
--echo #
|
||||
|
||||
create procedure check_pk_person(in person_type char, in id integer)
|
||||
begin
|
||||
declare x integer;
|
||||
declare msg varchar(128);
|
||||
|
||||
/*
|
||||
Test integrity constraints for an 'arc' relationship.
|
||||
Based on 'person_type', 'id' points to either a
|
||||
physical person, or a moral person.
|
||||
*/
|
||||
case person_type
|
||||
when 'P' then
|
||||
begin
|
||||
select count(person_id) from ab_physical_person
|
||||
where ab_physical_person.person_id = id
|
||||
into x;
|
||||
|
||||
if (x != 1)
|
||||
then
|
||||
set msg= concat('No such physical person, PK:', id);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 10000;
|
||||
end if;
|
||||
end;
|
||||
|
||||
when 'M' then
|
||||
begin
|
||||
select count(company_id) from ab_moral_person
|
||||
where ab_moral_person.company_id = id
|
||||
into x;
|
||||
|
||||
if (x != 1)
|
||||
then
|
||||
set msg= concat('No such moral person, PK:', id);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 10000;
|
||||
end if;
|
||||
end;
|
||||
|
||||
else
|
||||
begin
|
||||
set msg= concat('No such person type:', person_type);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 20000;
|
||||
end;
|
||||
end case;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure check_pk_inventory(in id integer)
|
||||
begin
|
||||
declare x integer;
|
||||
declare msg varchar(128);
|
||||
|
||||
select count(item_id) from in_inventory
|
||||
where in_inventory.item_id = id
|
||||
into x;
|
||||
|
||||
if (x != 1)
|
||||
then
|
||||
set msg= concat('Failed integrity constraint, table in_inventory, PK:',
|
||||
id);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 10000;
|
||||
end if;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure check_pk_order(in id integer)
|
||||
begin
|
||||
declare x integer;
|
||||
declare msg varchar(128);
|
||||
|
||||
select count(po_id) from po_order
|
||||
where po_order.po_id = id
|
||||
into x;
|
||||
|
||||
if (x != 1)
|
||||
then
|
||||
set msg= concat('Failed integrity constraint, table po_order, PK:', id);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 10000;
|
||||
end if;
|
||||
end
|
||||
$$
|
||||
|
||||
create trigger po_order_bi before insert on po_order
|
||||
for each row
|
||||
begin
|
||||
call check_pk_person(NEW.cust_type, NEW.cust_id);
|
||||
end
|
||||
$$
|
||||
|
||||
create trigger po_order_bu before update on po_order
|
||||
for each row
|
||||
begin
|
||||
call check_pk_person(NEW.cust_type, NEW.cust_id);
|
||||
end
|
||||
$$
|
||||
|
||||
create trigger po_order_line_bi before insert on po_order_line
|
||||
for each row
|
||||
begin
|
||||
call check_pk_order(NEW.po_id);
|
||||
call check_pk_inventory(NEW.item_id);
|
||||
end
|
||||
$$
|
||||
|
||||
create trigger po_order_line_bu before update on po_order_line
|
||||
for each row
|
||||
begin
|
||||
call check_pk_order(NEW.po_id);
|
||||
call check_pk_inventory(NEW.item_id);
|
||||
end
|
||||
$$
|
||||
|
||||
--echo #
|
||||
--echo # Application helpers
|
||||
--echo #
|
||||
|
||||
create procedure po_create_order(
|
||||
in p_cust_type char,
|
||||
in p_cust_id integer,
|
||||
out id integer)
|
||||
begin
|
||||
insert into po_order set cust_type = p_cust_type, cust_id = p_cust_id;
|
||||
set id = last_insert_id();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure po_add_order_line(
|
||||
in po integer,
|
||||
in line integer,
|
||||
in item integer,
|
||||
in q integer)
|
||||
begin
|
||||
insert into po_order_line set
|
||||
po_id = po, line_no = line, item_id = item, qty = q;
|
||||
end
|
||||
$$
|
||||
|
||||
delimiter ;$$
|
||||
|
||||
--echo #
|
||||
--echo # Create sample data
|
||||
--echo #
|
||||
|
||||
insert into ab_physical_person values
|
||||
( 1, "John", "A", "Doe"),
|
||||
( 2, "Marry", "B", "Smith")
|
||||
;
|
||||
|
||||
insert into ab_moral_person values
|
||||
( 3, "ACME real estate, INC"),
|
||||
( 4, "Local school")
|
||||
;
|
||||
|
||||
insert into in_inventory values
|
||||
( 100, "Table, dinner", 5),
|
||||
( 101, "Chair", 20),
|
||||
( 200, "Table, coffee", 3),
|
||||
( 300, "School table", 25),
|
||||
( 301, "School chairs", 50)
|
||||
;
|
||||
|
||||
select * from ab_physical_person order by person_id;
|
||||
select * from ab_moral_person order by company_id;
|
||||
select * from in_inventory order by item_id;
|
||||
|
||||
--echo #
|
||||
--echo # Entering an order
|
||||
--echo #
|
||||
|
||||
set @my_po = 0;
|
||||
|
||||
/* John Doe wants 1 table and 4 chairs */
|
||||
call po_create_order("P", 1, @my_po);
|
||||
|
||||
call po_add_order_line (@my_po, 1, 100, 1);
|
||||
call po_add_order_line (@my_po, 2, 101, 4);
|
||||
|
||||
/* Marry Smith wants a coffee table */
|
||||
call po_create_order("P", 2, @my_po);
|
||||
|
||||
call po_add_order_line (@my_po, 1, 200, 1);
|
||||
|
||||
--echo #
|
||||
--echo # Entering bad data in an order
|
||||
--echo #
|
||||
|
||||
# There is no item 999 in in_inventory
|
||||
--error 10000
|
||||
call po_add_order_line (@my_po, 1, 999, 1);
|
||||
|
||||
--echo #
|
||||
--echo # Entering bad data in an unknown order
|
||||
--echo #
|
||||
|
||||
# There is no order 99 in po_order
|
||||
--error 10000
|
||||
call po_add_order_line (99, 1, 100, 1);
|
||||
|
||||
--echo #
|
||||
--echo # Entering an order for an unknown company
|
||||
--echo #
|
||||
|
||||
# There is no moral person of id 7
|
||||
--error 10000
|
||||
call po_create_order("M", 7, @my_po);
|
||||
|
||||
--echo #
|
||||
--echo # Entering an order for an unknown person type
|
||||
--echo #
|
||||
|
||||
# There is no person of type X
|
||||
--error 20000
|
||||
call po_create_order("X", 1, @my_po);
|
||||
|
||||
/* The local school wants 10 class tables and 20 chairs */
|
||||
call po_create_order("M", 4, @my_po);
|
||||
|
||||
call po_add_order_line (@my_po, 1, 300, 10);
|
||||
call po_add_order_line (@my_po, 2, 301, 20);
|
||||
|
||||
# Raw data
|
||||
select * from po_order;
|
||||
select * from po_order_line;
|
||||
|
||||
# Creative reporting ...
|
||||
|
||||
select po_id as "PO#",
|
||||
( case cust_type
|
||||
when "P" then concat (pp.first_name,
|
||||
" ",
|
||||
pp.middle_initial,
|
||||
" ",
|
||||
pp.last_name)
|
||||
when "M" then mp.name
|
||||
end ) as "Sold to"
|
||||
from po_order po
|
||||
left join ab_physical_person pp on po.cust_id = pp.person_id
|
||||
left join ab_moral_person mp on po.cust_id = company_id
|
||||
;
|
||||
|
||||
select po_id as "PO#",
|
||||
ol.line_no as "Line",
|
||||
ol.item_id as "Item",
|
||||
inv.descr as "Description",
|
||||
ol.qty as "Quantity"
|
||||
from po_order_line ol, in_inventory inv
|
||||
where inv.item_id = ol.item_id
|
||||
order by ol.item_id, ol.line_no;
|
||||
|
||||
drop database demo;
|
||||
|
||||
|
207
mysql-test/t/signal_demo2.test
Normal file
207
mysql-test/t/signal_demo2.test
Normal file
@ -0,0 +1,207 @@
|
||||
# Copyright (C) 2008 Sun Microsystems, Inc
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; version 2 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
#
|
||||
# Demonstrate how RESIGNAL can be used to 'catch' and 're-throw' an error
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
drop database if exists demo;
|
||||
--enable_warnings
|
||||
|
||||
create database demo;
|
||||
|
||||
use demo;
|
||||
|
||||
delimiter $$;
|
||||
|
||||
create procedure proc_top_a(p1 integer)
|
||||
begin
|
||||
## DECLARE CONTINUE HANDLER for SQLEXCEPTION, NOT FOUND
|
||||
begin
|
||||
end;
|
||||
|
||||
select "Starting ...";
|
||||
call proc_middle_a(p1);
|
||||
select "The end";
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_middle_a(p1 integer)
|
||||
begin
|
||||
DECLARE l integer;
|
||||
# without RESIGNAL:
|
||||
# Should be: DECLARE EXIT HANDLER for SQLEXCEPTION, NOT FOUND
|
||||
DECLARE EXIT HANDLER for 1 /* not sure how to handle exceptions */
|
||||
begin
|
||||
select "Oops ... now what ?";
|
||||
end;
|
||||
|
||||
select "In prod_middle()";
|
||||
|
||||
create temporary table t1(a integer, b integer);
|
||||
select GET_LOCK("user_mutex", 10) into l;
|
||||
|
||||
insert into t1 set a = p1, b = p1;
|
||||
|
||||
call proc_bottom_a(p1);
|
||||
|
||||
select RELEASE_LOCK("user_mutex") into l;
|
||||
drop temporary table t1;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_bottom_a(p1 integer)
|
||||
begin
|
||||
select "In proc_bottom()";
|
||||
|
||||
if (p1 = 1) then
|
||||
begin
|
||||
select "Doing something that works ...";
|
||||
select * from t1;
|
||||
end;
|
||||
end if;
|
||||
|
||||
if (p1 = 2) then
|
||||
begin
|
||||
select "Doing something that fail (simulate an error) ...";
|
||||
drop table no_such_table;
|
||||
end;
|
||||
end if;
|
||||
|
||||
if (p1 = 3) then
|
||||
begin
|
||||
select "Doing something that *SHOULD* works ...";
|
||||
select * from t1;
|
||||
end;
|
||||
end if;
|
||||
|
||||
end
|
||||
$$
|
||||
|
||||
delimiter ;$$
|
||||
|
||||
#
|
||||
# Code without RESIGNAL:
|
||||
# errors are apparent to the caller,
|
||||
# but there is no cleanup code,
|
||||
# so that the environment (get_lock(), temporary table) is polluted ...
|
||||
#
|
||||
call proc_top_a(1);
|
||||
|
||||
# Expected
|
||||
--error ER_BAD_TABLE_ERROR
|
||||
call proc_top_a(2);
|
||||
|
||||
# Dirty state
|
||||
--error ER_TABLE_EXISTS_ERROR
|
||||
call proc_top_a(3);
|
||||
|
||||
# Dirty state
|
||||
--error ER_TABLE_EXISTS_ERROR
|
||||
call proc_top_a(1);
|
||||
|
||||
drop temporary table if exists t1;
|
||||
|
||||
delimiter $$;
|
||||
|
||||
create procedure proc_top_b(p1 integer)
|
||||
begin
|
||||
select "Starting ...";
|
||||
call proc_middle_b(p1);
|
||||
select "The end";
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_middle_b(p1 integer)
|
||||
begin
|
||||
DECLARE l integer;
|
||||
DECLARE EXIT HANDLER for SQLEXCEPTION, NOT FOUND
|
||||
begin
|
||||
begin
|
||||
DECLARE CONTINUE HANDLER for SQLEXCEPTION, NOT FOUND
|
||||
begin
|
||||
/* Ignore errors from the cleanup code */
|
||||
end;
|
||||
|
||||
select "Doing cleanup !";
|
||||
select RELEASE_LOCK("user_mutex") into l;
|
||||
drop temporary table t1;
|
||||
end;
|
||||
|
||||
RESIGNAL;
|
||||
end;
|
||||
|
||||
select "In prod_middle()";
|
||||
|
||||
create temporary table t1(a integer, b integer);
|
||||
select GET_LOCK("user_mutex", 10) into l;
|
||||
|
||||
insert into t1 set a = p1, b = p1;
|
||||
|
||||
call proc_bottom_b(p1);
|
||||
|
||||
select RELEASE_LOCK("user_mutex") into l;
|
||||
drop temporary table t1;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_bottom_b(p1 integer)
|
||||
begin
|
||||
select "In proc_bottom()";
|
||||
|
||||
if (p1 = 1) then
|
||||
begin
|
||||
select "Doing something that works ...";
|
||||
select * from t1;
|
||||
end;
|
||||
end if;
|
||||
|
||||
if (p1 = 2) then
|
||||
begin
|
||||
select "Doing something that fail (simulate an error) ...";
|
||||
drop table no_such_table;
|
||||
end;
|
||||
end if;
|
||||
|
||||
if (p1 = 3) then
|
||||
begin
|
||||
select "Doing something that *SHOULD* works ...";
|
||||
select * from t1;
|
||||
end;
|
||||
end if;
|
||||
|
||||
end
|
||||
$$
|
||||
|
||||
delimiter ;$$
|
||||
|
||||
#
|
||||
# Code with RESIGNAL:
|
||||
# errors are apparent to the caller,
|
||||
# the but cleanup code did get a chance to act ...
|
||||
#
|
||||
|
||||
call proc_top_b(1);
|
||||
|
||||
--error ER_BAD_TABLE_ERROR
|
||||
call proc_top_b(2);
|
||||
|
||||
call proc_top_b(3);
|
||||
|
||||
call proc_top_b(1);
|
||||
|
||||
drop database demo;
|
||||
|
159
mysql-test/t/signal_demo3.test
Normal file
159
mysql-test/t/signal_demo3.test
Normal file
@ -0,0 +1,159 @@
|
||||
# Copyright (C) 2008 Sun Microsystems, Inc
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; version 2 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
#
|
||||
# Demonstrate how RESIGNAL can be used to print a stack trace
|
||||
#
|
||||
|
||||
# Save defaults
|
||||
|
||||
SET @start_global_value = @@global.max_error_count;
|
||||
SELECT @start_global_value;
|
||||
SET @start_session_value = @@session.max_error_count;
|
||||
SELECT @start_session_value;
|
||||
|
||||
--disable_warnings
|
||||
drop database if exists demo;
|
||||
--enable_warnings
|
||||
|
||||
create database demo;
|
||||
|
||||
use demo;
|
||||
|
||||
delimiter $$;
|
||||
|
||||
create procedure proc_1()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_1';
|
||||
|
||||
call proc_2();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_2()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_2';
|
||||
|
||||
call proc_3();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_3()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_3';
|
||||
|
||||
call proc_4();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_4()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_4';
|
||||
|
||||
call proc_5();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_5()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_5';
|
||||
|
||||
call proc_6();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_6()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_6';
|
||||
|
||||
call proc_7();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_7()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_7';
|
||||
|
||||
call proc_8();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_8()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_8';
|
||||
|
||||
call proc_9();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_9()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_9';
|
||||
|
||||
## Do something that fails, to see how errors are reported
|
||||
drop table oops_it_is_not_here;
|
||||
end
|
||||
$$
|
||||
|
||||
delimiter ;$$
|
||||
|
||||
-- error ER_SIGNAL_EXCEPTION
|
||||
call proc_1();
|
||||
|
||||
# This is the interesting part:
|
||||
# the complete call stack from the origin of failure (proc_9)
|
||||
# to the top level caller (proc_1) is available ...
|
||||
|
||||
show warnings;
|
||||
|
||||
SET @@session.max_error_count = 5;
|
||||
SELECT @@session.max_error_count;
|
||||
|
||||
-- error ER_SIGNAL_EXCEPTION
|
||||
call proc_1();
|
||||
show warnings;
|
||||
|
||||
SET @@session.max_error_count = 7;
|
||||
SELECT @@session.max_error_count;
|
||||
|
||||
-- error ER_SIGNAL_EXCEPTION
|
||||
call proc_1();
|
||||
show warnings;
|
||||
|
||||
SET @@session.max_error_count = 9;
|
||||
SELECT @@session.max_error_count;
|
||||
|
||||
-- error ER_SIGNAL_EXCEPTION
|
||||
call proc_1();
|
||||
show warnings;
|
||||
|
||||
drop database demo;
|
||||
|
||||
# Restore defaults
|
||||
|
||||
SET @@global.max_error_count = @start_global_value;
|
||||
SELECT @@global.max_error_count;
|
||||
SET @@session.max_error_count = @start_session_value;
|
||||
SELECT @@session.max_error_count;
|
||||
|
123
mysql-test/t/signal_sqlmode.test
Normal file
123
mysql-test/t/signal_sqlmode.test
Normal file
@ -0,0 +1,123 @@
|
||||
# Copyright (C) 2008 Sun Microsystems, Inc
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; version 2 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
# Tests for SIGNAL, RESIGNAL and GET DIAGNOSTICS
|
||||
|
||||
SET @save_sql_mode=@@sql_mode;
|
||||
|
||||
SET sql_mode='';
|
||||
|
||||
--disable_warnings
|
||||
drop procedure if exists p;
|
||||
drop procedure if exists p2;
|
||||
drop procedure if exists p3;
|
||||
--enable_warnings
|
||||
|
||||
delimiter $$;
|
||||
|
||||
create procedure p()
|
||||
begin
|
||||
declare utf8_var VARCHAR(128) CHARACTER SET UTF8;
|
||||
set utf8_var = concat(repeat('A', 128), 'X');
|
||||
select length(utf8_var), utf8_var;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure p2()
|
||||
begin
|
||||
declare msg VARCHAR(129) CHARACTER SET UTF8;
|
||||
set msg = concat(repeat('A', 128), 'X');
|
||||
select length(msg), msg;
|
||||
|
||||
signal sqlstate '55555' set message_text = msg;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure p3()
|
||||
begin
|
||||
declare name VARCHAR(65) CHARACTER SET UTF8;
|
||||
set name = concat(repeat('A', 64), 'X');
|
||||
select length(name), name;
|
||||
|
||||
signal sqlstate '55555' set
|
||||
message_text = 'Message',
|
||||
table_name = name;
|
||||
end
|
||||
$$
|
||||
delimiter ;$$
|
||||
|
||||
call p;
|
||||
|
||||
--error ER_SIGNAL_EXCEPTION
|
||||
call p2;
|
||||
|
||||
--error ER_SIGNAL_EXCEPTION
|
||||
call p3;
|
||||
|
||||
drop procedure p;
|
||||
drop procedure p2;
|
||||
drop procedure p3;
|
||||
|
||||
SET sql_mode='STRICT_ALL_TABLES';
|
||||
|
||||
delimiter $$;
|
||||
|
||||
create procedure p()
|
||||
begin
|
||||
declare utf8_var VARCHAR(128) CHARACTER SET UTF8;
|
||||
set utf8_var = concat(repeat('A', 128), 'X');
|
||||
select length(utf8_var), utf8_var;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure p2()
|
||||
begin
|
||||
declare msg VARCHAR(129) CHARACTER SET UTF8;
|
||||
set msg = concat(repeat('A', 128), 'X');
|
||||
select length(msg), msg;
|
||||
|
||||
signal sqlstate '55555' set message_text = msg;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure p3()
|
||||
begin
|
||||
declare name VARCHAR(65) CHARACTER SET UTF8;
|
||||
set name = concat(repeat('A', 64), 'X');
|
||||
select length(name), name;
|
||||
|
||||
signal sqlstate '55555' set
|
||||
message_text = 'Message',
|
||||
table_name = name;
|
||||
end
|
||||
$$
|
||||
|
||||
delimiter ;$$
|
||||
|
||||
--error ER_DATA_TOO_LONG
|
||||
call p;
|
||||
|
||||
--error ER_COND_ITEM_TOO_LONG
|
||||
call p2;
|
||||
|
||||
--error ER_COND_ITEM_TOO_LONG
|
||||
call p3;
|
||||
|
||||
drop procedure p;
|
||||
drop procedure p2;
|
||||
drop procedure p3;
|
||||
|
||||
SET @@sql_mode=@save_sql_mode;
|
||||
|
@ -22,7 +22,6 @@
|
||||
/* Max length of a error message. Should be kept in sync with MYSQL_ERRMSG_SIZE. */
|
||||
#define ERRMSGSIZE (512)
|
||||
|
||||
|
||||
/* Define some external variables for error handling */
|
||||
|
||||
/*
|
||||
@ -67,12 +66,9 @@ static struct my_err_head *my_errmsgs_list= &my_errmsgs_globerrs;
|
||||
MyFlags Flags
|
||||
... variable list
|
||||
|
||||
RETURN
|
||||
What (*error_handler_hook)() returns:
|
||||
0 OK
|
||||
*/
|
||||
|
||||
int my_error(int nr, myf MyFlags, ...)
|
||||
void my_error(int nr, myf MyFlags, ...)
|
||||
{
|
||||
const char *format;
|
||||
struct my_err_head *meh_p;
|
||||
@ -96,7 +92,8 @@ int my_error(int nr, myf MyFlags, ...)
|
||||
(void) my_vsnprintf (ebuff, sizeof(ebuff), format, args);
|
||||
va_end(args);
|
||||
}
|
||||
DBUG_RETURN((*error_handler_hook)(nr, ebuff, MyFlags));
|
||||
(*error_handler_hook)(nr, ebuff, MyFlags);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
@ -111,7 +108,7 @@ int my_error(int nr, myf MyFlags, ...)
|
||||
... variable list
|
||||
*/
|
||||
|
||||
int my_printf_error(uint error, const char *format, myf MyFlags, ...)
|
||||
void my_printf_error(uint error, const char *format, myf MyFlags, ...)
|
||||
{
|
||||
va_list args;
|
||||
char ebuff[ERRMSGSIZE];
|
||||
@ -122,7 +119,8 @@ int my_printf_error(uint error, const char *format, myf MyFlags, ...)
|
||||
va_start(args,MyFlags);
|
||||
(void) my_vsnprintf (ebuff, sizeof(ebuff), format, args);
|
||||
va_end(args);
|
||||
DBUG_RETURN((*error_handler_hook)(error, ebuff, MyFlags));
|
||||
(*error_handler_hook)(error, ebuff, MyFlags);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -135,9 +133,9 @@ int my_printf_error(uint error, const char *format, myf MyFlags, ...)
|
||||
MyFlags Flags
|
||||
*/
|
||||
|
||||
int my_message(uint error, const char *str, register myf MyFlags)
|
||||
void my_message(uint error, const char *str, register myf MyFlags)
|
||||
{
|
||||
return (*error_handler_hook)(error, str, MyFlags);
|
||||
(*error_handler_hook)(error, str, MyFlags);
|
||||
}
|
||||
|
||||
|
||||
|
@ -15,8 +15,8 @@
|
||||
|
||||
#include "mysys_priv.h"
|
||||
|
||||
int my_message_no_curses(uint error __attribute__((unused)),
|
||||
const char *str, myf MyFlags)
|
||||
void my_message_no_curses(uint error __attribute__((unused)),
|
||||
const char *str, myf MyFlags)
|
||||
{
|
||||
DBUG_ENTER("my_message_no_curses");
|
||||
DBUG_PRINT("enter",("message: %s",str));
|
||||
@ -34,5 +34,5 @@ int my_message_no_curses(uint error __attribute__((unused)),
|
||||
(void)fputs(str,stderr);
|
||||
(void)fputc('\n',stderr);
|
||||
(void)fflush(stderr);
|
||||
DBUG_RETURN(0);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2000 MySQL AB
|
||||
/* Copyright (C) 2000-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -87,9 +87,9 @@ ulong my_time_to_wait_for_lock=2; /* In seconds */
|
||||
char * NEAR globerrs[GLOBERRS]; /* my_error_messages is here */
|
||||
#endif
|
||||
void (*my_abort_hook)(int) = (void(*)(int)) exit;
|
||||
int (*error_handler_hook)(uint error,const char *str,myf MyFlags)=
|
||||
void (*error_handler_hook)(uint error,const char *str,myf MyFlags)=
|
||||
my_message_no_curses;
|
||||
int (*fatal_error_handler_hook)(uint error,const char *str,myf MyFlags)=
|
||||
void (*fatal_error_handler_hook)(uint error,const char *str,myf MyFlags)=
|
||||
my_message_no_curses;
|
||||
|
||||
#ifdef __WIN__
|
||||
|
@ -75,6 +75,7 @@ SET (SQL_SOURCE
|
||||
rpl_rli.cc rpl_mi.cc sql_servers.cc
|
||||
sql_connect.cc scheduler.cc
|
||||
sql_profile.cc event_parse_data.cc
|
||||
sql_signal.cc
|
||||
${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc
|
||||
${PROJECT_SOURCE_DIR}/sql/sql_yacc.h
|
||||
${PROJECT_SOURCE_DIR}/include/mysqld_error.h
|
||||
|
@ -110,7 +110,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
|
||||
sql_plugin.h authors.h event_parse_data.h \
|
||||
event_data_objects.h event_scheduler.h \
|
||||
sql_partition.h partition_info.h partition_element.h \
|
||||
contributors.h sql_servers.h
|
||||
contributors.h sql_servers.h sql_signal.h
|
||||
|
||||
mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \
|
||||
item.cc item_sum.cc item_buff.cc item_func.cc \
|
||||
@ -154,7 +154,7 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \
|
||||
event_queue.cc event_db_repository.cc events.cc \
|
||||
sql_plugin.cc sql_binlog.cc \
|
||||
sql_builtin.cc sql_tablespace.cc partition_info.cc \
|
||||
sql_servers.cc event_parse_data.cc
|
||||
sql_servers.cc event_parse_data.cc sql_signal.cc
|
||||
|
||||
nodist_mysqld_SOURCES = mini_client_errors.c pack.c client.c my_time.c my_user.c
|
||||
|
||||
|
@ -36,6 +36,7 @@ struct show_table_authors_st {
|
||||
struct show_table_authors_st show_table_authors[]= {
|
||||
{ "Brian (Krow) Aker", "Seattle, WA, USA",
|
||||
"Architecture, archive, federated, bunch of little stuff :)" },
|
||||
{ "Marc Alff", "Denver, CO, USA", "Signal, Resignal" },
|
||||
{ "Venu Anuganti", "", "Client/server protocol (4.1)" },
|
||||
{ "David Axmark", "Uppsala, Sweden",
|
||||
"Small stuff long time ago, Monty ripped it out!" },
|
||||
|
@ -74,7 +74,7 @@ Event_worker_thread::print_warnings(THD *thd, Event_job_data *et)
|
||||
{
|
||||
MYSQL_ERROR *err;
|
||||
DBUG_ENTER("evex_print_warnings");
|
||||
if (!thd->warn_list.elements)
|
||||
if (thd->warning_info->is_empty())
|
||||
DBUG_VOID_RETURN;
|
||||
|
||||
char msg_buf[10 * STRING_BUFFER_USUAL_SIZE];
|
||||
@ -90,17 +90,18 @@ Event_worker_thread::print_warnings(THD *thd, Event_job_data *et)
|
||||
prefix.append(et->name.str, et->name.length, system_charset_info);
|
||||
prefix.append("] ", 2);
|
||||
|
||||
List_iterator_fast<MYSQL_ERROR> it(thd->warn_list);
|
||||
List_iterator_fast<MYSQL_ERROR> it(thd->warning_info->warn_list());
|
||||
while ((err= it++))
|
||||
{
|
||||
String err_msg(msg_buf, sizeof(msg_buf), system_charset_info);
|
||||
/* set it to 0 or we start adding at the end. That's the trick ;) */
|
||||
err_msg.length(0);
|
||||
err_msg.append(prefix);
|
||||
err_msg.append(err->msg, strlen(err->msg), system_charset_info);
|
||||
DBUG_ASSERT(err->level < 3);
|
||||
(sql_print_message_handlers[err->level])("%*s", err_msg.length(),
|
||||
err_msg.c_ptr());
|
||||
err_msg.append(err->get_message_text(),
|
||||
err->get_message_octet_length(), system_charset_info);
|
||||
DBUG_ASSERT(err->get_level() < 3);
|
||||
(sql_print_message_handlers[err->get_level()])("%*s", err_msg.length(),
|
||||
err_msg.c_ptr());
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
29
sql/field.cc
29
sql/field.cc
@ -1116,7 +1116,7 @@ int Field_num::check_int(CHARSET_INFO *cs, const char *str, int length,
|
||||
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
|
||||
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
|
||||
"integer", tmp.c_ptr(), field_name,
|
||||
(ulong) table->in_use->row_count);
|
||||
(ulong) table->in_use->warning_info->current_row_for_warning());
|
||||
return 1;
|
||||
}
|
||||
/* Test if we have garbage at the end of the given string. */
|
||||
@ -2683,11 +2683,11 @@ int Field_new_decimal::store(const char *from, uint length,
|
||||
String from_as_str;
|
||||
from_as_str.copy(from, length, &my_charset_bin);
|
||||
|
||||
push_warning_printf(table->in_use, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(table->in_use, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
|
||||
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
|
||||
"decimal", from_as_str.c_ptr(), field_name,
|
||||
(ulong) table->in_use->row_count);
|
||||
(ulong) table->in_use->warning_info->current_row_for_warning());
|
||||
|
||||
DBUG_RETURN(err);
|
||||
}
|
||||
@ -2710,7 +2710,7 @@ int Field_new_decimal::store(const char *from, uint length,
|
||||
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
|
||||
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
|
||||
"decimal", from_as_str.c_ptr(), field_name,
|
||||
(ulong) table->in_use->row_count);
|
||||
(ulong) table->in_use->warning_info->current_row_for_warning());
|
||||
my_decimal_set_zero(&decimal_value);
|
||||
|
||||
break;
|
||||
@ -5363,7 +5363,7 @@ bool Field_time::get_date(MYSQL_TIME *ltime, uint fuzzydate)
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_WARN_DATA_OUT_OF_RANGE,
|
||||
ER(ER_WARN_DATA_OUT_OF_RANGE), field_name,
|
||||
thd->row_count);
|
||||
thd->warning_info->current_row_for_warning());
|
||||
return 1;
|
||||
}
|
||||
tmp=(long) sint3korr(ptr);
|
||||
@ -6357,21 +6357,20 @@ check_string_copy_error(Field_str *field,
|
||||
{
|
||||
const char *pos;
|
||||
char tmp[32];
|
||||
|
||||
THD *thd= field->table->in_use;
|
||||
|
||||
if (!(pos= well_formed_error_pos) &&
|
||||
!(pos= cannot_convert_error_pos))
|
||||
return FALSE;
|
||||
|
||||
convert_to_printable(tmp, sizeof(tmp), pos, (end - pos), cs, 6);
|
||||
|
||||
push_warning_printf(field->table->in_use,
|
||||
field->table->in_use->abort_on_warning ?
|
||||
MYSQL_ERROR::WARN_LEVEL_ERROR :
|
||||
push_warning_printf(thd,
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
|
||||
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
|
||||
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
|
||||
"string", tmp, field->field_name,
|
||||
(ulong) field->table->in_use->row_count);
|
||||
thd->warning_info->current_row_for_warning());
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -6405,7 +6404,7 @@ Field_longstr::report_if_important_data(const char *ptr, const char *end,
|
||||
if (test_if_important_data(field_charset, ptr, end))
|
||||
{
|
||||
if (table->in_use->abort_on_warning)
|
||||
set_warning(MYSQL_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
|
||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_DATA_TOO_LONG, 1);
|
||||
else
|
||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
|
||||
return 2;
|
||||
@ -9035,7 +9034,7 @@ int Field_bit::store(const char *from, uint length, CHARSET_INFO *cs)
|
||||
set_rec_bits((1 << bit_len) - 1, bit_ptr, bit_ofs, bit_len);
|
||||
memset(ptr, 0xff, bytes_in_rec);
|
||||
if (table->in_use->really_abort_on_warning())
|
||||
set_warning(MYSQL_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
|
||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_DATA_TOO_LONG, 1);
|
||||
else
|
||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
||||
return 1;
|
||||
@ -9446,7 +9445,7 @@ int Field_bit_as_char::store(const char *from, uint length, CHARSET_INFO *cs)
|
||||
if (bits)
|
||||
*ptr&= ((1 << bits) - 1); /* set first uchar */
|
||||
if (table->in_use->really_abort_on_warning())
|
||||
set_warning(MYSQL_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
|
||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_DATA_TOO_LONG, 1);
|
||||
else
|
||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
||||
return 1;
|
||||
@ -10321,7 +10320,7 @@ Field::set_warning(MYSQL_ERROR::enum_warning_level level, uint code,
|
||||
{
|
||||
thd->cuted_fields+= cuted_increment;
|
||||
push_warning_printf(thd, level, code, ER(code), field_name,
|
||||
thd->row_count);
|
||||
thd->warning_info->current_row_for_warning());
|
||||
return 0;
|
||||
}
|
||||
return level >= MYSQL_ERROR::WARN_LEVEL_WARN;
|
||||
|
@ -265,11 +265,11 @@ static int ndb_to_mysql_error(const NdbError *ndberr)
|
||||
- Used by replication to see if the error was temporary
|
||||
*/
|
||||
if (ndberr->status == NdbError::TemporaryError)
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_TEMPORARY_ERRMSG, ER(ER_GET_TEMPORARY_ERRMSG),
|
||||
ndberr->code, ndberr->message, "NDB");
|
||||
else
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_ERRMSG, ER(ER_GET_ERRMSG),
|
||||
ndberr->code, ndberr->message, "NDB");
|
||||
return error;
|
||||
@ -536,7 +536,7 @@ static void set_ndb_err(THD *thd, const NdbError &err)
|
||||
{
|
||||
char buf[FN_REFLEN];
|
||||
ndb_error_string(thd_ndb->m_error_code, buf, sizeof(buf));
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_ERRMSG, ER(ER_GET_ERRMSG),
|
||||
thd_ndb->m_error_code, buf, "NDB");
|
||||
}
|
||||
@ -5308,7 +5308,7 @@ int ha_ndbcluster::create(const char *name,
|
||||
{
|
||||
if (create_info->storage_media == HA_SM_MEMORY)
|
||||
{
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
ER(ER_ILLEGAL_HA_CREATE_OPTION),
|
||||
ndbcluster_hton_name,
|
||||
@ -5363,7 +5363,7 @@ int ha_ndbcluster::create(const char *name,
|
||||
case ROW_TYPE_FIXED:
|
||||
if (field_type_forces_var_part(field->type()))
|
||||
{
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
ER(ER_ILLEGAL_HA_CREATE_OPTION),
|
||||
ndbcluster_hton_name,
|
||||
@ -5703,7 +5703,7 @@ int ha_ndbcluster::create_index(const char *name, KEY *key_info,
|
||||
case ORDERED_INDEX:
|
||||
if (key_info->algorithm == HA_KEY_ALG_HASH)
|
||||
{
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
ER(ER_ILLEGAL_HA_CREATE_OPTION),
|
||||
ndbcluster_hton_name,
|
||||
@ -9606,11 +9606,11 @@ char* ha_ndbcluster::get_tablespace_name(THD *thd, char* name, uint name_len)
|
||||
}
|
||||
err:
|
||||
if (ndberr.status == NdbError::TemporaryError)
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_TEMPORARY_ERRMSG, ER(ER_GET_TEMPORARY_ERRMSG),
|
||||
ndberr.code, ndberr.message, "NDB");
|
||||
else
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_ERRMSG, ER(ER_GET_ERRMSG),
|
||||
ndberr.code, ndberr.message, "NDB");
|
||||
return 0;
|
||||
@ -9904,7 +9904,7 @@ uint ha_ndbcluster::set_up_partition_info(partition_info *part_info,
|
||||
{
|
||||
if (!current_thd->variables.new_mode)
|
||||
{
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
ER(ER_ILLEGAL_HA_CREATE_OPTION),
|
||||
ndbcluster_hton_name,
|
||||
|
@ -272,13 +272,13 @@ static void run_query(THD *thd, char *buf, char *end,
|
||||
Thd_ndb *thd_ndb= get_thd_ndb(thd);
|
||||
for (i= 0; no_print_error[i]; i++)
|
||||
if ((thd_ndb->m_error_code == no_print_error[i]) ||
|
||||
(thd->main_da.sql_errno() == (unsigned) no_print_error[i]))
|
||||
(thd->stmt_da->sql_errno() == (unsigned) no_print_error[i]))
|
||||
break;
|
||||
if (!no_print_error[i])
|
||||
sql_print_error("NDB: %s: error %s %d(ndb: %d) %d %d",
|
||||
buf,
|
||||
thd->main_da.message(),
|
||||
thd->main_da.sql_errno(),
|
||||
thd->stmt_da->message(),
|
||||
thd->stmt_da->sql_errno(),
|
||||
thd_ndb->m_error_code,
|
||||
(int) thd->is_error(), thd->is_slave_error);
|
||||
}
|
||||
@ -293,7 +293,7 @@ static void run_query(THD *thd, char *buf, char *end,
|
||||
is called from ndbcluster_reset_logs(), which is called from
|
||||
mysql_flush().
|
||||
*/
|
||||
thd->main_da.reset_diagnostics_area();
|
||||
thd->stmt_da->reset_diagnostics_area();
|
||||
|
||||
thd->options= save_thd_options;
|
||||
thd->set_query(save_thd_query, save_thd_query_length);
|
||||
@ -963,6 +963,21 @@ struct Cluster_schema
|
||||
uint32 any_value;
|
||||
};
|
||||
|
||||
static void print_could_not_discover_error(THD *thd,
|
||||
const Cluster_schema *schema)
|
||||
{
|
||||
sql_print_error("NDB Binlog: Could not discover table '%s.%s' from "
|
||||
"binlog schema event '%s' from node %d. "
|
||||
"my_errno: %d",
|
||||
schema->db, schema->name, schema->query,
|
||||
schema->node_id, my_errno);
|
||||
List_iterator_fast<MYSQL_ERROR> it(thd->warning_info->warn_list());
|
||||
MYSQL_ERROR *err;
|
||||
while ((err= it++))
|
||||
sql_print_warning("NDB Binlog: (%d)%s", err->get_sql_errno(),
|
||||
err->get_message_text());
|
||||
}
|
||||
|
||||
/*
|
||||
Transfer schema table data into corresponding struct
|
||||
*/
|
||||
@ -1198,7 +1213,7 @@ ndbcluster_update_slock(THD *thd,
|
||||
}
|
||||
|
||||
if (ndb_error)
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_ERRMSG, ER(ER_GET_ERRMSG),
|
||||
ndb_error->code,
|
||||
ndb_error->message,
|
||||
@ -1521,7 +1536,7 @@ err:
|
||||
}
|
||||
end:
|
||||
if (ndb_error)
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_ERRMSG, ER(ER_GET_ERRMSG),
|
||||
ndb_error->code,
|
||||
ndb_error->message,
|
||||
@ -1971,15 +1986,7 @@ ndb_binlog_thread_handle_schema_event(THD *thd, Ndb *ndb,
|
||||
}
|
||||
else if (ndb_create_table_from_engine(thd, schema->db, schema->name))
|
||||
{
|
||||
sql_print_error("NDB Binlog: Could not discover table '%s.%s' from "
|
||||
"binlog schema event '%s' from node %d. "
|
||||
"my_errno: %d",
|
||||
schema->db, schema->name, schema->query,
|
||||
schema->node_id, my_errno);
|
||||
List_iterator_fast<MYSQL_ERROR> it(thd->warn_list);
|
||||
MYSQL_ERROR *err;
|
||||
while ((err= it++))
|
||||
sql_print_warning("NDB Binlog: (%d)%s", err->code, err->msg);
|
||||
print_could_not_discover_error(thd, schema);
|
||||
}
|
||||
pthread_mutex_unlock(&LOCK_open);
|
||||
log_query= 1;
|
||||
@ -2262,14 +2269,7 @@ ndb_binlog_thread_handle_schema_event_post_epoch(THD *thd,
|
||||
}
|
||||
else if (ndb_create_table_from_engine(thd, schema->db, schema->name))
|
||||
{
|
||||
sql_print_error("NDB Binlog: Could not discover table '%s.%s' from "
|
||||
"binlog schema event '%s' from node %d. my_errno: %d",
|
||||
schema->db, schema->name, schema->query,
|
||||
schema->node_id, my_errno);
|
||||
List_iterator_fast<MYSQL_ERROR> it(thd->warn_list);
|
||||
MYSQL_ERROR *err;
|
||||
while ((err= it++))
|
||||
sql_print_warning("NDB Binlog: (%d)%s", err->code, err->msg);
|
||||
print_could_not_discover_error(thd, schema);
|
||||
}
|
||||
pthread_mutex_unlock(&LOCK_open);
|
||||
}
|
||||
@ -2344,8 +2344,8 @@ static int open_ndb_binlog_index(THD *thd, TABLE_LIST *tables,
|
||||
sql_print_error("NDB Binlog: Opening ndb_binlog_index: killed");
|
||||
else
|
||||
sql_print_error("NDB Binlog: Opening ndb_binlog_index: %d, '%s'",
|
||||
thd->main_da.sql_errno(),
|
||||
thd->main_da.message());
|
||||
thd->stmt_da->sql_errno(),
|
||||
thd->stmt_da->message());
|
||||
thd->proc_info= save_proc_info;
|
||||
return -1;
|
||||
}
|
||||
@ -2741,7 +2741,7 @@ ndbcluster_create_event(Ndb *ndb, const NDBTAB *ndbtab,
|
||||
"with BLOB attribute and no PK is not supported",
|
||||
share->key);
|
||||
if (push_warning)
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
ER(ER_ILLEGAL_HA_CREATE_OPTION),
|
||||
ndbcluster_hton_name,
|
||||
@ -2785,7 +2785,7 @@ ndbcluster_create_event(Ndb *ndb, const NDBTAB *ndbtab,
|
||||
failed, print a warning
|
||||
*/
|
||||
if (push_warning > 1)
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_ERRMSG, ER(ER_GET_ERRMSG),
|
||||
dict->getNdbError().code,
|
||||
dict->getNdbError().message, "NDB");
|
||||
@ -2813,7 +2813,7 @@ ndbcluster_create_event(Ndb *ndb, const NDBTAB *ndbtab,
|
||||
dict->dropEvent(my_event.getName()))
|
||||
{
|
||||
if (push_warning > 1)
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_ERRMSG, ER(ER_GET_ERRMSG),
|
||||
dict->getNdbError().code,
|
||||
dict->getNdbError().message, "NDB");
|
||||
@ -2832,7 +2832,7 @@ ndbcluster_create_event(Ndb *ndb, const NDBTAB *ndbtab,
|
||||
if (dict->createEvent(my_event))
|
||||
{
|
||||
if (push_warning > 1)
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_ERRMSG, ER(ER_GET_ERRMSG),
|
||||
dict->getNdbError().code,
|
||||
dict->getNdbError().message, "NDB");
|
||||
@ -2845,7 +2845,7 @@ ndbcluster_create_event(Ndb *ndb, const NDBTAB *ndbtab,
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
#ifdef NDB_BINLOG_EXTRA_WARNINGS
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_ERRMSG, ER(ER_GET_ERRMSG),
|
||||
0, "NDB Binlog: Removed trailing event",
|
||||
"NDB");
|
||||
@ -2956,7 +2956,7 @@ ndbcluster_create_event_ops(NDB_SHARE *share, const NDBTAB *ndbtab,
|
||||
{
|
||||
sql_print_error("NDB Binlog: Creating NdbEventOperation failed for"
|
||||
" %s",event_name);
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_ERRMSG, ER(ER_GET_ERRMSG),
|
||||
ndb->getNdbError().code,
|
||||
ndb->getNdbError().message,
|
||||
@ -3005,7 +3005,7 @@ ndbcluster_create_event_ops(NDB_SHARE *share, const NDBTAB *ndbtab,
|
||||
sql_print_error("NDB Binlog: Creating NdbEventOperation"
|
||||
" blob field %u handles failed (code=%d) for %s",
|
||||
j, op->getNdbError().code, event_name);
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_ERRMSG, ER(ER_GET_ERRMSG),
|
||||
op->getNdbError().code,
|
||||
op->getNdbError().message,
|
||||
@ -3044,7 +3044,7 @@ ndbcluster_create_event_ops(NDB_SHARE *share, const NDBTAB *ndbtab,
|
||||
retries= 0;
|
||||
if (retries == 0)
|
||||
{
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_ERRMSG, ER(ER_GET_ERRMSG),
|
||||
op->getNdbError().code, op->getNdbError().message,
|
||||
"NDB");
|
||||
@ -3112,7 +3112,7 @@ ndbcluster_handle_drop_table(Ndb *ndb, const char *event_name,
|
||||
if (dict->getNdbError().code != 4710)
|
||||
{
|
||||
/* drop event failed for some reason, issue a warning */
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_GET_ERRMSG, ER(ER_GET_ERRMSG),
|
||||
dict->getNdbError().code,
|
||||
dict->getNdbError().message, "NDB");
|
||||
|
@ -1313,7 +1313,7 @@ int ha_rollback_trans(THD *thd, bool all)
|
||||
trans->ha_list= 0;
|
||||
trans->no_2pc=0;
|
||||
if (is_real_trans && thd->transaction_rollback_request)
|
||||
thd->transaction.xid_state.rm_error= thd->main_da.sql_errno();
|
||||
thd->transaction.xid_state.rm_error= thd->stmt_da->sql_errno();
|
||||
if (all)
|
||||
thd->variables.tx_isolation=thd->session_tx_isolation;
|
||||
}
|
||||
@ -1914,23 +1914,28 @@ const char *get_canonical_filename(handler *file, const char *path,
|
||||
struct Ha_delete_table_error_handler: public Internal_error_handler
|
||||
{
|
||||
public:
|
||||
virtual bool handle_error(uint sql_errno,
|
||||
const char *message,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
THD *thd);
|
||||
virtual bool handle_condition(THD *thd,
|
||||
uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl);
|
||||
char buff[MYSQL_ERRMSG_SIZE];
|
||||
};
|
||||
|
||||
|
||||
bool
|
||||
Ha_delete_table_error_handler::
|
||||
handle_error(uint sql_errno,
|
||||
const char *message,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
THD *thd)
|
||||
handle_condition(THD *,
|
||||
uint,
|
||||
const char*,
|
||||
MYSQL_ERROR::enum_warning_level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl)
|
||||
{
|
||||
*cond_hdl= NULL;
|
||||
/* Grab the error message */
|
||||
strmake(buff, message, sizeof(buff)-1);
|
||||
strmake(buff, msg, sizeof(buff)-1);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -1989,7 +1994,7 @@ int ha_delete_table(THD *thd, handlerton *table_type, const char *path,
|
||||
XXX: should we convert *all* errors to warnings here?
|
||||
What if the error is fatal?
|
||||
*/
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR, error,
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, error,
|
||||
ha_delete_table_error_handler.buff);
|
||||
}
|
||||
delete file;
|
||||
|
@ -4785,7 +4785,6 @@ String *Item::check_well_formed_result(String *str, bool send_error)
|
||||
{
|
||||
THD *thd= current_thd;
|
||||
char hexbuf[7];
|
||||
enum MYSQL_ERROR::enum_warning_level level;
|
||||
uint diff= str->length() - wlen;
|
||||
set_if_smaller(diff, 3);
|
||||
octet2hex(hexbuf, str->ptr() + wlen, diff);
|
||||
@ -4798,16 +4797,14 @@ String *Item::check_well_formed_result(String *str, bool send_error)
|
||||
if ((thd->variables.sql_mode &
|
||||
(MODE_STRICT_TRANS_TABLES | MODE_STRICT_ALL_TABLES)))
|
||||
{
|
||||
level= MYSQL_ERROR::WARN_LEVEL_ERROR;
|
||||
null_value= 1;
|
||||
str= 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
level= MYSQL_ERROR::WARN_LEVEL_WARN;
|
||||
str->length(wlen);
|
||||
}
|
||||
push_warning_printf(thd, level, ER_INVALID_CHARACTER_STRING,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_INVALID_CHARACTER_STRING,
|
||||
ER(ER_INVALID_CHARACTER_STRING), cs->csname, hexbuf);
|
||||
}
|
||||
return str;
|
||||
|
@ -599,7 +599,7 @@ void Item_func::signal_divide_by_null()
|
||||
{
|
||||
THD *thd= current_thd;
|
||||
if (thd->variables.sql_mode & MODE_ERROR_FOR_DIVISION_BY_ZERO)
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR, ER_DIVISION_BY_ZERO,
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_DIVISION_BY_ZERO,
|
||||
ER(ER_DIVISION_BY_ZERO));
|
||||
null_value= 1;
|
||||
}
|
||||
@ -1054,7 +1054,7 @@ my_decimal *Item_decimal_typecast::val_decimal(my_decimal *dec)
|
||||
return dec;
|
||||
|
||||
err:
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_WARN_DATA_OUT_OF_RANGE,
|
||||
ER(ER_WARN_DATA_OUT_OF_RANGE),
|
||||
name, 1);
|
||||
@ -3670,7 +3670,7 @@ longlong Item_func_benchmark::val_int()
|
||||
{
|
||||
char buff[22];
|
||||
llstr(((longlong) loop_count), buff);
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_WRONG_VALUE_FOR_TYPE, ER(ER_WRONG_VALUE_FOR_TYPE),
|
||||
"count", buff, "benchmark");
|
||||
}
|
||||
@ -5814,12 +5814,12 @@ Item_func_sp::func_name() const
|
||||
}
|
||||
|
||||
|
||||
int my_missing_function_error(const LEX_STRING &token, const char *func_name)
|
||||
void my_missing_function_error(const LEX_STRING &token, const char *func_name)
|
||||
{
|
||||
if (token.length && is_lex_native_function (&token))
|
||||
return my_error(ER_FUNC_INEXISTENT_NAME_COLLISION, MYF(0), func_name);
|
||||
my_error(ER_FUNC_INEXISTENT_NAME_COLLISION, MYF(0), func_name);
|
||||
else
|
||||
return my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "FUNCTION", func_name);
|
||||
my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "FUNCTION", func_name);
|
||||
}
|
||||
|
||||
|
||||
|
@ -528,11 +528,11 @@ String *Item_func_des_encrypt::val_str(String *str)
|
||||
return &tmp_value;
|
||||
|
||||
error:
|
||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
code, ER(code),
|
||||
"des_encrypt");
|
||||
#else
|
||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_FEATURE_DISABLED, ER(ER_FEATURE_DISABLED),
|
||||
"des_encrypt","--with-openssl");
|
||||
#endif /* HAVE_OPENSSL */
|
||||
@ -605,12 +605,12 @@ String *Item_func_des_decrypt::val_str(String *str)
|
||||
return &tmp_value;
|
||||
|
||||
error:
|
||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
code, ER(code),
|
||||
"des_decrypt");
|
||||
wrong_key:
|
||||
#else
|
||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_FEATURE_DISABLED, ER(ER_FEATURE_DISABLED),
|
||||
"des_decrypt","--with-openssl");
|
||||
#endif /* HAVE_OPENSSL */
|
||||
@ -3232,7 +3232,7 @@ longlong Item_func_uncompressed_length::val_int()
|
||||
*/
|
||||
if (res->length() <= 4)
|
||||
{
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ZLIB_Z_DATA_ERROR,
|
||||
ER(ER_ZLIB_Z_DATA_ERROR));
|
||||
null_value= 1;
|
||||
@ -3309,7 +3309,7 @@ String *Item_func_compress::val_str(String *str)
|
||||
(const Bytef*)res->ptr(), res->length())) != Z_OK)
|
||||
{
|
||||
code= err==Z_MEM_ERROR ? ER_ZLIB_Z_MEM_ERROR : ER_ZLIB_Z_BUF_ERROR;
|
||||
push_warning(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,code,ER(code));
|
||||
push_warning(current_thd,MYSQL_ERROR::WARN_LEVEL_WARN,code,ER(code));
|
||||
null_value= 1;
|
||||
return 0;
|
||||
}
|
||||
@ -3347,7 +3347,7 @@ String *Item_func_uncompress::val_str(String *str)
|
||||
/* If length is less than 4 bytes, data is corrupt */
|
||||
if (res->length() <= 4)
|
||||
{
|
||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ZLIB_Z_DATA_ERROR,
|
||||
ER(ER_ZLIB_Z_DATA_ERROR));
|
||||
goto err;
|
||||
@ -3357,7 +3357,7 @@ String *Item_func_uncompress::val_str(String *str)
|
||||
new_size= uint4korr(res->ptr()) & 0x3FFFFFFF;
|
||||
if (new_size > current_thd->variables.max_allowed_packet)
|
||||
{
|
||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_TOO_BIG_FOR_UNCOMPRESS,
|
||||
ER(ER_TOO_BIG_FOR_UNCOMPRESS),
|
||||
current_thd->variables.max_allowed_packet);
|
||||
@ -3375,7 +3375,7 @@ String *Item_func_uncompress::val_str(String *str)
|
||||
|
||||
code= ((err == Z_BUF_ERROR) ? ER_ZLIB_Z_BUF_ERROR :
|
||||
((err == Z_MEM_ERROR) ? ER_ZLIB_Z_MEM_ERROR : ER_ZLIB_Z_DATA_ERROR));
|
||||
push_warning(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,code,ER(code));
|
||||
push_warning(current_thd,MYSQL_ERROR::WARN_LEVEL_WARN,code,ER(code));
|
||||
|
||||
err:
|
||||
null_value= 1;
|
||||
|
@ -3102,6 +3102,8 @@ int dump_leaf_key(uchar* key, element_count count __attribute__((unused)),
|
||||
result->append(*res);
|
||||
}
|
||||
|
||||
item->row_count++;
|
||||
|
||||
/* stop if length of result more than max_length */
|
||||
if (result->length() > item->max_length)
|
||||
{
|
||||
@ -3120,8 +3122,11 @@ int dump_leaf_key(uchar* key, element_count count __attribute__((unused)),
|
||||
result->length(),
|
||||
&well_formed_error);
|
||||
result->length(old_length + add_length);
|
||||
item->count_cut_values++;
|
||||
item->warning_for_row= TRUE;
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_CUT_VALUE_GROUP_CONCAT, ER(ER_CUT_VALUE_GROUP_CONCAT),
|
||||
item->row_count);
|
||||
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@ -3141,12 +3146,12 @@ Item_func_group_concat::
|
||||
Item_func_group_concat(Name_resolution_context *context_arg,
|
||||
bool distinct_arg, List<Item> *select_list,
|
||||
SQL_LIST *order_list, String *separator_arg)
|
||||
:tmp_table_param(0), warning(0),
|
||||
separator(separator_arg), tree(0), unique_filter(NULL), table(0),
|
||||
:tmp_table_param(0), separator(separator_arg), tree(0),
|
||||
unique_filter(NULL), table(0),
|
||||
order(0), context(context_arg),
|
||||
arg_count_order(order_list ? order_list->elements : 0),
|
||||
arg_count_field(select_list->elements),
|
||||
count_cut_values(0),
|
||||
row_count(0),
|
||||
distinct(distinct_arg),
|
||||
warning_for_row(FALSE),
|
||||
force_copy_fields(0), original(0)
|
||||
@ -3200,7 +3205,6 @@ Item_func_group_concat::Item_func_group_concat(THD *thd,
|
||||
Item_func_group_concat *item)
|
||||
:Item_sum(thd, item),
|
||||
tmp_table_param(item->tmp_table_param),
|
||||
warning(item->warning),
|
||||
separator(item->separator),
|
||||
tree(item->tree),
|
||||
unique_filter(item->unique_filter),
|
||||
@ -3209,7 +3213,7 @@ Item_func_group_concat::Item_func_group_concat(THD *thd,
|
||||
context(item->context),
|
||||
arg_count_order(item->arg_count_order),
|
||||
arg_count_field(item->arg_count_field),
|
||||
count_cut_values(item->count_cut_values),
|
||||
row_count(item->row_count),
|
||||
distinct(item->distinct),
|
||||
warning_for_row(item->warning_for_row),
|
||||
always_null(item->always_null),
|
||||
@ -3227,15 +3231,6 @@ void Item_func_group_concat::cleanup()
|
||||
DBUG_ENTER("Item_func_group_concat::cleanup");
|
||||
Item_sum::cleanup();
|
||||
|
||||
/* Adjust warning message to include total number of cut values */
|
||||
if (warning)
|
||||
{
|
||||
char warn_buff[MYSQL_ERRMSG_SIZE];
|
||||
sprintf(warn_buff, ER(ER_CUT_VALUE_GROUP_CONCAT), count_cut_values);
|
||||
warning->set_msg(current_thd, warn_buff);
|
||||
warning= 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Free table and tree if they belong to this item (if item have not pointer
|
||||
to original item from which was made copy => it own its objects )
|
||||
@ -3259,15 +3254,8 @@ void Item_func_group_concat::cleanup()
|
||||
delete unique_filter;
|
||||
unique_filter= NULL;
|
||||
}
|
||||
if (warning)
|
||||
{
|
||||
char warn_buff[MYSQL_ERRMSG_SIZE];
|
||||
sprintf(warn_buff, ER(ER_CUT_VALUE_GROUP_CONCAT), count_cut_values);
|
||||
warning->set_msg(thd, warn_buff);
|
||||
warning= 0;
|
||||
}
|
||||
}
|
||||
DBUG_ASSERT(tree == 0 && warning == 0);
|
||||
DBUG_ASSERT(tree == 0);
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
@ -3556,17 +3544,6 @@ String* Item_func_group_concat::val_str(String* str)
|
||||
/* Tree is used for sorting as in ORDER BY */
|
||||
tree_walk(tree, (tree_walk_action)&dump_leaf_key, (void*)this,
|
||||
left_root_right);
|
||||
if (count_cut_values && !warning)
|
||||
{
|
||||
/*
|
||||
ER_CUT_VALUE_GROUP_CONCAT needs an argument, but this gets set in
|
||||
Item_func_group_concat::cleanup().
|
||||
*/
|
||||
DBUG_ASSERT(table);
|
||||
warning= push_warning(table->in_use, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_CUT_VALUE_GROUP_CONCAT,
|
||||
ER(ER_CUT_VALUE_GROUP_CONCAT));
|
||||
}
|
||||
return &result;
|
||||
}
|
||||
|
||||
|
@ -1181,12 +1181,9 @@ public:
|
||||
|
||||
#endif /* HAVE_DLOPEN */
|
||||
|
||||
class MYSQL_ERROR;
|
||||
|
||||
class Item_func_group_concat : public Item_sum
|
||||
{
|
||||
TMP_TABLE_PARAM *tmp_table_param;
|
||||
MYSQL_ERROR *warning;
|
||||
String result;
|
||||
String *separator;
|
||||
TREE tree_base;
|
||||
@ -1207,7 +1204,7 @@ class Item_func_group_concat : public Item_sum
|
||||
uint arg_count_order;
|
||||
/** The number of selected items, aka the expr list. */
|
||||
uint arg_count_field;
|
||||
uint count_cut_values;
|
||||
uint row_count;
|
||||
bool distinct;
|
||||
bool warning_for_row;
|
||||
bool always_null;
|
||||
|
@ -602,7 +602,7 @@ err:
|
||||
{
|
||||
char buff[128];
|
||||
strmake(buff, val_begin, min(length, sizeof(buff)-1));
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_WRONG_VALUE_FOR_TYPE, ER(ER_WRONG_VALUE_FOR_TYPE),
|
||||
date_time_type, buff, "str_to_date");
|
||||
}
|
||||
|
14
sql/lex.h
14
sql/lex.h
@ -96,6 +96,7 @@ static SYMBOL symbols[] = {
|
||||
{ "CASCADE", SYM(CASCADE)},
|
||||
{ "CASCADED", SYM(CASCADED)},
|
||||
{ "CASE", SYM(CASE_SYM)},
|
||||
{ "CATALOG_NAME", SYM(CATALOG_NAME_SYM)},
|
||||
{ "CHAIN", SYM(CHAIN_SYM)},
|
||||
{ "CHANGE", SYM(CHANGE)},
|
||||
{ "CHANGED", SYM(CHANGED)},
|
||||
@ -105,6 +106,7 @@ static SYMBOL symbols[] = {
|
||||
{ "CHECK", SYM(CHECK_SYM)},
|
||||
{ "CHECKSUM", SYM(CHECKSUM_SYM)},
|
||||
{ "CIPHER", SYM(CIPHER_SYM)},
|
||||
{ "CLASS_ORIGIN", SYM(CLASS_ORIGIN_SYM)},
|
||||
{ "CLIENT", SYM(CLIENT_SYM)},
|
||||
{ "CLOSE", SYM(CLOSE_SYM)},
|
||||
{ "COALESCE", SYM(COALESCE)},
|
||||
@ -112,6 +114,7 @@ static SYMBOL symbols[] = {
|
||||
{ "COLLATE", SYM(COLLATE_SYM)},
|
||||
{ "COLLATION", SYM(COLLATION_SYM)},
|
||||
{ "COLUMN", SYM(COLUMN_SYM)},
|
||||
{ "COLUMN_NAME", SYM(COLUMN_NAME_SYM)},
|
||||
{ "COLUMNS", SYM(COLUMNS)},
|
||||
{ "COMMENT", SYM(COMMENT_SYM)},
|
||||
{ "COMMIT", SYM(COMMIT_SYM)},
|
||||
@ -124,6 +127,9 @@ static SYMBOL symbols[] = {
|
||||
{ "CONNECTION", SYM(CONNECTION_SYM)},
|
||||
{ "CONSISTENT", SYM(CONSISTENT_SYM)},
|
||||
{ "CONSTRAINT", SYM(CONSTRAINT)},
|
||||
{ "CONSTRAINT_CATALOG", SYM(CONSTRAINT_CATALOG_SYM)},
|
||||
{ "CONSTRAINT_NAME", SYM(CONSTRAINT_NAME_SYM)},
|
||||
{ "CONSTRAINT_SCHEMA", SYM(CONSTRAINT_SCHEMA_SYM)},
|
||||
{ "CONTAINS", SYM(CONTAINS_SYM)},
|
||||
{ "CONTEXT", SYM(CONTEXT_SYM)},
|
||||
{ "CONTINUE", SYM(CONTINUE_SYM)},
|
||||
@ -138,6 +144,7 @@ static SYMBOL symbols[] = {
|
||||
{ "CURRENT_TIMESTAMP", SYM(NOW_SYM)},
|
||||
{ "CURRENT_USER", SYM(CURRENT_USER)},
|
||||
{ "CURSOR", SYM(CURSOR_SYM)},
|
||||
{ "CURSOR_NAME", SYM(CURSOR_NAME_SYM)},
|
||||
{ "DATA", SYM(DATA_SYM)},
|
||||
{ "DATABASE", SYM(DATABASE)},
|
||||
{ "DATABASES", SYM(DATABASES)},
|
||||
@ -334,6 +341,7 @@ static SYMBOL symbols[] = {
|
||||
{ "MEDIUMTEXT", SYM(MEDIUMTEXT)},
|
||||
{ "MEMORY", SYM(MEMORY_SYM)},
|
||||
{ "MERGE", SYM(MERGE_SYM)},
|
||||
{ "MESSAGE_TEXT", SYM(MESSAGE_TEXT_SYM)},
|
||||
{ "MICROSECOND", SYM(MICROSECOND_SYM)},
|
||||
{ "MIDDLEINT", SYM(MEDIUMINT)}, /* For powerbuilder */
|
||||
{ "MIGRATE", SYM(MIGRATE_SYM)},
|
||||
@ -350,6 +358,7 @@ static SYMBOL symbols[] = {
|
||||
{ "MULTIPOINT", SYM(MULTIPOINT)},
|
||||
{ "MULTIPOLYGON", SYM(MULTIPOLYGON)},
|
||||
{ "MUTEX", SYM(MUTEX_SYM)},
|
||||
{ "MYSQL_ERRNO", SYM(MYSQL_ERRNO_SYM)},
|
||||
{ "NAME", SYM(NAME_SYM)},
|
||||
{ "NAMES", SYM(NAMES_SYM)},
|
||||
{ "NATIONAL", SYM(NATIONAL_SYM)},
|
||||
@ -441,6 +450,7 @@ static SYMBOL symbols[] = {
|
||||
{ "REPEAT", SYM(REPEAT_SYM)},
|
||||
{ "REQUIRE", SYM(REQUIRE_SYM)},
|
||||
{ "RESET", SYM(RESET_SYM)},
|
||||
{ "RESIGNAL", SYM(RESIGNAL_SYM)},
|
||||
{ "RESTORE", SYM(RESTORE_SYM)},
|
||||
{ "RESTRICT", SYM(RESTRICT)},
|
||||
{ "RESUME", SYM(RESUME_SYM)},
|
||||
@ -459,6 +469,7 @@ static SYMBOL symbols[] = {
|
||||
{ "SAVEPOINT", SYM(SAVEPOINT_SYM)},
|
||||
{ "SCHEDULE", SYM(SCHEDULE_SYM)},
|
||||
{ "SCHEMA", SYM(DATABASE)},
|
||||
{ "SCHEMA_NAME", SYM(SCHEMA_NAME_SYM)},
|
||||
{ "SCHEMAS", SYM(DATABASES)},
|
||||
{ "SECOND", SYM(SECOND_SYM)},
|
||||
{ "SECOND_MICROSECOND", SYM(SECOND_MICROSECOND_SYM)},
|
||||
@ -474,6 +485,7 @@ static SYMBOL symbols[] = {
|
||||
{ "SHARE", SYM(SHARE_SYM)},
|
||||
{ "SHOW", SYM(SHOW)},
|
||||
{ "SHUTDOWN", SYM(SHUTDOWN)},
|
||||
{ "SIGNAL", SYM(SIGNAL_SYM)},
|
||||
{ "SIGNED", SYM(SIGNED_SYM)},
|
||||
{ "SIMPLE", SYM(SIMPLE_SYM)},
|
||||
{ "SLAVE", SYM(SLAVE)},
|
||||
@ -515,6 +527,7 @@ static SYMBOL symbols[] = {
|
||||
{ "STORAGE", SYM(STORAGE_SYM)},
|
||||
{ "STRAIGHT_JOIN", SYM(STRAIGHT_JOIN)},
|
||||
{ "STRING", SYM(STRING_SYM)},
|
||||
{ "SUBCLASS_ORIGIN", SYM(SUBCLASS_ORIGIN_SYM)},
|
||||
{ "SUBJECT", SYM(SUBJECT_SYM)},
|
||||
{ "SUBPARTITION", SYM(SUBPARTITION_SYM)},
|
||||
{ "SUBPARTITIONS", SYM(SUBPARTITIONS_SYM)},
|
||||
@ -523,6 +536,7 @@ static SYMBOL symbols[] = {
|
||||
{ "SWAPS", SYM(SWAPS_SYM)},
|
||||
{ "SWITCHES", SYM(SWITCHES_SYM)},
|
||||
{ "TABLE", SYM(TABLE_SYM)},
|
||||
{ "TABLE_NAME", SYM(TABLE_NAME_SYM)},
|
||||
{ "TABLES", SYM(TABLES)},
|
||||
{ "TABLESPACE", SYM(TABLESPACE)},
|
||||
{ "TABLE_CHECKSUM", SYM(TABLE_CHECKSUM_SYM)},
|
||||
|
39
sql/log.cc
39
sql/log.cc
@ -80,23 +80,28 @@ public:
|
||||
|
||||
virtual ~Silence_log_table_errors() {}
|
||||
|
||||
virtual bool handle_error(uint sql_errno, const char *message,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
THD *thd);
|
||||
virtual bool handle_condition(THD *thd,
|
||||
uint sql_errno,
|
||||
const char* sql_state,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl);
|
||||
const char *message() const { return m_message; }
|
||||
};
|
||||
|
||||
bool
|
||||
Silence_log_table_errors::handle_error(uint /* sql_errno */,
|
||||
const char *message_arg,
|
||||
MYSQL_ERROR::enum_warning_level /* level */,
|
||||
THD * /* thd */)
|
||||
Silence_log_table_errors::handle_condition(THD *,
|
||||
uint,
|
||||
const char*,
|
||||
MYSQL_ERROR::enum_warning_level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl)
|
||||
{
|
||||
strmake(m_message, message_arg, sizeof(m_message)-1);
|
||||
*cond_hdl= NULL;
|
||||
strmake(m_message, msg, sizeof(m_message)-1);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
sql_print_message_func sql_print_message_handlers[3] =
|
||||
{
|
||||
sql_print_information,
|
||||
@ -1646,7 +1651,7 @@ bool MYSQL_BIN_LOG::check_write_error(THD *thd)
|
||||
if (!thd->is_error())
|
||||
DBUG_RETURN(checked);
|
||||
|
||||
switch (thd->main_da.sql_errno())
|
||||
switch (thd->stmt_da->sql_errno())
|
||||
{
|
||||
case ER_TRANS_CACHE_FULL:
|
||||
case ER_ERROR_ON_WRITE:
|
||||
@ -2902,7 +2907,7 @@ bool MYSQL_BIN_LOG::reset_logs(THD* thd)
|
||||
}
|
||||
else
|
||||
{
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_BINLOG_PURGE_FATAL_ERR,
|
||||
"a problem with deleting %s; "
|
||||
"consider examining correspondence "
|
||||
@ -2933,7 +2938,7 @@ bool MYSQL_BIN_LOG::reset_logs(THD* thd)
|
||||
}
|
||||
else
|
||||
{
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_BINLOG_PURGE_FATAL_ERR,
|
||||
"a problem with deleting %s; "
|
||||
"consider examining correspondence "
|
||||
@ -3264,7 +3269,7 @@ int MYSQL_BIN_LOG::purge_logs(const char *to_log,
|
||||
*/
|
||||
if (thd)
|
||||
{
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_BINLOG_PURGE_FATAL_ERR,
|
||||
"a problem with getting info on being purged %s; "
|
||||
"consider examining correspondence "
|
||||
@ -3310,7 +3315,7 @@ int MYSQL_BIN_LOG::purge_logs(const char *to_log,
|
||||
{
|
||||
if (thd)
|
||||
{
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_BINLOG_PURGE_FATAL_ERR,
|
||||
"a problem with deleting %s; "
|
||||
"consider examining correspondence "
|
||||
@ -3409,7 +3414,7 @@ int MYSQL_BIN_LOG::purge_logs_before_date(time_t purge_time)
|
||||
*/
|
||||
if (thd)
|
||||
{
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_BINLOG_PURGE_FATAL_ERR,
|
||||
"a problem with getting info on being purged %s; "
|
||||
"consider examining correspondence "
|
||||
@ -4419,9 +4424,9 @@ int query_error_code(THD *thd, bool not_killed)
|
||||
|
||||
if (not_killed)
|
||||
{
|
||||
error= thd->is_error() ? thd->main_da.sql_errno() : 0;
|
||||
error= thd->is_error() ? thd->stmt_da->sql_errno() : 0;
|
||||
|
||||
/* thd->main_da.sql_errno() might be ER_SERVER_SHUTDOWN or
|
||||
/* thd->stmt_da->sql_errno() might be ER_SERVER_SHUTDOWN or
|
||||
ER_QUERY_INTERRUPTED, So here we need to make sure that error
|
||||
is not set to these errors when specified not_killed by the
|
||||
caller.
|
||||
|
@ -134,7 +134,7 @@ static void inline slave_rows_error_report(enum loglevel level, int ha_error,
|
||||
char buff[MAX_SLAVE_ERRMSG], *slider;
|
||||
const char *buff_end= buff + sizeof(buff);
|
||||
uint len;
|
||||
List_iterator_fast<MYSQL_ERROR> it(thd->warn_list);
|
||||
List_iterator_fast<MYSQL_ERROR> it(thd->warning_info->warn_list());
|
||||
MYSQL_ERROR *err;
|
||||
buff[0]= 0;
|
||||
|
||||
@ -142,10 +142,11 @@ static void inline slave_rows_error_report(enum loglevel level, int ha_error,
|
||||
slider += len, err= it++)
|
||||
{
|
||||
len= my_snprintf(slider, buff_end - slider,
|
||||
" %s, Error_code: %d;", err->msg, err->code);
|
||||
" %s, Error_code: %d;", err->get_message_text(),
|
||||
err->get_sql_errno());
|
||||
}
|
||||
|
||||
rli->report(level, thd->is_error()? thd->main_da.sql_errno() : 0,
|
||||
rli->report(level, thd->is_error()? thd->stmt_da->sql_errno() : 0,
|
||||
"Could not execute %s event on table %s.%s;"
|
||||
"%s handler error %s; "
|
||||
"the event's master log %s, end_log_pos %lu",
|
||||
@ -353,13 +354,13 @@ inline int ignored_error_code(int err_code)
|
||||
*/
|
||||
int convert_handler_error(int error, THD* thd, TABLE *table)
|
||||
{
|
||||
uint actual_error= (thd->is_error() ? thd->main_da.sql_errno() :
|
||||
uint actual_error= (thd->is_error() ? thd->stmt_da->sql_errno() :
|
||||
0);
|
||||
|
||||
if (actual_error == 0)
|
||||
{
|
||||
table->file->print_error(error, MYF(0));
|
||||
actual_error= (thd->is_error() ? thd->main_da.sql_errno() :
|
||||
actual_error= (thd->is_error() ? thd->stmt_da->sql_errno() :
|
||||
ER_UNKNOWN_ERROR);
|
||||
if (actual_error == ER_UNKNOWN_ERROR)
|
||||
if (global_system_variables.log_warnings)
|
||||
@ -3162,7 +3163,7 @@ START SLAVE; . Query: '%s'", expected_error, thd->query);
|
||||
}
|
||||
|
||||
/* If the query was not ignored, it is printed to the general log */
|
||||
if (!thd->is_error() || thd->main_da.sql_errno() != ER_SLAVE_IGNORED_TABLE)
|
||||
if (!thd->is_error() || thd->stmt_da->sql_errno() != ER_SLAVE_IGNORED_TABLE)
|
||||
general_log_write(thd, COM_QUERY, thd->query, thd->query_length);
|
||||
|
||||
compare_errors:
|
||||
@ -3171,7 +3172,7 @@ compare_errors:
|
||||
If we expected a non-zero error code, and we don't get the same error
|
||||
code, and it should be ignored or is related to a concurrency issue.
|
||||
*/
|
||||
actual_error= thd->is_error() ? thd->main_da.sql_errno() : 0;
|
||||
actual_error= thd->is_error() ? thd->stmt_da->sql_errno() : 0;
|
||||
DBUG_PRINT("info",("expected_error: %d sql_errno: %d",
|
||||
expected_error, actual_error));
|
||||
if ((expected_error && expected_error != actual_error &&
|
||||
@ -3186,7 +3187,7 @@ Error on master: '%s' (%d), Error on slave: '%s' (%d). \
|
||||
Default database: '%s'. Query: '%s'",
|
||||
ER_SAFE(expected_error),
|
||||
expected_error,
|
||||
actual_error ? thd->main_da.message() : "no error",
|
||||
actual_error ? thd->stmt_da->message() : "no error",
|
||||
actual_error,
|
||||
print_slave_db_safe(db), query_arg);
|
||||
thd->is_slave_error= 1;
|
||||
@ -3218,7 +3219,7 @@ Default database: '%s'. Query: '%s'",
|
||||
{
|
||||
rli->report(ERROR_LEVEL, actual_error,
|
||||
"Error '%s' on query. Default database: '%s'. Query: '%s'",
|
||||
(actual_error ? thd->main_da.message() :
|
||||
(actual_error ? thd->stmt_da->message() :
|
||||
"unexpected success or fatal error"),
|
||||
print_slave_db_safe(thd->db), query_arg);
|
||||
thd->is_slave_error= 1;
|
||||
@ -4525,13 +4526,7 @@ int Load_log_event::do_apply_event(NET* net, Relay_log_info const *rli,
|
||||
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
||||
thd->query_id = next_query_id();
|
||||
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
||||
/*
|
||||
Initing thd->row_count is not necessary in theory as this variable has no
|
||||
influence in the case of the slave SQL thread (it is used to generate a
|
||||
"data truncated" warning but which is absorbed and never gets to the
|
||||
error log); still we init it to avoid a Valgrind message.
|
||||
*/
|
||||
mysql_reset_errors(thd, 0);
|
||||
thd->warning_info->opt_clear_warning_info(thd->query_id);
|
||||
|
||||
TABLE_LIST tables;
|
||||
bzero((char*) &tables,sizeof(tables));
|
||||
@ -4692,8 +4687,8 @@ error:
|
||||
int sql_errno;
|
||||
if (thd->is_error())
|
||||
{
|
||||
err= thd->main_da.message();
|
||||
sql_errno= thd->main_da.sql_errno();
|
||||
err= thd->stmt_da->message();
|
||||
sql_errno= thd->stmt_da->sql_errno();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -7256,7 +7251,7 @@ int Rows_log_event::do_apply_event(Relay_log_info const *rli)
|
||||
|
||||
if (simple_open_n_lock_tables(thd, rli->tables_to_lock))
|
||||
{
|
||||
uint actual_error= thd->main_da.sql_errno();
|
||||
uint actual_error= thd->stmt_da->sql_errno();
|
||||
if (thd->is_slave_error || thd->is_fatal_error)
|
||||
{
|
||||
/*
|
||||
@ -7267,7 +7262,7 @@ int Rows_log_event::do_apply_event(Relay_log_info const *rli)
|
||||
*/
|
||||
rli->report(ERROR_LEVEL, actual_error,
|
||||
"Error '%s' on opening tables",
|
||||
(actual_error ? thd->main_da.message() :
|
||||
(actual_error ? thd->stmt_da->message() :
|
||||
"unexpected success or fatal error"));
|
||||
thd->is_slave_error= 1;
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ Old_rows_log_event::do_apply_event(Old_rows_log_event *ev, const Relay_log_info
|
||||
|
||||
if (simple_open_n_lock_tables(thd, rli->tables_to_lock))
|
||||
{
|
||||
uint actual_error= thd->main_da.sql_errno();
|
||||
uint actual_error= thd->stmt_da->sql_errno();
|
||||
if (thd->is_slave_error || thd->is_fatal_error)
|
||||
{
|
||||
/*
|
||||
@ -87,7 +87,7 @@ Old_rows_log_event::do_apply_event(Old_rows_log_event *ev, const Relay_log_info
|
||||
*/
|
||||
rli->report(ERROR_LEVEL, actual_error,
|
||||
"Error '%s' on opening tables",
|
||||
(actual_error ? thd->main_da.message() :
|
||||
(actual_error ? thd->stmt_da->message() :
|
||||
"unexpected success or fatal error"));
|
||||
thd->is_slave_error= 1;
|
||||
}
|
||||
@ -216,10 +216,10 @@ Old_rows_log_event::do_apply_event(Old_rows_log_event *ev, const Relay_log_info
|
||||
break;
|
||||
|
||||
default:
|
||||
rli->report(ERROR_LEVEL, thd->main_da.sql_errno(),
|
||||
rli->report(ERROR_LEVEL, thd->stmt_da->sql_errno(),
|
||||
"Error in %s event: row application failed. %s",
|
||||
ev->get_type_str(),
|
||||
thd->is_error() ? thd->main_da.message() : "");
|
||||
thd->is_error() ? thd->stmt_da->message() : "");
|
||||
thd->is_slave_error= 1;
|
||||
break;
|
||||
}
|
||||
@ -245,12 +245,12 @@ Old_rows_log_event::do_apply_event(Old_rows_log_event *ev, const Relay_log_info
|
||||
|
||||
if (error)
|
||||
{ /* error has occured during the transaction */
|
||||
rli->report(ERROR_LEVEL, thd->main_da.sql_errno(),
|
||||
rli->report(ERROR_LEVEL, thd->stmt_da->sql_errno(),
|
||||
"Error in %s event: error during transaction execution "
|
||||
"on table %s.%s. %s",
|
||||
ev->get_type_str(), table->s->db.str,
|
||||
table->s->table_name.str,
|
||||
thd->is_error() ? thd->main_da.message() : "");
|
||||
thd->is_error() ? thd->stmt_da->message() : "");
|
||||
|
||||
/*
|
||||
If one day we honour --skip-slave-errors in row-based replication, and
|
||||
|
@ -41,17 +41,17 @@ int decimal_operation_results(int result)
|
||||
"", (long)-1);
|
||||
break;
|
||||
case E_DEC_OVERFLOW:
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_TRUNCATED_WRONG_VALUE,
|
||||
ER(ER_TRUNCATED_WRONG_VALUE),
|
||||
"DECIMAL", "");
|
||||
break;
|
||||
case E_DEC_DIV_ZERO:
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_DIVISION_BY_ZERO, ER(ER_DIVISION_BY_ZERO));
|
||||
break;
|
||||
case E_DEC_BAD_NUM:
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
|
||||
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
|
||||
"decimal", "", "", (long)-1);
|
||||
|
@ -128,6 +128,10 @@ extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *files_charset_info ;
|
||||
extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *national_charset_info;
|
||||
extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *table_alias_charset;
|
||||
|
||||
/**
|
||||
Character set of the buildin error messages loaded from errmsg.sys.
|
||||
*/
|
||||
extern CHARSET_INFO *error_message_charset_info;
|
||||
|
||||
enum Derivation
|
||||
{
|
||||
|
@ -628,6 +628,7 @@ MY_BITMAP temp_pool;
|
||||
CHARSET_INFO *system_charset_info, *files_charset_info ;
|
||||
CHARSET_INFO *national_charset_info, *table_alias_charset;
|
||||
CHARSET_INFO *character_set_filesystem;
|
||||
CHARSET_INFO *error_message_charset_info;
|
||||
|
||||
MY_LOCALE *my_default_lc_time_names;
|
||||
|
||||
@ -1808,7 +1809,8 @@ void close_connection(THD *thd, uint errcode, bool lock)
|
||||
if ((vio= thd->net.vio) != 0)
|
||||
{
|
||||
if (errcode)
|
||||
net_send_error(thd, errcode, ER(errcode)); /* purecov: inspected */
|
||||
net_send_error(thd, errcode,
|
||||
ER(errcode), NULL); /* purecov: inspected */
|
||||
vio_close(vio); /* vio is freed in delete thd */
|
||||
}
|
||||
if (lock)
|
||||
@ -2854,11 +2856,11 @@ static void check_data_home(const char *path)
|
||||
for the client.
|
||||
*/
|
||||
/* ARGSUSED */
|
||||
extern "C" int my_message_sql(uint error, const char *str, myf MyFlags);
|
||||
extern "C" void my_message_sql(uint error, const char *str, myf MyFlags);
|
||||
|
||||
int my_message_sql(uint error, const char *str, myf MyFlags)
|
||||
void my_message_sql(uint error, const char *str, myf MyFlags)
|
||||
{
|
||||
THD *thd;
|
||||
THD *thd= current_thd;
|
||||
DBUG_ENTER("my_message_sql");
|
||||
DBUG_PRINT("error", ("error: %u message: '%s'", error, str));
|
||||
|
||||
@ -2880,70 +2882,18 @@ int my_message_sql(uint error, const char *str, myf MyFlags)
|
||||
error= ER_UNKNOWN_ERROR;
|
||||
}
|
||||
|
||||
if ((thd= current_thd))
|
||||
if (thd)
|
||||
{
|
||||
/*
|
||||
TODO: There are two exceptions mechanism (THD and sp_rcontext),
|
||||
this could be improved by having a common stack of handlers.
|
||||
*/
|
||||
if (thd->handle_error(error, str,
|
||||
MYSQL_ERROR::WARN_LEVEL_ERROR))
|
||||
DBUG_RETURN(0);
|
||||
|
||||
thd->is_slave_error= 1; // needed to catch query errors during replication
|
||||
|
||||
/*
|
||||
thd->lex->current_select == 0 if lex structure is not inited
|
||||
(not query command (COM_QUERY))
|
||||
*/
|
||||
if (thd->lex->current_select &&
|
||||
thd->lex->current_select->no_error && !thd->is_fatal_error)
|
||||
{
|
||||
DBUG_PRINT("error",
|
||||
("Error converted to warning: current_select: no_error %d "
|
||||
"fatal_error: %d",
|
||||
(thd->lex->current_select ?
|
||||
thd->lex->current_select->no_error : 0),
|
||||
(int) thd->is_fatal_error));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (! thd->main_da.is_error()) // Return only first message
|
||||
{
|
||||
thd->main_da.set_error_status(thd, error, str);
|
||||
}
|
||||
query_cache_abort(&thd->net);
|
||||
}
|
||||
/*
|
||||
If a continue handler is found, the error message will be cleared
|
||||
by the stored procedures code.
|
||||
*/
|
||||
if (thd->spcont &&
|
||||
! (MyFlags & ME_NO_SP_HANDLER) &&
|
||||
thd->spcont->handle_error(error, MYSQL_ERROR::WARN_LEVEL_ERROR, thd))
|
||||
{
|
||||
/*
|
||||
Do not push any warnings, a handled error must be completely
|
||||
silenced.
|
||||
*/
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
if (!thd->no_warnings_for_error &&
|
||||
!(MyFlags & ME_NO_WARNING_FOR_ERROR))
|
||||
{
|
||||
/*
|
||||
Suppress infinite recursion if there a memory allocation error
|
||||
inside push_warning.
|
||||
*/
|
||||
thd->no_warnings_for_error= TRUE;
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR, error, str);
|
||||
thd->no_warnings_for_error= FALSE;
|
||||
}
|
||||
if (MyFlags & ME_FATALERROR)
|
||||
thd->is_fatal_error= 1;
|
||||
(void) thd->raise_condition(error,
|
||||
NULL,
|
||||
MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
str);
|
||||
}
|
||||
if (!thd || MyFlags & ME_NOREFRESH)
|
||||
sql_print_error("%s: %s",my_progname,str); /* purecov: inspected */
|
||||
DBUG_RETURN(0);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
@ -3107,6 +3057,7 @@ SHOW_VAR com_status_vars[]= {
|
||||
{"replace", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_REPLACE]), SHOW_LONG_STATUS},
|
||||
{"replace_select", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_REPLACE_SELECT]), SHOW_LONG_STATUS},
|
||||
{"reset", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_RESET]), SHOW_LONG_STATUS},
|
||||
{"resignal", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_RESIGNAL]), SHOW_LONG_STATUS},
|
||||
{"restore_table", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_RESTORE_TABLE]), SHOW_LONG_STATUS},
|
||||
{"revoke", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_REVOKE]), SHOW_LONG_STATUS},
|
||||
{"revoke_all", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_REVOKE_ALL]), SHOW_LONG_STATUS},
|
||||
@ -3115,6 +3066,7 @@ SHOW_VAR com_status_vars[]= {
|
||||
{"savepoint", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SAVEPOINT]), SHOW_LONG_STATUS},
|
||||
{"select", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SELECT]), SHOW_LONG_STATUS},
|
||||
{"set_option", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SET_OPTION]), SHOW_LONG_STATUS},
|
||||
{"signal", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SIGNAL]), SHOW_LONG_STATUS},
|
||||
{"show_authors", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_AUTHORS]), SHOW_LONG_STATUS},
|
||||
{"show_binlog_events", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_BINLOG_EVENTS]), SHOW_LONG_STATUS},
|
||||
{"show_binlogs", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_BINLOGS]), SHOW_LONG_STATUS},
|
||||
@ -4939,7 +4891,7 @@ void create_thread_to_handle_connection(THD *thd)
|
||||
/* Can't use my_error() since store_globals has not been called. */
|
||||
my_snprintf(error_message_buff, sizeof(error_message_buff),
|
||||
ER(ER_CANT_CREATE_THREAD), error);
|
||||
net_send_error(thd, ER_CANT_CREATE_THREAD, error_message_buff);
|
||||
net_send_error(thd, ER_CANT_CREATE_THREAD, error_message_buff, NULL);
|
||||
(void) pthread_mutex_lock(&LOCK_thread_count);
|
||||
close_connection(thd,0,0);
|
||||
delete thd;
|
||||
|
@ -28,13 +28,13 @@
|
||||
#include <stdarg.h>
|
||||
|
||||
static const unsigned int PACKET_BUFFER_EXTRA_ALLOC= 1024;
|
||||
bool net_send_error_packet(THD *, uint, const char *, const char *);
|
||||
/* Declared non-static only because of the embedded library. */
|
||||
bool net_send_error_packet(THD *thd, uint sql_errno, const char *err);
|
||||
bool net_send_ok(THD *, uint, uint, ha_rows, ulonglong, const char *);
|
||||
bool net_send_eof(THD *thd, uint server_status, uint total_warn_count);
|
||||
bool net_send_ok(THD *, uint, uint, ulonglong, ulonglong, const char *);
|
||||
/* Declared non-static only because of the embedded library. */
|
||||
bool net_send_eof(THD *thd, uint server_status, uint statement_warn_count);
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
static bool write_eof_packet(THD *thd, NET *net,
|
||||
uint server_status, uint total_warn_count);
|
||||
static bool write_eof_packet(THD *, NET *, uint, uint);
|
||||
#endif
|
||||
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
@ -80,29 +80,33 @@ bool Protocol_binary::net_store_data(const uchar *from, size_t length)
|
||||
@retval TRUE An error occurred and the message wasn't sent properly
|
||||
*/
|
||||
|
||||
bool net_send_error(THD *thd, uint sql_errno, const char *err)
|
||||
bool net_send_error(THD *thd, uint sql_errno, const char *err,
|
||||
const char* sqlstate)
|
||||
{
|
||||
DBUG_ENTER("net_send_error");
|
||||
|
||||
DBUG_ASSERT(!thd->spcont);
|
||||
DBUG_ASSERT(sql_errno);
|
||||
DBUG_ASSERT(err && err[0]);
|
||||
DBUG_ASSERT(err);
|
||||
|
||||
DBUG_PRINT("enter",("sql_errno: %d err: %s", sql_errno, err));
|
||||
bool error;
|
||||
|
||||
if (sqlstate == NULL)
|
||||
sqlstate= mysql_errno_to_sqlstate(sql_errno);
|
||||
|
||||
/*
|
||||
It's one case when we can push an error even though there
|
||||
is an OK or EOF already.
|
||||
*/
|
||||
thd->main_da.can_overwrite_status= TRUE;
|
||||
thd->stmt_da->can_overwrite_status= TRUE;
|
||||
|
||||
/* Abort multi-result sets */
|
||||
thd->server_status&= ~SERVER_MORE_RESULTS_EXISTS;
|
||||
|
||||
error= net_send_error_packet(thd, sql_errno, err);
|
||||
error= net_send_error_packet(thd, sql_errno, err, sqlstate);
|
||||
|
||||
thd->main_da.can_overwrite_status= FALSE;
|
||||
thd->stmt_da->can_overwrite_status= FALSE;
|
||||
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
@ -124,7 +128,7 @@ bool net_send_error(THD *thd, uint sql_errno, const char *err)
|
||||
|
||||
@param thd Thread handler
|
||||
@param server_status The server status
|
||||
@param total_warn_count Total number of warnings
|
||||
@param statement_warn_count Total number of warnings
|
||||
@param affected_rows Number of rows changed by statement
|
||||
@param id Auto_increment id for first row (if used)
|
||||
@param message Message to send to the client (Used by mysql_status)
|
||||
@ -138,8 +142,8 @@ bool net_send_error(THD *thd, uint sql_errno, const char *err)
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
bool
|
||||
net_send_ok(THD *thd,
|
||||
uint server_status, uint total_warn_count,
|
||||
ha_rows affected_rows, ulonglong id, const char *message)
|
||||
uint server_status, uint statement_warn_count,
|
||||
ulonglong affected_rows, ulonglong id, const char *message)
|
||||
{
|
||||
NET *net= &thd->net;
|
||||
uchar buff[MYSQL_ERRMSG_SIZE+10],*pos;
|
||||
@ -162,12 +166,12 @@ net_send_ok(THD *thd,
|
||||
(ulong) affected_rows,
|
||||
(ulong) id,
|
||||
(uint) (server_status & 0xffff),
|
||||
(uint) total_warn_count));
|
||||
(uint) statement_warn_count));
|
||||
int2store(pos, server_status);
|
||||
pos+=2;
|
||||
|
||||
/* We can only return up to 65535 warnings in two bytes */
|
||||
uint tmp= min(total_warn_count, 65535);
|
||||
uint tmp= min(statement_warn_count, 65535);
|
||||
int2store(pos, tmp);
|
||||
pos+= 2;
|
||||
}
|
||||
@ -176,7 +180,7 @@ net_send_ok(THD *thd,
|
||||
int2store(pos, server_status);
|
||||
pos+=2;
|
||||
}
|
||||
thd->main_da.can_overwrite_status= TRUE;
|
||||
thd->stmt_da->can_overwrite_status= TRUE;
|
||||
|
||||
if (message && message[0])
|
||||
pos= net_store_data(pos, (uchar*) message, strlen(message));
|
||||
@ -184,7 +188,7 @@ net_send_ok(THD *thd,
|
||||
if (!error)
|
||||
error= net_flush(net);
|
||||
|
||||
thd->main_da.can_overwrite_status= FALSE;
|
||||
thd->stmt_da->can_overwrite_status= FALSE;
|
||||
DBUG_PRINT("info", ("OK sent, so no more error sending allowed"));
|
||||
|
||||
DBUG_RETURN(error);
|
||||
@ -208,7 +212,7 @@ static uchar eof_buff[1]= { (uchar) 254 }; /* Marker for end of fields */
|
||||
|
||||
@param thd Thread handler
|
||||
@param server_status The server status
|
||||
@param total_warn_count Total number of warnings
|
||||
@param statement_warn_count Total number of warnings
|
||||
|
||||
@return
|
||||
@retval FALSE The message was successfully sent
|
||||
@ -216,7 +220,7 @@ static uchar eof_buff[1]= { (uchar) 254 }; /* Marker for end of fields */
|
||||
*/
|
||||
|
||||
bool
|
||||
net_send_eof(THD *thd, uint server_status, uint total_warn_count)
|
||||
net_send_eof(THD *thd, uint server_status, uint statement_warn_count)
|
||||
{
|
||||
NET *net= &thd->net;
|
||||
bool error= FALSE;
|
||||
@ -224,11 +228,11 @@ net_send_eof(THD *thd, uint server_status, uint total_warn_count)
|
||||
/* Set to TRUE if no active vio, to work well in case of --init-file */
|
||||
if (net->vio != 0)
|
||||
{
|
||||
thd->main_da.can_overwrite_status= TRUE;
|
||||
error= write_eof_packet(thd, net, server_status, total_warn_count);
|
||||
thd->stmt_da->can_overwrite_status= TRUE;
|
||||
error= write_eof_packet(thd, net, server_status, statement_warn_count);
|
||||
if (!error)
|
||||
error= net_flush(net);
|
||||
thd->main_da.can_overwrite_status= FALSE;
|
||||
thd->stmt_da->can_overwrite_status= FALSE;
|
||||
DBUG_PRINT("info", ("EOF sent, so no more error sending allowed"));
|
||||
}
|
||||
DBUG_RETURN(error);
|
||||
@ -242,7 +246,7 @@ net_send_eof(THD *thd, uint server_status, uint total_warn_count)
|
||||
@param thd The thread handler
|
||||
@param net The network handler
|
||||
@param server_status The server status
|
||||
@param total_warn_count The number of warnings
|
||||
@param statement_warn_count The number of warnings
|
||||
|
||||
|
||||
@return
|
||||
@ -252,7 +256,7 @@ net_send_eof(THD *thd, uint server_status, uint total_warn_count)
|
||||
|
||||
static bool write_eof_packet(THD *thd, NET *net,
|
||||
uint server_status,
|
||||
uint total_warn_count)
|
||||
uint statement_warn_count)
|
||||
{
|
||||
bool error;
|
||||
if (thd->client_capabilities & CLIENT_PROTOCOL_41)
|
||||
@ -262,7 +266,7 @@ static bool write_eof_packet(THD *thd, NET *net,
|
||||
Don't send warn count during SP execution, as the warn_list
|
||||
is cleared between substatements, and mysqltest gets confused
|
||||
*/
|
||||
uint tmp= min(total_warn_count, 65535);
|
||||
uint tmp= min(statement_warn_count, 65535);
|
||||
buff[0]= 254;
|
||||
int2store(buff+1, tmp);
|
||||
/*
|
||||
@ -309,7 +313,9 @@ bool send_old_password_request(THD *thd)
|
||||
@retval TRUE An error occurred and the messages wasn't sent properly
|
||||
*/
|
||||
|
||||
bool net_send_error_packet(THD *thd, uint sql_errno, const char *err)
|
||||
bool net_send_error_packet(THD *thd, uint sql_errno, const char *err,
|
||||
const char* sqlstate)
|
||||
|
||||
{
|
||||
NET *net= &thd->net;
|
||||
uint length;
|
||||
@ -338,7 +344,7 @@ bool net_send_error_packet(THD *thd, uint sql_errno, const char *err)
|
||||
{
|
||||
/* The first # is to make the protocol backward compatible */
|
||||
buff[2]= '#';
|
||||
pos= (uchar*) strmov((char*) buff+3, mysql_errno_to_sqlstate(sql_errno));
|
||||
pos= (uchar*) strmov((char*) buff+3, sqlstate);
|
||||
}
|
||||
length= (uint) (strmake((char*) pos, err, MYSQL_ERRMSG_SIZE-1) -
|
||||
(char*) buff);
|
||||
@ -430,45 +436,45 @@ static uchar *net_store_length_fast(uchar *packet, uint length)
|
||||
|
||||
void net_end_statement(THD *thd)
|
||||
{
|
||||
DBUG_ASSERT(! thd->main_da.is_sent);
|
||||
DBUG_ASSERT(! thd->stmt_da->is_sent);
|
||||
|
||||
/* Can not be true, but do not take chances in production. */
|
||||
if (thd->main_da.is_sent)
|
||||
if (thd->stmt_da->is_sent)
|
||||
return;
|
||||
|
||||
bool error= FALSE;
|
||||
|
||||
switch (thd->main_da.status()) {
|
||||
switch (thd->stmt_da->status()) {
|
||||
case Diagnostics_area::DA_ERROR:
|
||||
/* The query failed, send error to log and abort bootstrap. */
|
||||
error= net_send_error(thd,
|
||||
thd->main_da.sql_errno(),
|
||||
thd->main_da.message());
|
||||
thd->stmt_da->sql_errno(),
|
||||
thd->stmt_da->message(),
|
||||
thd->stmt_da->get_sqlstate());
|
||||
break;
|
||||
case Diagnostics_area::DA_EOF:
|
||||
error= net_send_eof(thd,
|
||||
thd->main_da.server_status(),
|
||||
thd->main_da.total_warn_count());
|
||||
thd->stmt_da->server_status(),
|
||||
thd->stmt_da->statement_warn_count());
|
||||
break;
|
||||
case Diagnostics_area::DA_OK:
|
||||
error= net_send_ok(thd,
|
||||
thd->main_da.server_status(),
|
||||
thd->main_da.total_warn_count(),
|
||||
thd->main_da.affected_rows(),
|
||||
thd->main_da.last_insert_id(),
|
||||
thd->main_da.message());
|
||||
thd->stmt_da->server_status(),
|
||||
thd->stmt_da->statement_warn_count(),
|
||||
thd->stmt_da->affected_rows(),
|
||||
thd->stmt_da->last_insert_id(),
|
||||
thd->stmt_da->message());
|
||||
break;
|
||||
case Diagnostics_area::DA_DISABLED:
|
||||
break;
|
||||
case Diagnostics_area::DA_EMPTY:
|
||||
default:
|
||||
DBUG_ASSERT(0);
|
||||
error= net_send_ok(thd, thd->server_status, thd->total_warn_count,
|
||||
0, 0, NULL);
|
||||
error= net_send_ok(thd, thd->server_status, 0, 0, 0, NULL);
|
||||
break;
|
||||
}
|
||||
if (!error)
|
||||
thd->main_da.is_sent= TRUE;
|
||||
thd->stmt_da->is_sent= TRUE;
|
||||
}
|
||||
|
||||
|
||||
@ -711,7 +717,8 @@ bool Protocol::send_fields(List<Item> *list, uint flags)
|
||||
to show that there is no cursor.
|
||||
Send no warning information, as it will be sent at statement end.
|
||||
*/
|
||||
write_eof_packet(thd, &thd->net, thd->server_status, thd->total_warn_count);
|
||||
write_eof_packet(thd, &thd->net, thd->server_status,
|
||||
thd->warning_info->statement_warn_count());
|
||||
}
|
||||
DBUG_RETURN(prepare_for_send(list));
|
||||
|
||||
|
@ -17,6 +17,7 @@
|
||||
#pragma interface /* gcc class implementation */
|
||||
#endif
|
||||
|
||||
#include "sql_error.h"
|
||||
|
||||
class i_string;
|
||||
class THD;
|
||||
@ -173,7 +174,8 @@ public:
|
||||
};
|
||||
|
||||
void send_warning(THD *thd, uint sql_errno, const char *err=0);
|
||||
bool net_send_error(THD *thd, uint sql_errno=0, const char *err=0);
|
||||
bool net_send_error(THD *thd, uint sql_errno, const char *err,
|
||||
const char* sqlstate);
|
||||
void net_end_statement(THD *thd);
|
||||
bool send_old_password_request(THD *thd);
|
||||
uchar *net_store_data(uchar *to,const uchar *from, size_t length);
|
||||
|
@ -913,7 +913,7 @@ bool load_master_data(THD* thd)
|
||||
goto err;
|
||||
}
|
||||
/* Clear the result of mysql_create_db(). */
|
||||
thd->main_da.reset_diagnostics_area();
|
||||
thd->stmt_da->reset_diagnostics_area();
|
||||
|
||||
if (mysql_select_db(&mysql, db) ||
|
||||
mysql_real_query(&mysql, STRING_WITH_LEN("SHOW TABLES")) ||
|
||||
|
@ -183,7 +183,7 @@ int init_relay_log_info(Relay_log_info* rli,
|
||||
{
|
||||
sql_print_error("Failed to create a new relay log info file (\
|
||||
file '%s', errno %d)", fname, my_errno);
|
||||
msg= current_thd->main_da.message();
|
||||
msg= current_thd->stmt_da->message();
|
||||
goto err;
|
||||
}
|
||||
if (init_io_cache(&rli->info_file, info_fd, IO_SIZE*2, READ_CACHE, 0L,0,
|
||||
@ -191,7 +191,7 @@ file '%s', errno %d)", fname, my_errno);
|
||||
{
|
||||
sql_print_error("Failed to create a cache on relay log info file '%s'",
|
||||
fname);
|
||||
msg= current_thd->main_da.message();
|
||||
msg= current_thd->stmt_da->message();
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
@ -3132,17 +3132,13 @@ static int check_pseudo_thread_id(THD *thd, set_var *var)
|
||||
|
||||
static uchar *get_warning_count(THD *thd)
|
||||
{
|
||||
thd->sys_var_tmp.long_value=
|
||||
(thd->warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_NOTE] +
|
||||
thd->warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_ERROR] +
|
||||
thd->warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_WARN]);
|
||||
thd->sys_var_tmp.long_value= thd->warning_info->warn_count();
|
||||
return (uchar*) &thd->sys_var_tmp.long_value;
|
||||
}
|
||||
|
||||
static uchar *get_error_count(THD *thd)
|
||||
{
|
||||
thd->sys_var_tmp.long_value=
|
||||
thd->warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_ERROR];
|
||||
thd->sys_var_tmp.long_value= thd->warning_info->error_count();
|
||||
return (uchar*) &thd->sys_var_tmp.long_value;
|
||||
}
|
||||
|
||||
|
@ -4879,13 +4879,7 @@ ER_ZLIB_Z_DATA_ERROR
|
||||
por "ZLIB: Dados de entrada está corrupto"
|
||||
spa "ZLIB: Dato de entrada fué corrompido para zlib"
|
||||
ER_CUT_VALUE_GROUP_CONCAT
|
||||
eng "%d line(s) were cut by GROUP_CONCAT()"
|
||||
ger "%d Zeile(n) durch GROUP_CONCAT() abgeschnitten"
|
||||
nla "%d regel(s) door GROUP_CONCAT() ingekort"
|
||||
por "%d linha(s) foram cortada(s) por GROUP_CONCAT()"
|
||||
spa "%d línea(s) fue(fueron) cortadas por group_concat()"
|
||||
swe "%d rad(er) kapades av group_concat()"
|
||||
ukr "%d line(s) was(were) cut by group_concat()"
|
||||
eng "Row %u was cut by GROUP_CONCAT()"
|
||||
ER_WARN_TOO_FEW_RECORDS 01000
|
||||
eng "Row %ld doesn't contain data for all columns"
|
||||
ger "Zeile %ld enthält nicht für alle Felder Daten"
|
||||
@ -6206,3 +6200,31 @@ ER_TOO_MANY_CONCURRENT_TRXS
|
||||
|
||||
WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED
|
||||
eng "Non-ASCII separator arguments are not fully supported"
|
||||
|
||||
ER_DUP_SIGNAL_SET 42000
|
||||
eng "Duplicate condition information item '%s'"
|
||||
|
||||
# Note that the SQLSTATE is not 01000, it is provided by SIGNAL/RESIGNAL
|
||||
ER_SIGNAL_WARN 01000
|
||||
eng "Unhandled user-defined warning condition"
|
||||
|
||||
# Note that the SQLSTATE is not 02000, it is provided by SIGNAL/RESIGNAL
|
||||
ER_SIGNAL_NOT_FOUND 02000
|
||||
eng "Unhandled user-defined not found condition"
|
||||
|
||||
# Note that the SQLSTATE is not HY000, it is provided by SIGNAL/RESIGNAL
|
||||
ER_SIGNAL_EXCEPTION HY000
|
||||
eng "Unhandled user-defined exception condition"
|
||||
|
||||
ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER 0K000
|
||||
eng "RESIGNAL when handler not active"
|
||||
|
||||
ER_SIGNAL_BAD_CONDITION_TYPE
|
||||
eng "SIGNAL/RESIGNAL can only use a CONDITION defined with SQLSTATE"
|
||||
|
||||
WARN_COND_ITEM_TRUNCATED
|
||||
eng "Data truncated for condition item '%s'"
|
||||
|
||||
ER_COND_ITEM_TOO_LONG
|
||||
eng "Data too long for condition item '%s'"
|
||||
|
||||
|
41
sql/slave.cc
41
sql/slave.cc
@ -1274,7 +1274,7 @@ static int create_table_from_dump(THD* thd, MYSQL *mysql, const char* db,
|
||||
else
|
||||
{
|
||||
/* Clear the OK result of mysql_rm_table(). */
|
||||
thd->main_da.reset_diagnostics_area();
|
||||
thd->stmt_da->reset_diagnostics_area();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1297,7 +1297,7 @@ static int create_table_from_dump(THD* thd, MYSQL *mysql, const char* db,
|
||||
goto err; // mysql_parse took care of the error send
|
||||
|
||||
thd_proc_info(thd, "Opening master dump table");
|
||||
thd->main_da.reset_diagnostics_area(); /* cleanup from CREATE_TABLE */
|
||||
thd->stmt_da->reset_diagnostics_area(); /* cleanup from CREATE_TABLE */
|
||||
/*
|
||||
Note: If this function starts to fail for MERGE tables,
|
||||
change the next two lines to these:
|
||||
@ -2011,7 +2011,7 @@ static int has_temporary_error(THD *thd)
|
||||
DBUG_ENTER("has_temporary_error");
|
||||
|
||||
DBUG_EXECUTE_IF("all_errors_are_temporary_errors",
|
||||
if (thd->main_da.is_error())
|
||||
if (thd->stmt_da->is_error())
|
||||
{
|
||||
thd->clear_error();
|
||||
my_error(ER_LOCK_DEADLOCK, MYF(0));
|
||||
@ -2030,20 +2030,21 @@ static int has_temporary_error(THD *thd)
|
||||
currently, InnoDB deadlock detected by InnoDB or lock
|
||||
wait timeout (innodb_lock_wait_timeout exceeded
|
||||
*/
|
||||
if (thd->main_da.sql_errno() == ER_LOCK_DEADLOCK ||
|
||||
thd->main_da.sql_errno() == ER_LOCK_WAIT_TIMEOUT)
|
||||
if (thd->stmt_da->sql_errno() == ER_LOCK_DEADLOCK ||
|
||||
thd->stmt_da->sql_errno() == ER_LOCK_WAIT_TIMEOUT)
|
||||
DBUG_RETURN(1);
|
||||
|
||||
#ifdef HAVE_NDB_BINLOG
|
||||
/*
|
||||
currently temporary error set in ndbcluster
|
||||
*/
|
||||
List_iterator_fast<MYSQL_ERROR> it(thd->warn_list);
|
||||
List_iterator_fast<MYSQL_ERROR> it(thd->warning_info->warn_list());
|
||||
MYSQL_ERROR *err;
|
||||
while ((err= it++))
|
||||
{
|
||||
DBUG_PRINT("info", ("has warning %d %s", err->code, err->msg));
|
||||
switch (err->code)
|
||||
DBUG_PRINT("info", ("has condition %d %s", err->get_sql_errno(),
|
||||
err->get_message_text()));
|
||||
switch (err->get_sql_errno())
|
||||
{
|
||||
case ER_GET_TEMPORARY_ERRMSG:
|
||||
DBUG_RETURN(1);
|
||||
@ -2977,9 +2978,9 @@ log '%s' at position %s, relay log '%s' position: %s", RPL_LOG_NAME,
|
||||
|
||||
if (check_temp_dir(rli->slave_patternload_file))
|
||||
{
|
||||
rli->report(ERROR_LEVEL, thd->main_da.sql_errno(),
|
||||
rli->report(ERROR_LEVEL, thd->stmt_da->sql_errno(),
|
||||
"Unable to use slave's temporary directory %s - %s",
|
||||
slave_load_tmpdir, thd->main_da.message());
|
||||
slave_load_tmpdir, thd->stmt_da->message());
|
||||
goto err;
|
||||
}
|
||||
|
||||
@ -2989,7 +2990,7 @@ log '%s' at position %s, relay log '%s' position: %s", RPL_LOG_NAME,
|
||||
execute_init_command(thd, &sys_init_slave, &LOCK_sys_init_slave);
|
||||
if (thd->is_slave_error)
|
||||
{
|
||||
rli->report(ERROR_LEVEL, thd->main_da.sql_errno(),
|
||||
rli->report(ERROR_LEVEL, thd->stmt_da->sql_errno(),
|
||||
"Slave SQL thread aborted. Can't execute init_slave query");
|
||||
goto err;
|
||||
}
|
||||
@ -3033,20 +3034,20 @@ log '%s' at position %s, relay log '%s' position: %s", RPL_LOG_NAME,
|
||||
|
||||
if (thd->is_error())
|
||||
{
|
||||
char const *const errmsg= thd->main_da.message();
|
||||
char const *const errmsg= thd->stmt_da->message();
|
||||
|
||||
DBUG_PRINT("info",
|
||||
("thd->main_da.sql_errno()=%d; rli->last_error.number=%d",
|
||||
thd->main_da.sql_errno(), last_errno));
|
||||
("thd->stmt_da->sql_errno()=%d; rli->last_error.number=%d",
|
||||
thd->stmt_da->sql_errno(), last_errno));
|
||||
if (last_errno == 0)
|
||||
{
|
||||
/*
|
||||
This function is reporting an error which was not reported
|
||||
while executing exec_relay_log_event().
|
||||
*/
|
||||
rli->report(ERROR_LEVEL, thd->main_da.sql_errno(), errmsg);
|
||||
rli->report(ERROR_LEVEL, thd->stmt_da->sql_errno(), errmsg);
|
||||
}
|
||||
else if (last_errno != thd->main_da.sql_errno())
|
||||
else if (last_errno != thd->stmt_da->sql_errno())
|
||||
{
|
||||
/*
|
||||
* An error was reported while executing exec_relay_log_event()
|
||||
@ -3055,12 +3056,12 @@ log '%s' at position %s, relay log '%s' position: %s", RPL_LOG_NAME,
|
||||
* what caused the problem.
|
||||
*/
|
||||
sql_print_error("Slave (additional info): %s Error_code: %d",
|
||||
errmsg, thd->main_da.sql_errno());
|
||||
errmsg, thd->stmt_da->sql_errno());
|
||||
}
|
||||
}
|
||||
|
||||
/* Print any warnings issued */
|
||||
List_iterator_fast<MYSQL_ERROR> it(thd->warn_list);
|
||||
List_iterator_fast<MYSQL_ERROR> it(thd->warning_info->warn_list());
|
||||
MYSQL_ERROR *err;
|
||||
/*
|
||||
Added controlled slave thread cancel for replication
|
||||
@ -3069,9 +3070,9 @@ log '%s' at position %s, relay log '%s' position: %s", RPL_LOG_NAME,
|
||||
bool udf_error = false;
|
||||
while ((err= it++))
|
||||
{
|
||||
if (err->code == ER_CANT_OPEN_LIBRARY)
|
||||
if (err->get_sql_errno() == ER_CANT_OPEN_LIBRARY)
|
||||
udf_error = true;
|
||||
sql_print_warning("Slave: %s Error_code: %d",err->msg, err->code);
|
||||
sql_print_warning("Slave: %s Error_code: %d", err->get_message_text(), err->get_sql_errno());
|
||||
}
|
||||
if (udf_error)
|
||||
sql_print_error("Error loading user-defined library, slave SQL "
|
||||
|
22
sql/sp.cc
22
sql/sp.cc
@ -522,16 +522,24 @@ db_find_routine(THD *thd, int type, sp_name *name, sp_head **sphp)
|
||||
struct Silence_deprecated_warning : public Internal_error_handler
|
||||
{
|
||||
public:
|
||||
virtual bool handle_error(uint sql_errno, const char *message,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
THD *thd);
|
||||
virtual bool handle_condition(THD *thd,
|
||||
uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl);
|
||||
};
|
||||
|
||||
bool
|
||||
Silence_deprecated_warning::handle_error(uint sql_errno, const char *message,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
THD *thd)
|
||||
Silence_deprecated_warning::handle_condition(
|
||||
THD *,
|
||||
uint sql_errno,
|
||||
const char*,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char*,
|
||||
MYSQL_ERROR ** cond_hdl)
|
||||
{
|
||||
*cond_hdl= NULL;
|
||||
if (sql_errno == ER_WARN_DEPRECATED_SYNTAX &&
|
||||
level == MYSQL_ERROR::WARN_LEVEL_WARN)
|
||||
return TRUE;
|
||||
@ -1336,7 +1344,7 @@ sp_exist_routines(THD *thd, TABLE_LIST *routines, bool any)
|
||||
&thd->sp_proc_cache, FALSE) != NULL ||
|
||||
sp_find_routine(thd, TYPE_ENUM_FUNCTION, name,
|
||||
&thd->sp_func_cache, FALSE) != NULL;
|
||||
mysql_reset_errors(thd, TRUE);
|
||||
thd->warning_info->clear_warning_info(thd->query_id);
|
||||
if (sp_object_found)
|
||||
{
|
||||
if (any)
|
||||
|
@ -1083,6 +1083,7 @@ sp_head::execute(THD *thd)
|
||||
Reprepare_observer *save_reprepare_observer= thd->m_reprepare_observer;
|
||||
|
||||
Object_creation_ctx *saved_creation_ctx;
|
||||
Warning_info *saved_warning_info, warning_info(thd->warning_info->warn_id());
|
||||
|
||||
/* Use some extra margin for possible SP recursion and functions */
|
||||
if (check_stack_overrun(thd, 8 * STACK_MIN_SIZE, (uchar*)&old_packet))
|
||||
@ -1131,6 +1132,11 @@ sp_head::execute(THD *thd)
|
||||
thd->is_slave_error= 0;
|
||||
old_arena= thd->stmt_arena;
|
||||
|
||||
/* Push a new warning information area. */
|
||||
warning_info.append_warning_info(thd, thd->warning_info);
|
||||
saved_warning_info= thd->warning_info;
|
||||
thd->warning_info= &warning_info;
|
||||
|
||||
/*
|
||||
Switch query context. This has to be done early as this is sometimes
|
||||
allocated trough sql_alloc
|
||||
@ -1278,29 +1284,33 @@ sp_head::execute(THD *thd)
|
||||
*/
|
||||
if (ctx)
|
||||
{
|
||||
uint hf;
|
||||
uint handler_index;
|
||||
|
||||
switch (ctx->found_handler(&hip, &hf)) {
|
||||
switch (ctx->found_handler(& hip, & handler_index)) {
|
||||
case SP_HANDLER_NONE:
|
||||
break;
|
||||
case SP_HANDLER_CONTINUE:
|
||||
thd->restore_active_arena(&execute_arena, &backup_arena);
|
||||
thd->set_n_backup_active_arena(&execute_arena, &backup_arena);
|
||||
ctx->push_hstack(i->get_cont_dest());
|
||||
// Fall through
|
||||
/* Fall through */
|
||||
default:
|
||||
if (ctx->end_partial_result_set)
|
||||
thd->protocol->end_partial_result_set(thd);
|
||||
ip= hip;
|
||||
err_status= FALSE;
|
||||
ctx->clear_handler();
|
||||
ctx->enter_handler(hip);
|
||||
ctx->enter_handler(hip, handler_index);
|
||||
thd->clear_error();
|
||||
thd->is_fatal_error= 0;
|
||||
thd->killed= THD::NOT_KILLED;
|
||||
thd->mysys_var->abort= 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
ctx->end_partial_result_set= FALSE;
|
||||
}
|
||||
} while (!err_status && !thd->killed);
|
||||
} while (!err_status && !thd->killed && !thd->is_fatal_error);
|
||||
|
||||
#if defined(ENABLED_PROFILING) && defined(COMMUNITY_SERVER)
|
||||
thd->profiling.finish_current_query();
|
||||
@ -1334,6 +1344,10 @@ sp_head::execute(THD *thd)
|
||||
thd->stmt_arena= old_arena;
|
||||
state= EXECUTED;
|
||||
|
||||
/* Restore the caller's original warning information area. */
|
||||
saved_warning_info->merge_with_routine_info(thd, thd->warning_info);
|
||||
thd->warning_info= saved_warning_info;
|
||||
|
||||
done:
|
||||
DBUG_PRINT("info", ("err_status: %d killed: %d is_slave_error: %d report_error: %d",
|
||||
err_status, thd->killed, thd->is_slave_error,
|
||||
@ -2523,7 +2537,8 @@ void sp_head::optimize()
|
||||
else
|
||||
{
|
||||
if (src != dst)
|
||||
{ // Move the instruction and update prev. jumps
|
||||
{
|
||||
/* Move the instruction and update prev. jumps */
|
||||
sp_instr *ibp;
|
||||
List_iterator_fast<sp_instr> li(bp);
|
||||
|
||||
@ -2848,7 +2863,7 @@ sp_instr_stmt::execute(THD *thd, uint *nextp)
|
||||
{
|
||||
res= m_lex_keeper.reset_lex_and_exec_core(thd, nextp, FALSE, this);
|
||||
|
||||
if (thd->main_da.is_eof())
|
||||
if (thd->stmt_da->is_eof())
|
||||
net_end_statement(thd);
|
||||
|
||||
query_cache_end_of_result(thd);
|
||||
@ -2862,7 +2877,7 @@ sp_instr_stmt::execute(THD *thd, uint *nextp)
|
||||
thd->query_name_consts= 0;
|
||||
|
||||
if (!thd->is_error())
|
||||
thd->main_da.reset_diagnostics_area();
|
||||
thd->stmt_da->reset_diagnostics_area();
|
||||
}
|
||||
DBUG_RETURN(res || thd->is_error());
|
||||
}
|
||||
@ -3238,7 +3253,7 @@ sp_instr_hpush_jump::execute(THD *thd, uint *nextp)
|
||||
sp_cond_type_t *p;
|
||||
|
||||
while ((p= li++))
|
||||
thd->spcont->push_handler(p, m_ip+1, m_type, m_frame);
|
||||
thd->spcont->push_handler(p, m_ip+1, m_type);
|
||||
|
||||
*nextp= m_dest;
|
||||
DBUG_RETURN(0);
|
||||
|
@ -51,7 +51,8 @@ sp_cond_check(LEX_STRING *sqlstate)
|
||||
(c < 'A' || 'Z' < c))
|
||||
return FALSE;
|
||||
}
|
||||
if (strcmp(sqlstate->str, "00000") == 0)
|
||||
/* SQLSTATE class '00' : completion condition */
|
||||
if (strncmp(sqlstate->str, "00", 2) == 0)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -71,7 +71,7 @@ typedef struct sp_label
|
||||
typedef struct sp_cond_type
|
||||
{
|
||||
enum { number, state, warning, notfound, exception } type;
|
||||
char sqlstate[6];
|
||||
char sqlstate[SQLSTATE_LENGTH+1];
|
||||
uint mysqlerr;
|
||||
} sp_cond_type_t;
|
||||
|
||||
|
@ -32,7 +32,8 @@
|
||||
sp_rcontext::sp_rcontext(sp_pcontext *root_parsing_ctx,
|
||||
Field *return_value_fld,
|
||||
sp_rcontext *prev_runtime_ctx)
|
||||
:m_root_parsing_ctx(root_parsing_ctx),
|
||||
:end_partial_result_set(FALSE),
|
||||
m_root_parsing_ctx(root_parsing_ctx),
|
||||
m_var_table(0),
|
||||
m_var_items(0),
|
||||
m_return_value_fld(return_value_fld),
|
||||
@ -68,21 +69,28 @@ sp_rcontext::~sp_rcontext()
|
||||
|
||||
bool sp_rcontext::init(THD *thd)
|
||||
{
|
||||
uint handler_count= m_root_parsing_ctx->max_handler_index();
|
||||
uint i;
|
||||
|
||||
in_sub_stmt= thd->in_sub_stmt;
|
||||
|
||||
if (init_var_table(thd) || init_var_items())
|
||||
return TRUE;
|
||||
|
||||
if (!(m_raised_conditions= new (thd->mem_root) MYSQL_ERROR[handler_count]))
|
||||
return TRUE;
|
||||
|
||||
for (i= 0; i<handler_count; i++)
|
||||
m_raised_conditions[i].init(thd->mem_root);
|
||||
|
||||
return
|
||||
!(m_handler=
|
||||
(sp_handler_t*)thd->alloc(m_root_parsing_ctx->max_handler_index() *
|
||||
sizeof(sp_handler_t))) ||
|
||||
(sp_handler_t*)thd->alloc(handler_count * sizeof(sp_handler_t))) ||
|
||||
!(m_hstack=
|
||||
(uint*)thd->alloc(m_root_parsing_ctx->max_handler_index() *
|
||||
sizeof(uint))) ||
|
||||
(uint*)thd->alloc(handler_count * sizeof(uint))) ||
|
||||
!(m_in_handler=
|
||||
(uint*)thd->alloc(m_root_parsing_ctx->max_handler_index() *
|
||||
sizeof(uint))) ||
|
||||
(sp_active_handler_t*)thd->alloc(handler_count *
|
||||
sizeof(sp_active_handler_t))) ||
|
||||
!(m_cstack=
|
||||
(sp_cursor**)thd->alloc(m_root_parsing_ctx->max_cursor_index() *
|
||||
sizeof(sp_cursor*))) ||
|
||||
@ -194,13 +202,19 @@ sp_rcontext::set_return_value(THD *thd, Item **return_value_item)
|
||||
*/
|
||||
|
||||
bool
|
||||
sp_rcontext::find_handler(THD *thd, uint sql_errno,
|
||||
MYSQL_ERROR::enum_warning_level level)
|
||||
sp_rcontext::find_handler(THD *thd,
|
||||
uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl)
|
||||
{
|
||||
if (m_hfound >= 0)
|
||||
return 1; // Already got one
|
||||
{
|
||||
*cond_hdl= NULL;
|
||||
return TRUE; // Already got one
|
||||
}
|
||||
|
||||
const char *sqlstate= mysql_errno_to_sqlstate(sql_errno);
|
||||
int i= m_hcount, found= -1;
|
||||
|
||||
/*
|
||||
@ -220,7 +234,7 @@ sp_rcontext::find_handler(THD *thd, uint sql_errno,
|
||||
|
||||
/* Check active handlers, to avoid invoking one recursively */
|
||||
while (j--)
|
||||
if (m_in_handler[j] == m_handler[i].handler)
|
||||
if (m_in_handler[j].ip == m_handler[i].handler)
|
||||
break;
|
||||
if (j >= 0)
|
||||
continue; // Already executing this handler
|
||||
@ -264,10 +278,26 @@ sp_rcontext::find_handler(THD *thd, uint sql_errno,
|
||||
*/
|
||||
if (m_prev_runtime_ctx && IS_EXCEPTION_CONDITION(sqlstate) &&
|
||||
level == MYSQL_ERROR::WARN_LEVEL_ERROR)
|
||||
return m_prev_runtime_ctx->find_handler(thd, sql_errno, level);
|
||||
return m_prev_runtime_ctx->find_handler(thd,
|
||||
sql_errno,
|
||||
sqlstate,
|
||||
level,
|
||||
msg,
|
||||
cond_hdl);
|
||||
*cond_hdl= NULL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
m_hfound= found;
|
||||
|
||||
MYSQL_ERROR *raised= NULL;
|
||||
DBUG_ASSERT(m_hfound >= 0);
|
||||
DBUG_ASSERT((uint) m_hfound < m_root_parsing_ctx->max_handler_index());
|
||||
raised= & m_raised_conditions[m_hfound];
|
||||
raised->clear();
|
||||
raised->set(sql_errno, sqlstate, level, msg);
|
||||
|
||||
*cond_hdl= raised;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -293,9 +323,12 @@ sp_rcontext::find_handler(THD *thd, uint sql_errno,
|
||||
FALSE if no handler was found.
|
||||
*/
|
||||
bool
|
||||
sp_rcontext::handle_error(uint sql_errno,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
THD *thd)
|
||||
sp_rcontext::handle_condition(THD *thd,
|
||||
uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl)
|
||||
{
|
||||
MYSQL_ERROR::enum_warning_level elevated_level= level;
|
||||
|
||||
@ -308,7 +341,7 @@ sp_rcontext::handle_error(uint sql_errno,
|
||||
elevated_level= MYSQL_ERROR::WARN_LEVEL_ERROR;
|
||||
}
|
||||
|
||||
return find_handler(thd, sql_errno, elevated_level);
|
||||
return find_handler(thd, sql_errno, sqlstate, elevated_level, msg, cond_hdl);
|
||||
}
|
||||
|
||||
void
|
||||
@ -335,7 +368,7 @@ sp_rcontext::pop_cursors(uint count)
|
||||
}
|
||||
|
||||
void
|
||||
sp_rcontext::push_handler(struct sp_cond_type *cond, uint h, int type, uint f)
|
||||
sp_rcontext::push_handler(struct sp_cond_type *cond, uint h, int type)
|
||||
{
|
||||
DBUG_ENTER("sp_rcontext::push_handler");
|
||||
DBUG_ASSERT(m_hcount < m_root_parsing_ctx->max_handler_index());
|
||||
@ -343,7 +376,6 @@ sp_rcontext::push_handler(struct sp_cond_type *cond, uint h, int type, uint f)
|
||||
m_handler[m_hcount].cond= cond;
|
||||
m_handler[m_hcount].handler= h;
|
||||
m_handler[m_hcount].type= type;
|
||||
m_handler[m_hcount].foffset= f;
|
||||
m_hcount+= 1;
|
||||
|
||||
DBUG_PRINT("info", ("m_hcount: %d", m_hcount));
|
||||
@ -382,11 +414,13 @@ sp_rcontext::pop_hstack()
|
||||
}
|
||||
|
||||
void
|
||||
sp_rcontext::enter_handler(int hid)
|
||||
sp_rcontext::enter_handler(uint hip, uint hindex)
|
||||
{
|
||||
DBUG_ENTER("sp_rcontext::enter_handler");
|
||||
DBUG_ASSERT(m_ihsp < m_root_parsing_ctx->max_handler_index());
|
||||
m_in_handler[m_ihsp++]= hid;
|
||||
m_in_handler[m_ihsp].ip= hip;
|
||||
m_in_handler[m_ihsp].index= hindex;
|
||||
m_ihsp++;
|
||||
DBUG_PRINT("info", ("m_ihsp: %d", m_ihsp));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
@ -396,11 +430,29 @@ sp_rcontext::exit_handler()
|
||||
{
|
||||
DBUG_ENTER("sp_rcontext::exit_handler");
|
||||
DBUG_ASSERT(m_ihsp);
|
||||
uint hindex= m_in_handler[m_ihsp-1].index;
|
||||
m_raised_conditions[hindex].clear();
|
||||
m_ihsp-= 1;
|
||||
DBUG_PRINT("info", ("m_ihsp: %d", m_ihsp));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
MYSQL_ERROR*
|
||||
sp_rcontext::raised_condition() const
|
||||
{
|
||||
if (m_ihsp > 0)
|
||||
{
|
||||
uint hindex= m_in_handler[m_ihsp - 1].index;
|
||||
MYSQL_ERROR *raised= & m_raised_conditions[hindex];
|
||||
return raised;
|
||||
}
|
||||
|
||||
if (m_prev_runtime_ctx)
|
||||
return m_prev_runtime_ctx->raised_condition();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
sp_rcontext::set_variable(THD *thd, uint var_idx, Item **value)
|
||||
|
@ -34,12 +34,21 @@ class sp_instr_cpush;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/** Condition caught by this HANDLER. */
|
||||
struct sp_cond_type *cond;
|
||||
uint handler; // Location of handler
|
||||
/** Location (instruction pointer) of the handler code. */
|
||||
uint handler;
|
||||
/** Handler type (EXIT, CONTINUE). */
|
||||
int type;
|
||||
uint foffset; // Frame offset for the handlers declare level
|
||||
} sp_handler_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/** Instruction pointer of the active handler. */
|
||||
uint ip;
|
||||
/** Handler index of the active handler. */
|
||||
uint index;
|
||||
} sp_active_handler_t;
|
||||
|
||||
/*
|
||||
This class is a runtime context of a Stored Routine. It is used in an
|
||||
@ -75,6 +84,13 @@ class sp_rcontext : public Sql_alloc
|
||||
*/
|
||||
Query_arena *callers_arena;
|
||||
|
||||
/*
|
||||
End a open result set before start executing a continue/exit
|
||||
handler if one is found as otherwise the client will hang
|
||||
due to a violation of the client/server protocol.
|
||||
*/
|
||||
bool end_partial_result_set;
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
/*
|
||||
The routine for which this runtime context is created. Used for checking
|
||||
@ -107,31 +123,41 @@ class sp_rcontext : public Sql_alloc
|
||||
return m_return_value_set;
|
||||
}
|
||||
|
||||
void push_handler(struct sp_cond_type *cond, uint h, int type, uint f);
|
||||
void push_handler(struct sp_cond_type *cond, uint h, int type);
|
||||
|
||||
void pop_handlers(uint count);
|
||||
|
||||
// Returns 1 if a handler was found, 0 otherwise.
|
||||
bool
|
||||
find_handler(THD *thd, uint sql_errno,MYSQL_ERROR::enum_warning_level level);
|
||||
find_handler(THD *thd,
|
||||
uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl);
|
||||
|
||||
// If there is an error handler for this error, handle it and return TRUE.
|
||||
bool
|
||||
handle_error(uint sql_errno,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
THD *thd);
|
||||
handle_condition(THD *thd,
|
||||
uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl);
|
||||
|
||||
// Returns handler type and sets *ip to location if one was found
|
||||
inline int
|
||||
found_handler(uint *ip, uint *fp)
|
||||
found_handler(uint *ip, uint *index)
|
||||
{
|
||||
if (m_hfound < 0)
|
||||
return SP_HANDLER_NONE;
|
||||
*ip= m_handler[m_hfound].handler;
|
||||
*fp= m_handler[m_hfound].foffset;
|
||||
*index= m_hfound;
|
||||
return m_handler[m_hfound].type;
|
||||
}
|
||||
|
||||
MYSQL_ERROR* raised_condition() const;
|
||||
|
||||
// Returns true if we found a handler in this context
|
||||
inline bool
|
||||
found_handler_here()
|
||||
@ -150,7 +176,12 @@ class sp_rcontext : public Sql_alloc
|
||||
|
||||
uint pop_hstack();
|
||||
|
||||
void enter_handler(int hid);
|
||||
/**
|
||||
Enter a SQL exception handler.
|
||||
@param hip the handler instruction pointer
|
||||
@param index the handler index
|
||||
*/
|
||||
void enter_handler(uint hip, uint index);
|
||||
|
||||
void exit_handler();
|
||||
|
||||
@ -214,10 +245,18 @@ private:
|
||||
bool in_sub_stmt;
|
||||
|
||||
sp_handler_t *m_handler; // Visible handlers
|
||||
|
||||
/**
|
||||
SQL conditions caught by each handler.
|
||||
This is an array indexed by handler index.
|
||||
*/
|
||||
MYSQL_ERROR *m_raised_conditions;
|
||||
|
||||
uint m_hcount; // Stack pointer for m_handler
|
||||
uint *m_hstack; // Return stack for continue handlers
|
||||
uint m_hsp; // Stack pointer for m_hstack
|
||||
uint *m_in_handler; // Active handler, for recursion check
|
||||
/** Active handler stack. */
|
||||
sp_active_handler_t *m_in_handler;
|
||||
uint m_ihsp; // Stack pointer for m_in_handler
|
||||
int m_hfound; // Set by find_handler; -1 if not found
|
||||
|
||||
|
@ -702,7 +702,7 @@ my_bool acl_reload(THD *thd)
|
||||
if (simple_open_n_lock_tables(thd, tables))
|
||||
{
|
||||
sql_print_error("Fatal error: Can't open and lock privilege tables: %s",
|
||||
thd->main_da.message());
|
||||
thd->stmt_da->message());
|
||||
goto end;
|
||||
}
|
||||
|
||||
@ -6036,9 +6036,12 @@ public:
|
||||
virtual ~Silence_routine_definer_errors()
|
||||
{}
|
||||
|
||||
virtual bool handle_error(uint sql_errno, const char *message,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
THD *thd);
|
||||
virtual bool handle_condition(THD *thd,
|
||||
uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl);
|
||||
|
||||
bool has_errors() { return is_grave; }
|
||||
|
||||
@ -6047,18 +6050,23 @@ private:
|
||||
};
|
||||
|
||||
bool
|
||||
Silence_routine_definer_errors::handle_error(uint sql_errno,
|
||||
const char *message,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
THD *thd)
|
||||
Silence_routine_definer_errors::handle_condition(
|
||||
THD *thd,
|
||||
uint sql_errno,
|
||||
const char*,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl)
|
||||
{
|
||||
*cond_hdl= NULL;
|
||||
if (level == MYSQL_ERROR::WARN_LEVEL_ERROR)
|
||||
{
|
||||
switch (sql_errno)
|
||||
{
|
||||
case ER_NONEXISTING_PROC_GRANT:
|
||||
/* Convert the error into a warning. */
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, sql_errno, message);
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
sql_errno, msg);
|
||||
return TRUE;
|
||||
default:
|
||||
is_grave= TRUE;
|
||||
|
@ -44,9 +44,12 @@ public:
|
||||
|
||||
virtual ~Prelock_error_handler() {}
|
||||
|
||||
virtual bool handle_error(uint sql_errno, const char *message,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
THD *thd);
|
||||
virtual bool handle_condition(THD *thd,
|
||||
uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl);
|
||||
|
||||
bool safely_trapped_errors();
|
||||
|
||||
@ -57,11 +60,14 @@ private:
|
||||
|
||||
|
||||
bool
|
||||
Prelock_error_handler::handle_error(uint sql_errno,
|
||||
const char * /* message */,
|
||||
MYSQL_ERROR::enum_warning_level /* level */,
|
||||
THD * /* thd */)
|
||||
Prelock_error_handler::handle_condition(THD *,
|
||||
uint sql_errno,
|
||||
const char*,
|
||||
MYSQL_ERROR::enum_warning_level,
|
||||
const char*,
|
||||
MYSQL_ERROR ** cond_hdl)
|
||||
{
|
||||
*cond_hdl= NULL;
|
||||
if (sql_errno == ER_NO_SUCH_TABLE)
|
||||
{
|
||||
m_handled_errors++;
|
||||
@ -473,7 +479,7 @@ static TABLE_SHARE
|
||||
|
||||
@todo Rework alternative ways to deal with ER_NO_SUCH TABLE.
|
||||
*/
|
||||
if (share || (thd->is_error() && thd->main_da.sql_errno() != ER_NO_SUCH_TABLE))
|
||||
if (share || (thd->is_error() && thd->stmt_da->sql_errno() != ER_NO_SUCH_TABLE))
|
||||
|
||||
DBUG_RETURN(share);
|
||||
|
||||
@ -520,7 +526,7 @@ static TABLE_SHARE
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
/* Table existed in engine. Let's open it */
|
||||
mysql_reset_errors(thd, 1); // Clear warnings
|
||||
thd->warning_info->clear_warning_info(thd->query_id);
|
||||
thd->clear_error(); // Clear error message
|
||||
DBUG_RETURN(get_table_share(thd, table_list, key, key_length,
|
||||
db_flags, error));
|
||||
@ -1281,9 +1287,9 @@ void close_thread_tables(THD *thd)
|
||||
*/
|
||||
if (!(thd->state_flags & Open_tables_state::BACKUPS_AVAIL))
|
||||
{
|
||||
thd->main_da.can_overwrite_status= TRUE;
|
||||
thd->stmt_da->can_overwrite_status= TRUE;
|
||||
ha_autocommit_or_rollback(thd, thd->is_error());
|
||||
thd->main_da.can_overwrite_status= FALSE;
|
||||
thd->stmt_da->can_overwrite_status= FALSE;
|
||||
|
||||
/*
|
||||
Reset transaction state, but only if we're not inside a
|
||||
@ -3943,7 +3949,7 @@ retry:
|
||||
release_table_share(share, RELEASE_WAIT_FOR_DROP);
|
||||
if (!thd->killed)
|
||||
{
|
||||
mysql_reset_errors(thd, 1); // Clear warnings
|
||||
thd->warning_info->clear_warning_info(thd->query_id);
|
||||
thd->clear_error(); // Clear error message
|
||||
goto retry;
|
||||
}
|
||||
|
@ -934,7 +934,7 @@ void query_cache_end_of_result(THD *thd)
|
||||
DBUG_VOID_RETURN;
|
||||
|
||||
/* Ensure that only complete results are cached. */
|
||||
DBUG_ASSERT(thd->main_da.is_eof());
|
||||
DBUG_ASSERT(thd->stmt_da->is_eof());
|
||||
|
||||
if (thd->killed)
|
||||
{
|
||||
@ -1626,7 +1626,7 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d",
|
||||
|
||||
thd->limit_found_rows = query->found_rows();
|
||||
thd->status_var.last_query_cost= 0.0;
|
||||
thd->main_da.disable_status();
|
||||
thd->stmt_da->disable_status();
|
||||
|
||||
BLOCK_UNLOCK_RD(query_block);
|
||||
MYSQL_QUERY_CACHE_HIT(thd->query, (ulong) thd->limit_found_rows);
|
||||
|
398
sql/sql_class.cc
398
sql/sql_class.cc
@ -1,4 +1,4 @@
|
||||
/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
|
||||
/* Copyright (C) 2000-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -199,19 +199,6 @@ bool foreign_key_prefix(Key *a, Key *b)
|
||||
** Thread specific functions
|
||||
****************************************************************************/
|
||||
|
||||
/** Push an error to the error stack and return TRUE for now. */
|
||||
|
||||
bool
|
||||
Reprepare_observer::report_error(THD *thd)
|
||||
{
|
||||
my_error(ER_NEED_REPREPARE, MYF(ME_NO_WARNING_FOR_ERROR|ME_NO_SP_HANDLER));
|
||||
|
||||
m_invalidated= TRUE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
Open_tables_state::Open_tables_state(ulong version_arg)
|
||||
:version(version_arg), state_flags(0U)
|
||||
{
|
||||
@ -304,7 +291,7 @@ int thd_tx_isolation(const THD *thd)
|
||||
extern "C"
|
||||
void thd_inc_row_count(THD *thd)
|
||||
{
|
||||
thd->row_count++;
|
||||
thd->warning_info->inc_current_row_for_warning();
|
||||
}
|
||||
|
||||
|
||||
@ -399,139 +386,6 @@ char *thd_security_context(THD *thd, char *buffer, unsigned int length,
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
Clear this diagnostics area.
|
||||
|
||||
Normally called at the end of a statement.
|
||||
*/
|
||||
|
||||
void
|
||||
Diagnostics_area::reset_diagnostics_area()
|
||||
{
|
||||
#ifdef DBUG_OFF
|
||||
can_overwrite_status= FALSE;
|
||||
/** Don't take chances in production */
|
||||
m_message[0]= '\0';
|
||||
m_sql_errno= 0;
|
||||
m_server_status= 0;
|
||||
m_affected_rows= 0;
|
||||
m_last_insert_id= 0;
|
||||
m_total_warn_count= 0;
|
||||
#endif
|
||||
is_sent= FALSE;
|
||||
/** Tiny reset in debug mode to see garbage right away */
|
||||
m_status= DA_EMPTY;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Set OK status -- ends commands that do not return a
|
||||
result set, e.g. INSERT/UPDATE/DELETE.
|
||||
*/
|
||||
|
||||
void
|
||||
Diagnostics_area::set_ok_status(THD *thd, ha_rows affected_rows_arg,
|
||||
ulonglong last_insert_id_arg,
|
||||
const char *message_arg)
|
||||
{
|
||||
DBUG_ASSERT(! is_set());
|
||||
#ifdef DBUG_OFF
|
||||
/*
|
||||
In production, refuse to overwrite an error or a custom response
|
||||
with an OK packet.
|
||||
*/
|
||||
if (is_error() || is_disabled())
|
||||
return;
|
||||
#endif
|
||||
/** Only allowed to report success if has not yet reported an error */
|
||||
|
||||
m_server_status= thd->server_status;
|
||||
m_total_warn_count= thd->total_warn_count;
|
||||
m_affected_rows= affected_rows_arg;
|
||||
m_last_insert_id= last_insert_id_arg;
|
||||
if (message_arg)
|
||||
strmake(m_message, message_arg, sizeof(m_message) - 1);
|
||||
else
|
||||
m_message[0]= '\0';
|
||||
m_status= DA_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Set EOF status.
|
||||
*/
|
||||
|
||||
void
|
||||
Diagnostics_area::set_eof_status(THD *thd)
|
||||
{
|
||||
/** Only allowed to report eof if has not yet reported an error */
|
||||
|
||||
DBUG_ASSERT(! is_set());
|
||||
#ifdef DBUG_OFF
|
||||
/*
|
||||
In production, refuse to overwrite an error or a custom response
|
||||
with an EOF packet.
|
||||
*/
|
||||
if (is_error() || is_disabled())
|
||||
return;
|
||||
#endif
|
||||
|
||||
m_server_status= thd->server_status;
|
||||
/*
|
||||
If inside a stored procedure, do not return the total
|
||||
number of warnings, since they are not available to the client
|
||||
anyway.
|
||||
*/
|
||||
m_total_warn_count= thd->spcont ? 0 : thd->total_warn_count;
|
||||
|
||||
m_status= DA_EOF;
|
||||
}
|
||||
|
||||
/**
|
||||
Set ERROR status.
|
||||
*/
|
||||
|
||||
void
|
||||
Diagnostics_area::set_error_status(THD *thd, uint sql_errno_arg,
|
||||
const char *message_arg)
|
||||
{
|
||||
/*
|
||||
Only allowed to report error if has not yet reported a success
|
||||
The only exception is when we flush the message to the client,
|
||||
an error can happen during the flush.
|
||||
*/
|
||||
DBUG_ASSERT(! is_set() || can_overwrite_status);
|
||||
#ifdef DBUG_OFF
|
||||
/*
|
||||
In production, refuse to overwrite a custom response with an
|
||||
ERROR packet.
|
||||
*/
|
||||
if (is_disabled())
|
||||
return;
|
||||
#endif
|
||||
|
||||
m_sql_errno= sql_errno_arg;
|
||||
strmake(m_message, message_arg, sizeof(m_message) - 1);
|
||||
|
||||
m_status= DA_ERROR;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Mark the diagnostics area as 'DISABLED'.
|
||||
|
||||
This is used in rare cases when the COM_ command at hand sends a response
|
||||
in a custom format. One example is the query cache, another is
|
||||
COM_STMT_PREPARE.
|
||||
*/
|
||||
|
||||
void
|
||||
Diagnostics_area::disable_status()
|
||||
{
|
||||
DBUG_ASSERT(! is_set());
|
||||
m_status= DA_DISABLED;
|
||||
}
|
||||
|
||||
|
||||
THD::THD()
|
||||
:Statement(&main_lex, &main_mem_root, CONVENTIONAL_EXECUTION,
|
||||
@ -548,6 +402,8 @@ THD::THD()
|
||||
first_successful_insert_id_in_cur_stmt(0),
|
||||
stmt_depends_on_first_successful_insert_id_in_prev_stmt(FALSE),
|
||||
examined_row_count(0),
|
||||
warning_info(&main_warning_info),
|
||||
stmt_da(&main_da),
|
||||
global_read_lock(0),
|
||||
is_fatal_error(0),
|
||||
transaction_rollback_request(0),
|
||||
@ -558,7 +414,8 @@ THD::THD()
|
||||
bootstrap(0),
|
||||
derived_tables_processing(FALSE),
|
||||
spcont(NULL),
|
||||
m_parser_state(NULL)
|
||||
m_parser_state(NULL),
|
||||
main_warning_info(0)
|
||||
{
|
||||
ulong tmp;
|
||||
|
||||
@ -582,7 +439,8 @@ THD::THD()
|
||||
hash_clear(&handler_tables_hash);
|
||||
tmp_table=0;
|
||||
used_tables=0;
|
||||
cuted_fields= sent_row_count= row_count= 0L;
|
||||
cuted_fields= 0L;
|
||||
sent_row_count= 0L;
|
||||
limit_found_rows= 0;
|
||||
row_count_func= -1;
|
||||
statement_id_counter= 0UL;
|
||||
@ -602,7 +460,6 @@ THD::THD()
|
||||
file_id = 0;
|
||||
query_id= 0;
|
||||
query_name_consts= 0;
|
||||
warn_id= 0;
|
||||
db_charset= global_system_variables.collation_database;
|
||||
bzero(ha_data, sizeof(ha_data));
|
||||
mysys_var=0;
|
||||
@ -638,8 +495,6 @@ THD::THD()
|
||||
*scramble= '\0';
|
||||
|
||||
init();
|
||||
/* Initialize sub structures */
|
||||
init_sql_alloc(&warn_root, WARN_ALLOC_BLOCK_SIZE, WARN_ALLOC_PREALLOC_SIZE);
|
||||
#if defined(ENABLED_PROFILING) && defined(COMMUNITY_SERVER)
|
||||
profiling.set_thd(this);
|
||||
#endif
|
||||
@ -687,19 +542,27 @@ void THD::push_internal_handler(Internal_error_handler *handler)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool THD::handle_error(uint sql_errno, const char *message,
|
||||
MYSQL_ERROR::enum_warning_level level)
|
||||
bool THD::handle_condition(uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl)
|
||||
{
|
||||
if (!m_internal_handler)
|
||||
{
|
||||
*cond_hdl= NULL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
for (Internal_error_handler *error_handler= m_internal_handler;
|
||||
error_handler;
|
||||
error_handler= m_internal_handler->m_prev_internal_handler)
|
||||
{
|
||||
if (error_handler->handle_error(sql_errno, message, level, this))
|
||||
return TRUE;
|
||||
if (error_handler-> handle_condition(this, sql_errno, sqlstate, level, msg,
|
||||
cond_hdl))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
@ -712,6 +575,207 @@ void THD::pop_internal_handler()
|
||||
m_internal_handler= m_internal_handler->m_prev_internal_handler;
|
||||
}
|
||||
|
||||
|
||||
void THD::raise_error(uint sql_errno)
|
||||
{
|
||||
const char* msg= ER(sql_errno);
|
||||
(void) raise_condition(sql_errno,
|
||||
NULL,
|
||||
MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
msg);
|
||||
}
|
||||
|
||||
void THD::raise_error_printf(uint sql_errno, ...)
|
||||
{
|
||||
va_list args;
|
||||
char ebuff[MYSQL_ERRMSG_SIZE];
|
||||
DBUG_ENTER("THD::raise_error_printf");
|
||||
DBUG_PRINT("my", ("nr: %d errno: %d", sql_errno, errno));
|
||||
const char* format= ER(sql_errno);
|
||||
va_start(args, sql_errno);
|
||||
my_vsnprintf(ebuff, sizeof(ebuff), format, args);
|
||||
va_end(args);
|
||||
(void) raise_condition(sql_errno,
|
||||
NULL,
|
||||
MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
ebuff);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
void THD::raise_warning(uint sql_errno)
|
||||
{
|
||||
const char* msg= ER(sql_errno);
|
||||
(void) raise_condition(sql_errno,
|
||||
NULL,
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
msg);
|
||||
}
|
||||
|
||||
void THD::raise_warning_printf(uint sql_errno, ...)
|
||||
{
|
||||
va_list args;
|
||||
char ebuff[MYSQL_ERRMSG_SIZE];
|
||||
DBUG_ENTER("THD::raise_warning_printf");
|
||||
DBUG_PRINT("enter", ("warning: %u", sql_errno));
|
||||
const char* format= ER(sql_errno);
|
||||
va_start(args, sql_errno);
|
||||
my_vsnprintf(ebuff, sizeof(ebuff), format, args);
|
||||
va_end(args);
|
||||
(void) raise_condition(sql_errno,
|
||||
NULL,
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ebuff);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
void THD::raise_note(uint sql_errno)
|
||||
{
|
||||
DBUG_ENTER("THD::raise_note");
|
||||
DBUG_PRINT("enter", ("code: %d", sql_errno));
|
||||
if (!(this->options & OPTION_SQL_NOTES))
|
||||
DBUG_VOID_RETURN;
|
||||
const char* msg= ER(sql_errno);
|
||||
(void) raise_condition(sql_errno,
|
||||
NULL,
|
||||
MYSQL_ERROR::WARN_LEVEL_NOTE,
|
||||
msg);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
void THD::raise_note_printf(uint sql_errno, ...)
|
||||
{
|
||||
va_list args;
|
||||
char ebuff[MYSQL_ERRMSG_SIZE];
|
||||
DBUG_ENTER("THD::raise_note_printf");
|
||||
DBUG_PRINT("enter",("code: %u", sql_errno));
|
||||
if (!(this->options & OPTION_SQL_NOTES))
|
||||
DBUG_VOID_RETURN;
|
||||
const char* format= ER(sql_errno);
|
||||
va_start(args, sql_errno);
|
||||
my_vsnprintf(ebuff, sizeof(ebuff), format, args);
|
||||
va_end(args);
|
||||
(void) raise_condition(sql_errno,
|
||||
NULL,
|
||||
MYSQL_ERROR::WARN_LEVEL_NOTE,
|
||||
ebuff);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
MYSQL_ERROR* THD::raise_condition(uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg)
|
||||
{
|
||||
MYSQL_ERROR *cond= NULL;
|
||||
DBUG_ENTER("THD::raise_condition");
|
||||
|
||||
if (!(this->options & OPTION_SQL_NOTES) &&
|
||||
(level == MYSQL_ERROR::WARN_LEVEL_NOTE))
|
||||
DBUG_RETURN(NULL);
|
||||
|
||||
warning_info->opt_clear_warning_info(query_id);
|
||||
|
||||
/*
|
||||
TODO: replace by DBUG_ASSERT(sql_errno != 0) once all bugs similar to
|
||||
Bug#36768 are fixed: a SQL condition must have a real (!=0) error number
|
||||
so that it can be caught by handlers.
|
||||
*/
|
||||
if (sql_errno == 0)
|
||||
sql_errno= ER_UNKNOWN_ERROR;
|
||||
if (msg == NULL)
|
||||
msg= ER(sql_errno);
|
||||
if (sqlstate == NULL)
|
||||
sqlstate= mysql_errno_to_sqlstate(sql_errno);
|
||||
|
||||
if ((level == MYSQL_ERROR::WARN_LEVEL_WARN) &&
|
||||
really_abort_on_warning())
|
||||
{
|
||||
/*
|
||||
FIXME:
|
||||
push_warning and strict SQL_MODE case.
|
||||
*/
|
||||
level= MYSQL_ERROR::WARN_LEVEL_ERROR;
|
||||
killed= THD::KILL_BAD_DATA;
|
||||
}
|
||||
|
||||
switch (level)
|
||||
{
|
||||
case MYSQL_ERROR::WARN_LEVEL_NOTE:
|
||||
case MYSQL_ERROR::WARN_LEVEL_WARN:
|
||||
got_warning= 1;
|
||||
break;
|
||||
case MYSQL_ERROR::WARN_LEVEL_ERROR:
|
||||
break;
|
||||
default:
|
||||
DBUG_ASSERT(FALSE);
|
||||
}
|
||||
|
||||
if (handle_condition(sql_errno, sqlstate, level, msg, &cond))
|
||||
DBUG_RETURN(cond);
|
||||
|
||||
if (level == MYSQL_ERROR::WARN_LEVEL_ERROR)
|
||||
{
|
||||
is_slave_error= 1; // needed to catch query errors during replication
|
||||
|
||||
/*
|
||||
thd->lex->current_select == 0 if lex structure is not inited
|
||||
(not query command (COM_QUERY))
|
||||
*/
|
||||
if (lex->current_select &&
|
||||
lex->current_select->no_error && !is_fatal_error)
|
||||
{
|
||||
DBUG_PRINT("error",
|
||||
("Error converted to warning: current_select: no_error %d "
|
||||
"fatal_error: %d",
|
||||
(lex->current_select ?
|
||||
lex->current_select->no_error : 0),
|
||||
(int) is_fatal_error));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (! stmt_da->is_error())
|
||||
stmt_da->set_error_status(this, sql_errno, msg, sqlstate);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
If a continue handler is found, the error message will be cleared
|
||||
by the stored procedures code.
|
||||
*/
|
||||
if (!is_fatal_error && spcont &&
|
||||
spcont->handle_condition(this, sql_errno, sqlstate, level, msg, &cond))
|
||||
{
|
||||
/*
|
||||
Do not push any warnings, a handled error must be completely
|
||||
silenced.
|
||||
*/
|
||||
DBUG_RETURN(cond);
|
||||
}
|
||||
|
||||
/* Un-handled conditions */
|
||||
|
||||
cond= raise_condition_no_handler(sql_errno, sqlstate, level, msg);
|
||||
DBUG_RETURN(cond);
|
||||
}
|
||||
|
||||
MYSQL_ERROR*
|
||||
THD::raise_condition_no_handler(uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg)
|
||||
{
|
||||
MYSQL_ERROR *cond= NULL;
|
||||
DBUG_ENTER("THD::raise_condition_no_handler");
|
||||
|
||||
query_cache_abort(& net);
|
||||
|
||||
/* FIXME: broken special case */
|
||||
if (no_warnings_for_error && (level == MYSQL_ERROR::WARN_LEVEL_ERROR))
|
||||
DBUG_RETURN(NULL);
|
||||
|
||||
cond= warning_info->push_warning(this, sql_errno, sqlstate, level, msg);
|
||||
DBUG_RETURN(cond);
|
||||
}
|
||||
extern "C"
|
||||
void *thd_alloc(MYSQL_THD thd, unsigned int size)
|
||||
{
|
||||
@ -800,9 +864,6 @@ void THD::init(void)
|
||||
TL_WRITE_LOW_PRIORITY :
|
||||
TL_WRITE);
|
||||
session_tx_isolation= (enum_tx_isolation) variables.tx_isolation;
|
||||
warn_list.empty();
|
||||
bzero((char*) warn_count, sizeof(warn_count));
|
||||
total_warn_count= 0;
|
||||
update_charset();
|
||||
reset_current_stmt_binlog_row_based();
|
||||
bzero((char *) &status_var, sizeof(status_var));
|
||||
@ -940,7 +1001,6 @@ THD::~THD()
|
||||
DBUG_PRINT("info", ("freeing security context"));
|
||||
main_security_ctx.destroy();
|
||||
safeFree(db);
|
||||
free_root(&warn_root,MYF(0));
|
||||
#ifdef USING_TRANSACTIONS
|
||||
free_root(&transaction.mem_root,MYF(0));
|
||||
#endif
|
||||
@ -1543,21 +1603,19 @@ bool select_send::send_fields(List<Item> &list, uint flags)
|
||||
void select_send::abort()
|
||||
{
|
||||
DBUG_ENTER("select_send::abort");
|
||||
if (is_result_set_started && thd->spcont &&
|
||||
thd->spcont->find_handler(thd, thd->main_da.sql_errno(),
|
||||
MYSQL_ERROR::WARN_LEVEL_ERROR))
|
||||
|
||||
if (is_result_set_started && thd->spcont)
|
||||
{
|
||||
/*
|
||||
We're executing a stored procedure, have an open result
|
||||
set, an SQL exception condition and a handler for it.
|
||||
In this situation we must abort the current statement,
|
||||
silence the error and start executing the continue/exit
|
||||
handler.
|
||||
set and an SQL exception condition. In this situation we
|
||||
must abort the current statement, silence the error and
|
||||
start executing the continue/exit handler if one is found.
|
||||
Before aborting the statement, let's end the open result set, as
|
||||
otherwise the client will hang due to the violation of the
|
||||
client/server protocol.
|
||||
*/
|
||||
thd->protocol->end_partial_result_set(thd);
|
||||
thd->spcont->end_partial_result_set= TRUE;
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
349
sql/sql_class.h
349
sql/sql_class.h
@ -1,4 +1,4 @@
|
||||
/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
|
||||
/* Copyright (C) 2000-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -265,6 +265,41 @@ public:
|
||||
LEX_COLUMN (const String& x,const uint& y ): column (x),rights (y) {}
|
||||
};
|
||||
|
||||
/* SIGNAL / RESIGNAL / GET DIAGNOSTICS */
|
||||
|
||||
/**
|
||||
This enumeration list all the condition item names of a condition in the
|
||||
SQL condition area.
|
||||
*/
|
||||
typedef enum enum_diag_condition_item_name
|
||||
{
|
||||
/*
|
||||
Conditions that can be set by the user (SIGNAL/RESIGNAL),
|
||||
and by the server implementation.
|
||||
*/
|
||||
|
||||
DIAG_CLASS_ORIGIN= 0,
|
||||
FIRST_DIAG_SET_PROPERTY= DIAG_CLASS_ORIGIN,
|
||||
DIAG_SUBCLASS_ORIGIN= 1,
|
||||
DIAG_CONSTRAINT_CATALOG= 2,
|
||||
DIAG_CONSTRAINT_SCHEMA= 3,
|
||||
DIAG_CONSTRAINT_NAME= 4,
|
||||
DIAG_CATALOG_NAME= 5,
|
||||
DIAG_SCHEMA_NAME= 6,
|
||||
DIAG_TABLE_NAME= 7,
|
||||
DIAG_COLUMN_NAME= 8,
|
||||
DIAG_CURSOR_NAME= 9,
|
||||
DIAG_MESSAGE_TEXT= 10,
|
||||
DIAG_MYSQL_ERRNO= 11,
|
||||
LAST_DIAG_SET_PROPERTY= DIAG_MYSQL_ERRNO
|
||||
} Diag_condition_item_name;
|
||||
|
||||
/**
|
||||
Name of each diagnostic condition item.
|
||||
This array is indexed by Diag_condition_item_name.
|
||||
*/
|
||||
extern const LEX_STRING Diag_condition_item_names[];
|
||||
|
||||
#include "sql_lex.h" /* Must be here */
|
||||
|
||||
class Delayed_insert;
|
||||
@ -1038,12 +1073,12 @@ protected:
|
||||
|
||||
public:
|
||||
/**
|
||||
Handle an error condition.
|
||||
Handle a sql condition.
|
||||
This method can be implemented by a subclass to achieve any of the
|
||||
following:
|
||||
- mask an error internally, prevent exposing it to the user,
|
||||
- mask an error and throw another one instead.
|
||||
When this method returns true, the error condition is considered
|
||||
- mask a warning/error internally, prevent exposing it to the user,
|
||||
- mask a warning/error and throw another one instead.
|
||||
When this method returns true, the sql condition is considered
|
||||
'handled', and will not be propagated to upper layers.
|
||||
It is the responsability of the code installing an internal handler
|
||||
to then check for trapped conditions, and implement logic to recover
|
||||
@ -1057,15 +1092,17 @@ public:
|
||||
before removing it from the exception stack with
|
||||
<code>THD::pop_internal_handler()</code>.
|
||||
|
||||
@param sql_errno the error number
|
||||
@param level the error level
|
||||
@param thd the calling thread
|
||||
@return true if the error is handled
|
||||
@param cond the condition raised.
|
||||
@return true if the condition is handled
|
||||
*/
|
||||
virtual bool handle_error(uint sql_errno,
|
||||
const char *message,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
THD *thd) = 0;
|
||||
virtual bool handle_condition(THD *thd,
|
||||
uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl) = 0;
|
||||
|
||||
private:
|
||||
Internal_error_handler *m_prev_internal_handler;
|
||||
friend class THD;
|
||||
@ -1080,10 +1117,12 @@ private:
|
||||
class Dummy_error_handler : public Internal_error_handler
|
||||
{
|
||||
public:
|
||||
bool handle_error(uint sql_errno,
|
||||
const char *message,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
THD *thd)
|
||||
bool handle_condition(THD *thd,
|
||||
uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl)
|
||||
{
|
||||
/* Ignore error */
|
||||
return TRUE;
|
||||
@ -1091,123 +1130,6 @@ public:
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Stores status of the currently executed statement.
|
||||
Cleared at the beginning of the statement, and then
|
||||
can hold either OK, ERROR, or EOF status.
|
||||
Can not be assigned twice per statement.
|
||||
*/
|
||||
|
||||
class Diagnostics_area
|
||||
{
|
||||
public:
|
||||
enum enum_diagnostics_status
|
||||
{
|
||||
/** The area is cleared at start of a statement. */
|
||||
DA_EMPTY= 0,
|
||||
/** Set whenever one calls my_ok(). */
|
||||
DA_OK,
|
||||
/** Set whenever one calls my_eof(). */
|
||||
DA_EOF,
|
||||
/** Set whenever one calls my_error() or my_message(). */
|
||||
DA_ERROR,
|
||||
/** Set in case of a custom response, such as one from COM_STMT_PREPARE. */
|
||||
DA_DISABLED
|
||||
};
|
||||
/** True if status information is sent to the client. */
|
||||
bool is_sent;
|
||||
/** Set to make set_error_status after set_{ok,eof}_status possible. */
|
||||
bool can_overwrite_status;
|
||||
|
||||
void set_ok_status(THD *thd, ha_rows affected_rows_arg,
|
||||
ulonglong last_insert_id_arg,
|
||||
const char *message);
|
||||
void set_eof_status(THD *thd);
|
||||
void set_error_status(THD *thd, uint sql_errno_arg, const char *message_arg);
|
||||
|
||||
void disable_status();
|
||||
|
||||
void reset_diagnostics_area();
|
||||
|
||||
bool is_set() const { return m_status != DA_EMPTY; }
|
||||
bool is_error() const { return m_status == DA_ERROR; }
|
||||
bool is_eof() const { return m_status == DA_EOF; }
|
||||
bool is_ok() const { return m_status == DA_OK; }
|
||||
bool is_disabled() const { return m_status == DA_DISABLED; }
|
||||
enum_diagnostics_status status() const { return m_status; }
|
||||
|
||||
const char *message() const
|
||||
{ DBUG_ASSERT(m_status == DA_ERROR || m_status == DA_OK); return m_message; }
|
||||
|
||||
uint sql_errno() const
|
||||
{ DBUG_ASSERT(m_status == DA_ERROR); return m_sql_errno; }
|
||||
|
||||
uint server_status() const
|
||||
{
|
||||
DBUG_ASSERT(m_status == DA_OK || m_status == DA_EOF);
|
||||
return m_server_status;
|
||||
}
|
||||
|
||||
ha_rows affected_rows() const
|
||||
{ DBUG_ASSERT(m_status == DA_OK); return m_affected_rows; }
|
||||
|
||||
ulonglong last_insert_id() const
|
||||
{ DBUG_ASSERT(m_status == DA_OK); return m_last_insert_id; }
|
||||
|
||||
uint total_warn_count() const
|
||||
{
|
||||
DBUG_ASSERT(m_status == DA_OK || m_status == DA_EOF);
|
||||
return m_total_warn_count;
|
||||
}
|
||||
|
||||
Diagnostics_area() { reset_diagnostics_area(); }
|
||||
|
||||
private:
|
||||
/** Message buffer. Can be used by OK or ERROR status. */
|
||||
char m_message[MYSQL_ERRMSG_SIZE];
|
||||
/**
|
||||
SQL error number. One of ER_ codes from share/errmsg.txt.
|
||||
Set by set_error_status.
|
||||
*/
|
||||
uint m_sql_errno;
|
||||
|
||||
/**
|
||||
Copied from thd->server_status when the diagnostics area is assigned.
|
||||
We need this member as some places in the code use the following pattern:
|
||||
thd->server_status|= ...
|
||||
my_eof(thd);
|
||||
thd->server_status&= ~...
|
||||
Assigned by OK, EOF or ERROR.
|
||||
*/
|
||||
uint m_server_status;
|
||||
/**
|
||||
The number of rows affected by the last statement. This is
|
||||
semantically close to thd->row_count_func, but has a different
|
||||
life cycle. thd->row_count_func stores the value returned by
|
||||
function ROW_COUNT() and is cleared only by statements that
|
||||
update its value, such as INSERT, UPDATE, DELETE and few others.
|
||||
This member is cleared at the beginning of the next statement.
|
||||
|
||||
We could possibly merge the two, but life cycle of thd->row_count_func
|
||||
can not be changed.
|
||||
*/
|
||||
ha_rows m_affected_rows;
|
||||
/**
|
||||
Similarly to the previous member, this is a replacement of
|
||||
thd->first_successful_insert_id_in_prev_stmt, which is used
|
||||
to implement LAST_INSERT_ID().
|
||||
*/
|
||||
ulonglong m_last_insert_id;
|
||||
/** The total number of warnings. */
|
||||
uint m_total_warn_count;
|
||||
enum_diagnostics_status m_status;
|
||||
/**
|
||||
@todo: the following THD members belong here:
|
||||
- warn_list, warn_count,
|
||||
*/
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Storage engine specific thread local data.
|
||||
*/
|
||||
@ -1234,6 +1156,7 @@ struct Ha_data
|
||||
Ha_data() :ha_ptr(NULL) {}
|
||||
};
|
||||
|
||||
extern "C" void my_message_sql(uint error, const char *str, myf MyFlags);
|
||||
|
||||
/**
|
||||
@class THD
|
||||
@ -1276,7 +1199,6 @@ public:
|
||||
struct st_mysql_stmt *current_stmt;
|
||||
#endif
|
||||
NET net; // client connection descriptor
|
||||
MEM_ROOT warn_root; // For warnings and errors
|
||||
Protocol *protocol; // Current protocol
|
||||
Protocol_text protocol_text; // Normal protocol
|
||||
Protocol_binary protocol_binary; // Binary protocol
|
||||
@ -1692,16 +1614,8 @@ public:
|
||||
table_map used_tables;
|
||||
USER_CONN *user_connect;
|
||||
CHARSET_INFO *db_charset;
|
||||
/*
|
||||
FIXME: this, and some other variables like 'count_cuted_fields'
|
||||
maybe should be statement/cursor local, that is, moved to Statement
|
||||
class. With current implementation warnings produced in each prepared
|
||||
statement/cursor settle here.
|
||||
*/
|
||||
List <MYSQL_ERROR> warn_list;
|
||||
uint warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_END];
|
||||
uint total_warn_count;
|
||||
Diagnostics_area main_da;
|
||||
Warning_info *warning_info;
|
||||
Diagnostics_area *stmt_da;
|
||||
#if defined(ENABLED_PROFILING) && defined(COMMUNITY_SERVER)
|
||||
PROFILING profiling;
|
||||
#endif
|
||||
@ -1714,7 +1628,7 @@ public:
|
||||
from table are necessary for this select, to check if it's necessary to
|
||||
update auto-updatable fields (like auto_increment and timestamp).
|
||||
*/
|
||||
query_id_t query_id, warn_id;
|
||||
query_id_t query_id;
|
||||
ulong col_access;
|
||||
|
||||
#ifdef ERROR_INJECT_SUPPORT
|
||||
@ -1723,11 +1637,6 @@ public:
|
||||
/* Statement id is thread-wide. This counter is used to generate ids */
|
||||
ulong statement_id_counter;
|
||||
ulong rand_saved_seed1, rand_saved_seed2;
|
||||
/*
|
||||
Row counter, mainly for errors and warnings. Not increased in
|
||||
create_sort_index(); may differ from examined_row_count.
|
||||
*/
|
||||
ulong row_count;
|
||||
pthread_t real_id; /* For debugging */
|
||||
my_thread_id thread_id;
|
||||
uint tmp_table, global_read_lock;
|
||||
@ -2031,8 +1940,8 @@ public:
|
||||
inline void clear_error()
|
||||
{
|
||||
DBUG_ENTER("clear_error");
|
||||
if (main_da.is_error())
|
||||
main_da.reset_diagnostics_area();
|
||||
if (stmt_da->is_error())
|
||||
stmt_da->reset_diagnostics_area();
|
||||
is_slave_error= 0;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
@ -2064,7 +1973,7 @@ public:
|
||||
|
||||
To raise this flag, use my_error().
|
||||
*/
|
||||
inline bool is_error() const { return main_da.is_error(); }
|
||||
inline bool is_error() const { return stmt_da->is_error(); }
|
||||
inline CHARSET_INFO *charset() { return variables.character_set_client; }
|
||||
void update_charset();
|
||||
|
||||
@ -2260,19 +2169,107 @@ public:
|
||||
void push_internal_handler(Internal_error_handler *handler);
|
||||
|
||||
/**
|
||||
Handle an error condition.
|
||||
@param sql_errno the error number
|
||||
@param level the error level
|
||||
@return true if the error is handled
|
||||
Handle a sql condition.
|
||||
@param sql_errno the condition error number
|
||||
@param sqlstate the condition sqlstate
|
||||
@param level the condition level
|
||||
@param msg the condition message text
|
||||
@param[out] cond_hdl the sql condition raised, if any
|
||||
@return true if the condition is handled
|
||||
*/
|
||||
virtual bool handle_error(uint sql_errno, const char *message,
|
||||
MYSQL_ERROR::enum_warning_level level);
|
||||
virtual bool handle_condition(uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl);
|
||||
|
||||
/**
|
||||
Remove the error handler last pushed.
|
||||
*/
|
||||
void pop_internal_handler();
|
||||
|
||||
/**
|
||||
Raise an exception condition.
|
||||
@param code the MYSQL_ERRNO error code of the error
|
||||
*/
|
||||
void raise_error(uint code);
|
||||
|
||||
/**
|
||||
Raise an exception condition, with a formatted message.
|
||||
@param code the MYSQL_ERRNO error code of the error
|
||||
*/
|
||||
void raise_error_printf(uint code, ...);
|
||||
|
||||
/**
|
||||
Raise a completion condition (warning).
|
||||
@param code the MYSQL_ERRNO error code of the warning
|
||||
*/
|
||||
void raise_warning(uint code);
|
||||
|
||||
/**
|
||||
Raise a completion condition (warning), with a formatted message.
|
||||
@param code the MYSQL_ERRNO error code of the warning
|
||||
*/
|
||||
void raise_warning_printf(uint code, ...);
|
||||
|
||||
/**
|
||||
Raise a completion condition (note), with a fixed message.
|
||||
@param code the MYSQL_ERRNO error code of the note
|
||||
*/
|
||||
void raise_note(uint code);
|
||||
|
||||
/**
|
||||
Raise an completion condition (note), with a formatted message.
|
||||
@param code the MYSQL_ERRNO error code of the note
|
||||
*/
|
||||
void raise_note_printf(uint code, ...);
|
||||
|
||||
private:
|
||||
/*
|
||||
Only the implementation of the SIGNAL and RESIGNAL statements
|
||||
is permitted to raise SQL conditions in a generic way,
|
||||
or to raise them by bypassing handlers (RESIGNAL).
|
||||
To raise a SQL condition, the code should use the public
|
||||
raise_error() or raise_warning() methods provided by class THD.
|
||||
*/
|
||||
friend class Signal_common;
|
||||
friend class Signal_statement;
|
||||
friend class Resignal_statement;
|
||||
friend void push_warning(THD*, MYSQL_ERROR::enum_warning_level, uint, const char*);
|
||||
friend void my_message_sql(uint, const char *, myf);
|
||||
|
||||
/**
|
||||
Raise a generic SQL condition.
|
||||
@param sql_errno the condition error number
|
||||
@param sqlstate the condition SQLSTATE
|
||||
@param level the condition level
|
||||
@param msg the condition message text
|
||||
@return The condition raised, or NULL
|
||||
*/
|
||||
MYSQL_ERROR*
|
||||
raise_condition(uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg);
|
||||
|
||||
/**
|
||||
Raise a generic SQL condition, without activation any SQL condition
|
||||
handlers.
|
||||
This method is necessary to support the RESIGNAL statement,
|
||||
which is allowed to bypass SQL exception handlers.
|
||||
@param sql_errno the condition error number
|
||||
@param sqlstate the condition SQLSTATE
|
||||
@param level the condition level
|
||||
@param msg the condition message text
|
||||
@return The condition raised, or NULL
|
||||
*/
|
||||
MYSQL_ERROR*
|
||||
raise_condition_no_handler(uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg);
|
||||
|
||||
public:
|
||||
/** Overloaded to guard query/query_length fields */
|
||||
virtual void set_statement(Statement *stmt);
|
||||
|
||||
@ -2300,25 +2297,27 @@ private:
|
||||
tree itself is reused between executions and thus is stored elsewhere.
|
||||
*/
|
||||
MEM_ROOT main_mem_root;
|
||||
Warning_info main_warning_info;
|
||||
Diagnostics_area main_da;
|
||||
};
|
||||
|
||||
|
||||
/** A short cut for thd->main_da.set_ok_status(). */
|
||||
/** A short cut for thd->stmt_da->set_ok_status(). */
|
||||
|
||||
inline void
|
||||
my_ok(THD *thd, ha_rows affected_rows= 0, ulonglong id= 0,
|
||||
my_ok(THD *thd, ulonglong affected_rows= 0, ulonglong id= 0,
|
||||
const char *message= NULL)
|
||||
{
|
||||
thd->main_da.set_ok_status(thd, affected_rows, id, message);
|
||||
thd->stmt_da->set_ok_status(thd, affected_rows, id, message);
|
||||
}
|
||||
|
||||
|
||||
/** A short cut for thd->main_da.set_eof_status(). */
|
||||
/** A short cut for thd->stmt_da->set_eof_status(). */
|
||||
|
||||
inline void
|
||||
my_eof(THD *thd)
|
||||
{
|
||||
thd->main_da.set_eof_status(thd);
|
||||
thd->stmt_da->set_eof_status(thd);
|
||||
}
|
||||
|
||||
#define tmp_disable_binlog(A) \
|
||||
@ -2986,11 +2985,11 @@ public:
|
||||
|
||||
/* Bits in sql_command_flags */
|
||||
|
||||
#define CF_CHANGES_DATA 1
|
||||
#define CF_HAS_ROW_COUNT 2
|
||||
#define CF_STATUS_COMMAND 4
|
||||
#define CF_SHOW_TABLE_COMMAND 8
|
||||
#define CF_WRITE_LOGS_COMMAND 16
|
||||
#define CF_CHANGES_DATA (1U << 0)
|
||||
#define CF_HAS_ROW_COUNT (1U << 1)
|
||||
#define CF_STATUS_COMMAND (1U << 2)
|
||||
#define CF_SHOW_TABLE_COMMAND (1U << 3)
|
||||
#define CF_WRITE_LOGS_COMMAND (1U << 4)
|
||||
/**
|
||||
Must be set for SQL statements that may contain
|
||||
Item expressions and/or use joins and tables.
|
||||
@ -3004,7 +3003,17 @@ public:
|
||||
reprepare. Consequently, complex item expressions and
|
||||
joins are currently prohibited in these statements.
|
||||
*/
|
||||
#define CF_REEXECUTION_FRAGILE 32
|
||||
#define CF_REEXECUTION_FRAGILE (1U << 5)
|
||||
|
||||
/**
|
||||
Diagnostic statement.
|
||||
Diagnostic statements:
|
||||
- SHOW WARNING
|
||||
- SHOW ERROR
|
||||
- GET DIAGNOSTICS (WL#2111)
|
||||
do not modify the diagnostics area during execution.
|
||||
*/
|
||||
#define CF_DIAGNOSTIC_STMT (1U << 8)
|
||||
|
||||
/* Functions in sql_class.cc */
|
||||
|
||||
|
@ -1001,7 +1001,7 @@ static void end_connection(THD *thd)
|
||||
thd->thread_id,(thd->db ? thd->db : "unconnected"),
|
||||
sctx->user ? sctx->user : "unauthenticated",
|
||||
sctx->host_or_ip,
|
||||
(thd->main_da.is_error() ? thd->main_da.message() :
|
||||
(thd->stmt_da->is_error() ? thd->stmt_da->message() :
|
||||
ER(ER_UNKNOWN_ERROR)));
|
||||
}
|
||||
}
|
||||
@ -1046,7 +1046,7 @@ static void prepare_new_connection_state(THD* thd)
|
||||
thd->thread_id,(thd->db ? thd->db : "unconnected"),
|
||||
sctx->user ? sctx->user : "unauthenticated",
|
||||
sctx->host_or_ip, "init_connect command failed");
|
||||
sql_print_warning("%s", thd->main_da.message());
|
||||
sql_print_warning("%s", thd->stmt_da->message());
|
||||
}
|
||||
thd->proc_info=0;
|
||||
thd->set_time();
|
||||
|
@ -178,9 +178,9 @@ exit:
|
||||
if (orig_table_list->view)
|
||||
{
|
||||
if (thd->is_error() &&
|
||||
(thd->main_da.sql_errno() == ER_BAD_FIELD_ERROR ||
|
||||
thd->main_da.sql_errno() == ER_FUNC_INEXISTENT_NAME_COLLISION ||
|
||||
thd->main_da.sql_errno() == ER_SP_DOES_NOT_EXIST))
|
||||
(thd->stmt_da->sql_errno() == ER_BAD_FIELD_ERROR ||
|
||||
thd->stmt_da->sql_errno() == ER_FUNC_INEXISTENT_NAME_COLLISION ||
|
||||
thd->stmt_da->sql_errno() == ER_SP_DOES_NOT_EXIST))
|
||||
{
|
||||
thd->clear_error();
|
||||
my_error(ER_VIEW_INVALID, MYF(0), orig_table_list->db,
|
||||
|
650
sql/sql_error.cc
650
sql/sql_error.cc
@ -1,4 +1,5 @@
|
||||
/* Copyright (C) 1995-2002 MySQL AB
|
||||
/* Copyright (C) 1995-2002 MySQL AB,
|
||||
Copyright (C) 2008-2009 Sun Microsystems, Inc
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -42,133 +43,577 @@ This file contains the implementation of error and warnings related
|
||||
***********************************************************************/
|
||||
|
||||
#include "mysql_priv.h"
|
||||
#include "sql_error.h"
|
||||
#include "sp_rcontext.h"
|
||||
|
||||
/*
|
||||
Store a new message in an error object
|
||||
Design notes about MYSQL_ERROR::m_message_text.
|
||||
|
||||
This is used to in group_concat() to register how many warnings we actually
|
||||
got after the query has been executed.
|
||||
The member MYSQL_ERROR::m_message_text contains the text associated with
|
||||
an error, warning or note (which are all SQL 'conditions')
|
||||
|
||||
Producer of MYSQL_ERROR::m_message_text:
|
||||
----------------------------------------
|
||||
|
||||
(#1) the server implementation itself, when invoking functions like
|
||||
my_error() or push_warning()
|
||||
|
||||
(#2) user code in stored programs, when using the SIGNAL statement.
|
||||
|
||||
(#3) user code in stored programs, when using the RESIGNAL statement.
|
||||
|
||||
When invoking my_error(), the error number and message is typically
|
||||
provided like this:
|
||||
- my_error(ER_WRONG_DB_NAME, MYF(0), ...);
|
||||
- my_message(ER_SLAVE_IGNORED_TABLE, ER(ER_SLAVE_IGNORED_TABLE), MYF(0));
|
||||
|
||||
In both cases, the message is retrieved from ER(ER_XXX), which in turn
|
||||
is read from the resource file errmsg.sys at server startup.
|
||||
The strings stored in the errmsg.sys file are expressed in the character set
|
||||
that corresponds to the server --language start option
|
||||
(see error_message_charset_info).
|
||||
|
||||
When executing:
|
||||
- a SIGNAL statement,
|
||||
- a RESIGNAL statement,
|
||||
the message text is provided by the user logic, and is expressed in UTF8.
|
||||
|
||||
Storage of MYSQL_ERROR::m_message_text:
|
||||
---------------------------------------
|
||||
|
||||
(#4) The class MYSQL_ERROR is used to hold the message text member.
|
||||
This class represents a single SQL condition.
|
||||
|
||||
(#5) The class Warning_info represents a SQL condition area, and contains
|
||||
a collection of SQL conditions in the Warning_info::m_warn_list
|
||||
|
||||
Consumer of MYSQL_ERROR::m_message_text:
|
||||
----------------------------------------
|
||||
|
||||
(#6) The statements SHOW WARNINGS and SHOW ERRORS display the content of
|
||||
the warning list.
|
||||
|
||||
(#7) The GET DIAGNOSTICS statement (planned, not implemented yet) will
|
||||
also read the content of:
|
||||
- the top level statement condition area (when executed in a query),
|
||||
- a sub statement (when executed in a stored program)
|
||||
and return the data stored in a MYSQL_ERROR.
|
||||
|
||||
(#8) The RESIGNAL statement reads the MYSQL_ERROR caught by an exception
|
||||
handler, to raise a new or modified condition (in #3).
|
||||
|
||||
The big picture
|
||||
---------------
|
||||
--------------
|
||||
| ^
|
||||
V |
|
||||
my_error(#1) SIGNAL(#2) RESIGNAL(#3) |
|
||||
|(#A) |(#B) |(#C) |
|
||||
| | | |
|
||||
----------------------------|---------------------------- |
|
||||
| |
|
||||
V |
|
||||
MYSQL_ERROR(#4) |
|
||||
| |
|
||||
| |
|
||||
V |
|
||||
Warning_info(#5) |
|
||||
| |
|
||||
----------------------------------------------------- |
|
||||
| | | |
|
||||
| | | |
|
||||
| | | |
|
||||
V V V |
|
||||
SHOW WARNINGS(#6) GET DIAGNOSTICS(#7) RESIGNAL(#8) |
|
||||
| | | | |
|
||||
| -------- | V |
|
||||
| | | --------------
|
||||
V | |
|
||||
Connectors | |
|
||||
| | |
|
||||
-------------------------
|
||||
|
|
||||
V
|
||||
Client application
|
||||
|
||||
Current implementation status
|
||||
-----------------------------
|
||||
|
||||
(#1) (my_error) produces data in the 'error_message_charset_info' CHARSET
|
||||
|
||||
(#2) and (#3) (SIGNAL, RESIGNAL) produces data internally in UTF8
|
||||
|
||||
(#6) (SHOW WARNINGS) produces data in the 'error_message_charset_info' CHARSET
|
||||
|
||||
(#7) (GET DIAGNOSTICS) is not implemented.
|
||||
|
||||
(#8) (RESIGNAL) produces data internally in UTF8 (see #3)
|
||||
|
||||
As a result, the design choice for (#4) and (#5) is to store data in
|
||||
the 'error_message_charset_info' CHARSET, to minimize impact on the code base.
|
||||
This is implemented by using 'String MYSQL_ERROR::m_message_text'.
|
||||
|
||||
The UTF8 -> error_message_charset_info conversion is implemented in
|
||||
Signal_common::eval_signal_informations() (for path #B and #C).
|
||||
|
||||
Future work
|
||||
-----------
|
||||
|
||||
- Change (#1) (my_error) to generate errors in UTF8.
|
||||
See WL#751 (Recoding of error messages)
|
||||
|
||||
- Change (#4 and #5) to store message text in UTF8 natively.
|
||||
In practice, this means changing the type of the message text to
|
||||
'<UTF8 String 128 class> MYSQL_ERROR::m_message_text', and is a direct
|
||||
consequence of WL#751.
|
||||
|
||||
- Implement (#9) (GET DIAGNOSTICS).
|
||||
See WL#2111 (Stored Procedures: Implement GET DIAGNOSTICS)
|
||||
*/
|
||||
|
||||
void MYSQL_ERROR::set_msg(THD *thd, const char *msg_arg)
|
||||
MYSQL_ERROR::MYSQL_ERROR()
|
||||
: Sql_alloc(),
|
||||
m_class_origin((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_subclass_origin((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_constraint_catalog((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_constraint_schema((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_constraint_name((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_catalog_name((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_schema_name((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_table_name((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_column_name((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_cursor_name((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_message_text(),
|
||||
m_sql_errno(0),
|
||||
m_level(MYSQL_ERROR::WARN_LEVEL_ERROR),
|
||||
m_mem_root(NULL)
|
||||
{
|
||||
msg= strdup_root(&thd->warn_root, msg_arg);
|
||||
memset(m_returned_sqlstate, 0, sizeof(m_returned_sqlstate));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Reset all warnings for the thread
|
||||
|
||||
SYNOPSIS
|
||||
mysql_reset_errors()
|
||||
thd Thread handle
|
||||
force Reset warnings even if it has been done before
|
||||
|
||||
IMPLEMENTATION
|
||||
Don't reset warnings if this has already been called for this query.
|
||||
This may happen if one gets a warning during the parsing stage,
|
||||
in which case push_warnings() has already called this function.
|
||||
*/
|
||||
|
||||
void mysql_reset_errors(THD *thd, bool force)
|
||||
void MYSQL_ERROR::init(MEM_ROOT *mem_root)
|
||||
{
|
||||
DBUG_ENTER("mysql_reset_errors");
|
||||
if (thd->query_id != thd->warn_id || force)
|
||||
DBUG_ASSERT(mem_root != NULL);
|
||||
DBUG_ASSERT(m_mem_root == NULL);
|
||||
m_mem_root= mem_root;
|
||||
}
|
||||
|
||||
void MYSQL_ERROR::clear()
|
||||
{
|
||||
m_class_origin.length(0);
|
||||
m_subclass_origin.length(0);
|
||||
m_constraint_catalog.length(0);
|
||||
m_constraint_schema.length(0);
|
||||
m_constraint_name.length(0);
|
||||
m_catalog_name.length(0);
|
||||
m_schema_name.length(0);
|
||||
m_table_name.length(0);
|
||||
m_column_name.length(0);
|
||||
m_cursor_name.length(0);
|
||||
m_message_text.length(0);
|
||||
m_sql_errno= 0;
|
||||
m_level= MYSQL_ERROR::WARN_LEVEL_ERROR;
|
||||
}
|
||||
|
||||
MYSQL_ERROR::MYSQL_ERROR(MEM_ROOT *mem_root)
|
||||
: Sql_alloc(),
|
||||
m_class_origin((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_subclass_origin((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_constraint_catalog((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_constraint_schema((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_constraint_name((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_catalog_name((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_schema_name((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_table_name((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_column_name((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_cursor_name((const char*) NULL, 0, & my_charset_utf8_bin),
|
||||
m_message_text(),
|
||||
m_sql_errno(0),
|
||||
m_level(MYSQL_ERROR::WARN_LEVEL_ERROR),
|
||||
m_mem_root(mem_root)
|
||||
{
|
||||
DBUG_ASSERT(mem_root != NULL);
|
||||
memset(m_returned_sqlstate, 0, sizeof(m_returned_sqlstate));
|
||||
}
|
||||
|
||||
static void copy_string(MEM_ROOT *mem_root, String* dst, const String* src)
|
||||
{
|
||||
size_t len= src->length();
|
||||
if (len)
|
||||
{
|
||||
thd->warn_id= thd->query_id;
|
||||
free_root(&thd->warn_root,MYF(0));
|
||||
bzero((char*) thd->warn_count, sizeof(thd->warn_count));
|
||||
if (force)
|
||||
thd->total_warn_count= 0;
|
||||
thd->warn_list.empty();
|
||||
thd->row_count= 1; // by default point to row 1
|
||||
char* copy= (char*) alloc_root(mem_root, len + 1);
|
||||
if (copy)
|
||||
{
|
||||
memcpy(copy, src->ptr(), len);
|
||||
copy[len]= '\0';
|
||||
dst->set(copy, len, src->charset());
|
||||
}
|
||||
}
|
||||
else
|
||||
dst->length(0);
|
||||
}
|
||||
|
||||
void
|
||||
MYSQL_ERROR::copy_opt_attributes(const MYSQL_ERROR *cond)
|
||||
{
|
||||
DBUG_ASSERT(this != cond);
|
||||
copy_string(m_mem_root, & m_class_origin, & cond->m_class_origin);
|
||||
copy_string(m_mem_root, & m_subclass_origin, & cond->m_subclass_origin);
|
||||
copy_string(m_mem_root, & m_constraint_catalog, & cond->m_constraint_catalog);
|
||||
copy_string(m_mem_root, & m_constraint_schema, & cond->m_constraint_schema);
|
||||
copy_string(m_mem_root, & m_constraint_name, & cond->m_constraint_name);
|
||||
copy_string(m_mem_root, & m_catalog_name, & cond->m_catalog_name);
|
||||
copy_string(m_mem_root, & m_schema_name, & cond->m_schema_name);
|
||||
copy_string(m_mem_root, & m_table_name, & cond->m_table_name);
|
||||
copy_string(m_mem_root, & m_column_name, & cond->m_column_name);
|
||||
copy_string(m_mem_root, & m_cursor_name, & cond->m_cursor_name);
|
||||
}
|
||||
|
||||
void
|
||||
MYSQL_ERROR::set(uint sql_errno, const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level, const char* msg)
|
||||
{
|
||||
DBUG_ASSERT(sql_errno != 0);
|
||||
DBUG_ASSERT(sqlstate != NULL);
|
||||
DBUG_ASSERT(msg != NULL);
|
||||
|
||||
m_sql_errno= sql_errno;
|
||||
memcpy(m_returned_sqlstate, sqlstate, SQLSTATE_LENGTH);
|
||||
m_returned_sqlstate[SQLSTATE_LENGTH]= '\0';
|
||||
|
||||
set_builtin_message_text(msg);
|
||||
m_level= level;
|
||||
}
|
||||
|
||||
void
|
||||
MYSQL_ERROR::set_builtin_message_text(const char* str)
|
||||
{
|
||||
/*
|
||||
See the comments
|
||||
"Design notes about MYSQL_ERROR::m_message_text."
|
||||
*/
|
||||
const char* copy;
|
||||
|
||||
copy= strdup_root(m_mem_root, str);
|
||||
m_message_text.set(copy, strlen(copy), error_message_charset_info);
|
||||
DBUG_ASSERT(! m_message_text.is_alloced());
|
||||
}
|
||||
|
||||
const char*
|
||||
MYSQL_ERROR::get_message_text() const
|
||||
{
|
||||
return m_message_text.ptr();
|
||||
}
|
||||
|
||||
int
|
||||
MYSQL_ERROR::get_message_octet_length() const
|
||||
{
|
||||
return m_message_text.length();
|
||||
}
|
||||
|
||||
void
|
||||
MYSQL_ERROR::set_sqlstate(const char* sqlstate)
|
||||
{
|
||||
memcpy(m_returned_sqlstate, sqlstate, SQLSTATE_LENGTH);
|
||||
m_returned_sqlstate[SQLSTATE_LENGTH]= '\0';
|
||||
}
|
||||
|
||||
/**
|
||||
Clear this diagnostics area.
|
||||
|
||||
Normally called at the end of a statement.
|
||||
*/
|
||||
|
||||
void
|
||||
Diagnostics_area::reset_diagnostics_area()
|
||||
{
|
||||
DBUG_ENTER("reset_diagnostics_area");
|
||||
#ifdef DBUG_OFF
|
||||
can_overwrite_status= FALSE;
|
||||
/** Don't take chances in production */
|
||||
m_message[0]= '\0';
|
||||
m_sql_errno= 0;
|
||||
m_server_status= 0;
|
||||
m_affected_rows= 0;
|
||||
m_last_insert_id= 0;
|
||||
m_statement_warn_count= 0;
|
||||
#endif
|
||||
is_sent= FALSE;
|
||||
/** Tiny reset in debug mode to see garbage right away */
|
||||
m_status= DA_EMPTY;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Push the warning/error to error list if there is still room in the list
|
||||
/**
|
||||
Set OK status -- ends commands that do not return a
|
||||
result set, e.g. INSERT/UPDATE/DELETE.
|
||||
*/
|
||||
|
||||
void
|
||||
Diagnostics_area::set_ok_status(THD *thd, ulonglong affected_rows_arg,
|
||||
ulonglong last_insert_id_arg,
|
||||
const char *message_arg)
|
||||
{
|
||||
DBUG_ENTER("set_ok_status");
|
||||
DBUG_ASSERT(! is_set());
|
||||
/*
|
||||
In production, refuse to overwrite an error or a custom response
|
||||
with an OK packet.
|
||||
*/
|
||||
if (is_error() || is_disabled())
|
||||
return;
|
||||
|
||||
m_server_status= thd->server_status;
|
||||
m_statement_warn_count= thd->warning_info->statement_warn_count();
|
||||
m_affected_rows= affected_rows_arg;
|
||||
m_last_insert_id= last_insert_id_arg;
|
||||
if (message_arg)
|
||||
strmake(m_message, message_arg, sizeof(m_message) - 1);
|
||||
else
|
||||
m_message[0]= '\0';
|
||||
m_status= DA_OK;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Set EOF status.
|
||||
*/
|
||||
|
||||
void
|
||||
Diagnostics_area::set_eof_status(THD *thd)
|
||||
{
|
||||
DBUG_ENTER("set_eof_status");
|
||||
/* Only allowed to report eof if has not yet reported an error */
|
||||
DBUG_ASSERT(! is_set());
|
||||
/*
|
||||
In production, refuse to overwrite an error or a custom response
|
||||
with an EOF packet.
|
||||
*/
|
||||
if (is_error() || is_disabled())
|
||||
return;
|
||||
|
||||
m_server_status= thd->server_status;
|
||||
/*
|
||||
If inside a stored procedure, do not return the total
|
||||
number of warnings, since they are not available to the client
|
||||
anyway.
|
||||
*/
|
||||
m_statement_warn_count= (thd->spcont ?
|
||||
0 : thd->warning_info->statement_warn_count());
|
||||
|
||||
m_status= DA_EOF;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
/**
|
||||
Set ERROR status.
|
||||
*/
|
||||
|
||||
void
|
||||
Diagnostics_area::set_error_status(THD *thd, uint sql_errno_arg,
|
||||
const char *message_arg,
|
||||
const char *sqlstate)
|
||||
{
|
||||
DBUG_ENTER("set_error_status");
|
||||
/*
|
||||
Only allowed to report error if has not yet reported a success
|
||||
The only exception is when we flush the message to the client,
|
||||
an error can happen during the flush.
|
||||
*/
|
||||
DBUG_ASSERT(! is_set() || can_overwrite_status);
|
||||
#ifdef DBUG_OFF
|
||||
/*
|
||||
In production, refuse to overwrite a custom response with an
|
||||
ERROR packet.
|
||||
*/
|
||||
if (is_disabled())
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (sqlstate == NULL)
|
||||
sqlstate= mysql_errno_to_sqlstate(sql_errno_arg);
|
||||
|
||||
m_sql_errno= sql_errno_arg;
|
||||
memcpy(m_sqlstate, sqlstate, SQLSTATE_LENGTH);
|
||||
m_sqlstate[SQLSTATE_LENGTH]= '\0';
|
||||
strmake(m_message, message_arg, sizeof(m_message)-1);
|
||||
|
||||
m_status= DA_ERROR;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Mark the diagnostics area as 'DISABLED'.
|
||||
|
||||
This is used in rare cases when the COM_ command at hand sends a response
|
||||
in a custom format. One example is the query cache, another is
|
||||
COM_STMT_PREPARE.
|
||||
*/
|
||||
|
||||
void
|
||||
Diagnostics_area::disable_status()
|
||||
{
|
||||
DBUG_ASSERT(! is_set());
|
||||
m_status= DA_DISABLED;
|
||||
}
|
||||
|
||||
Warning_info::Warning_info(ulonglong warn_id_arg)
|
||||
:m_statement_warn_count(0),
|
||||
m_current_row_for_warning(1),
|
||||
m_warn_id(warn_id_arg),
|
||||
m_read_only(FALSE)
|
||||
{
|
||||
/* Initialize sub structures */
|
||||
init_sql_alloc(&m_warn_root, WARN_ALLOC_BLOCK_SIZE, WARN_ALLOC_PREALLOC_SIZE);
|
||||
m_warn_list.empty();
|
||||
bzero((char*) m_warn_count, sizeof(m_warn_count));
|
||||
}
|
||||
|
||||
|
||||
Warning_info::~Warning_info()
|
||||
{
|
||||
free_root(&m_warn_root,MYF(0));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Reset the warning information of this connection.
|
||||
*/
|
||||
|
||||
void Warning_info::clear_warning_info(ulonglong warn_id_arg)
|
||||
{
|
||||
m_warn_id= warn_id_arg;
|
||||
free_root(&m_warn_root, MYF(0));
|
||||
bzero((char*) m_warn_count, sizeof(m_warn_count));
|
||||
m_warn_list.empty();
|
||||
m_statement_warn_count= 0;
|
||||
m_current_row_for_warning= 1; /* Start counting from the first row */
|
||||
}
|
||||
|
||||
void Warning_info::reserve_space(THD *thd, uint count)
|
||||
{
|
||||
/* Make room for count conditions */
|
||||
while ((m_warn_list.elements > 0) &&
|
||||
((m_warn_list.elements + count) > thd->variables.max_error_count))
|
||||
m_warn_list.pop();
|
||||
}
|
||||
|
||||
/**
|
||||
Append warnings only if the original contents of the routine
|
||||
warning info was replaced.
|
||||
*/
|
||||
void Warning_info::merge_with_routine_info(THD *thd, Warning_info *source)
|
||||
{
|
||||
/*
|
||||
If a routine body is empty or if a routine did not
|
||||
generate any warnings (thus m_warn_id didn't change),
|
||||
do not duplicate our own contents by appending the
|
||||
contents of the called routine. We know that the called
|
||||
routine did not change its warning info.
|
||||
|
||||
On the other hand, if the routine body is not empty and
|
||||
some statement in the routine generates a warning or
|
||||
uses tables, m_warn_id is guaranteed to have changed.
|
||||
In this case we know that the routine warning info
|
||||
contains only new warnings, and thus we perform a copy.
|
||||
*/
|
||||
if (m_warn_id != source->m_warn_id)
|
||||
{
|
||||
/*
|
||||
If the invocation of the routine was a standalone statement,
|
||||
rather than a sub-statement, in other words, if it's a CALL
|
||||
of a procedure, rather than invocation of a function or a
|
||||
trigger, we need to clear the current contents of the caller's
|
||||
warning info.
|
||||
|
||||
This is per MySQL rules: if a statement generates a warning,
|
||||
warnings from the previous statement are flushed. Normally
|
||||
it's done in push_warning(). However, here we don't use
|
||||
push_warning() to avoid invocation of condition handlers or
|
||||
escalation of warnings to errors.
|
||||
*/
|
||||
opt_clear_warning_info(thd->query_id);
|
||||
append_warning_info(thd, source);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Add a warning to the list of warnings. Increment the respective
|
||||
counters.
|
||||
*/
|
||||
MYSQL_ERROR *Warning_info::push_warning(THD *thd,
|
||||
uint sql_errno, const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char *msg)
|
||||
{
|
||||
MYSQL_ERROR *cond= NULL;
|
||||
|
||||
if (! m_read_only)
|
||||
{
|
||||
if (m_warn_list.elements < thd->variables.max_error_count)
|
||||
{
|
||||
cond= new (& m_warn_root) MYSQL_ERROR(& m_warn_root);
|
||||
if (cond)
|
||||
{
|
||||
cond->set(sql_errno, sqlstate, level, msg);
|
||||
m_warn_list.push_back(cond, &m_warn_root);
|
||||
}
|
||||
}
|
||||
m_warn_count[(uint) level]++;
|
||||
}
|
||||
|
||||
m_statement_warn_count++;
|
||||
return cond;
|
||||
}
|
||||
|
||||
/*
|
||||
Push the warning to error list if there is still room in the list
|
||||
|
||||
SYNOPSIS
|
||||
push_warning()
|
||||
thd Thread handle
|
||||
level Severity of warning (note, warning, error ...)
|
||||
level Severity of warning (note, warning)
|
||||
code Error number
|
||||
msg Clear error message
|
||||
|
||||
RETURN
|
||||
pointer on MYSQL_ERROR object
|
||||
*/
|
||||
|
||||
MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level,
|
||||
uint code, const char *msg)
|
||||
void push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level,
|
||||
uint code, const char *msg)
|
||||
{
|
||||
MYSQL_ERROR *err= 0;
|
||||
DBUG_ENTER("push_warning");
|
||||
DBUG_PRINT("enter", ("code: %d, msg: %s", code, msg));
|
||||
|
||||
DBUG_ASSERT(code != 0);
|
||||
DBUG_ASSERT(msg != NULL);
|
||||
/*
|
||||
Calling push_warning/push_warning_printf with a
|
||||
level of WARN_LEVEL_ERROR *is* a bug.
|
||||
Either use my_error(), or WARN_LEVEL_WARN.
|
||||
Please fix the calling code, and do *NOT*
|
||||
add more work around code in the assert below.
|
||||
*/
|
||||
DBUG_ASSERT( (level != MYSQL_ERROR::WARN_LEVEL_ERROR)
|
||||
|| (code == ER_CANT_CREATE_TABLE) /* See Bug#47233 */
|
||||
|| (code == ER_ILLEGAL_HA_CREATE_OPTION) /* See Bug#47233 */
|
||||
);
|
||||
|
||||
if (level == MYSQL_ERROR::WARN_LEVEL_NOTE &&
|
||||
!(thd->options & OPTION_SQL_NOTES))
|
||||
DBUG_RETURN(0);
|
||||
if (level == MYSQL_ERROR::WARN_LEVEL_ERROR)
|
||||
level= MYSQL_ERROR::WARN_LEVEL_WARN;
|
||||
|
||||
if (thd->query_id != thd->warn_id && !thd->spcont)
|
||||
mysql_reset_errors(thd, 0);
|
||||
thd->got_warning= 1;
|
||||
(void) thd->raise_condition(code, NULL, level, msg);
|
||||
|
||||
/* Abort if we are using strict mode and we are not using IGNORE */
|
||||
if ((int) level >= (int) MYSQL_ERROR::WARN_LEVEL_WARN &&
|
||||
thd->really_abort_on_warning())
|
||||
{
|
||||
/* Avoid my_message() calling push_warning */
|
||||
bool no_warnings_for_error= thd->no_warnings_for_error;
|
||||
sp_rcontext *spcont= thd->spcont;
|
||||
|
||||
thd->no_warnings_for_error= 1;
|
||||
thd->spcont= NULL;
|
||||
|
||||
thd->killed= THD::KILL_BAD_DATA;
|
||||
my_message(code, msg, MYF(0));
|
||||
|
||||
thd->spcont= spcont;
|
||||
thd->no_warnings_for_error= no_warnings_for_error;
|
||||
/* Store error in error list (as my_message() didn't do it) */
|
||||
level= MYSQL_ERROR::WARN_LEVEL_ERROR;
|
||||
}
|
||||
|
||||
if (thd->handle_error(code, msg, level))
|
||||
DBUG_RETURN(NULL);
|
||||
|
||||
if (thd->spcont &&
|
||||
thd->spcont->handle_error(code, level, thd))
|
||||
{
|
||||
DBUG_RETURN(NULL);
|
||||
}
|
||||
query_cache_abort(&thd->net);
|
||||
|
||||
|
||||
if (thd->warn_list.elements < thd->variables.max_error_count)
|
||||
{
|
||||
/* We have to use warn_root, as mem_root is freed after each query */
|
||||
if ((err= new (&thd->warn_root) MYSQL_ERROR(thd, code, level, msg)))
|
||||
thd->warn_list.push_back(err, &thd->warn_root);
|
||||
}
|
||||
thd->warn_count[(uint) level]++;
|
||||
thd->total_warn_count++;
|
||||
DBUG_RETURN(err);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Push the warning/error to error list if there is still room in the list
|
||||
Push the warning to error list if there is still room in the list
|
||||
|
||||
SYNOPSIS
|
||||
push_warning_printf()
|
||||
thd Thread handle
|
||||
level Severity of warning (note, warning, error ...)
|
||||
level Severity of warning (note, warning)
|
||||
code Error number
|
||||
msg Clear error message
|
||||
*/
|
||||
@ -217,10 +662,12 @@ const LEX_STRING warning_level_names[]=
|
||||
};
|
||||
|
||||
bool mysqld_show_warnings(THD *thd, ulong levels_to_show)
|
||||
{
|
||||
{
|
||||
List<Item> field_list;
|
||||
DBUG_ENTER("mysqld_show_warnings");
|
||||
|
||||
DBUG_ASSERT(thd->warning_info->is_read_only());
|
||||
|
||||
field_list.push_back(new Item_empty_string("Level", 7));
|
||||
field_list.push_back(new Item_return_int("Code",4, MYSQL_TYPE_LONG));
|
||||
field_list.push_back(new Item_empty_string("Message",MYSQL_ERRMSG_SIZE));
|
||||
@ -232,29 +679,36 @@ bool mysqld_show_warnings(THD *thd, ulong levels_to_show)
|
||||
MYSQL_ERROR *err;
|
||||
SELECT_LEX *sel= &thd->lex->select_lex;
|
||||
SELECT_LEX_UNIT *unit= &thd->lex->unit;
|
||||
ha_rows idx= 0;
|
||||
ulonglong idx= 0;
|
||||
Protocol *protocol=thd->protocol;
|
||||
|
||||
unit->set_limit(sel);
|
||||
|
||||
List_iterator_fast<MYSQL_ERROR> it(thd->warn_list);
|
||||
List_iterator_fast<MYSQL_ERROR> it(thd->warning_info->warn_list());
|
||||
while ((err= it++))
|
||||
{
|
||||
/* Skip levels that the user is not interested in */
|
||||
if (!(levels_to_show & ((ulong) 1 << err->level)))
|
||||
if (!(levels_to_show & ((ulong) 1 << err->get_level())))
|
||||
continue;
|
||||
if (++idx <= unit->offset_limit_cnt)
|
||||
continue;
|
||||
if (idx > unit->select_limit_cnt)
|
||||
break;
|
||||
protocol->prepare_for_resend();
|
||||
protocol->store(warning_level_names[err->level].str,
|
||||
warning_level_names[err->level].length, system_charset_info);
|
||||
protocol->store((uint32) err->code);
|
||||
protocol->store(err->msg, (uint) strlen(err->msg), system_charset_info);
|
||||
protocol->store(warning_level_names[err->get_level()].str,
|
||||
warning_level_names[err->get_level()].length,
|
||||
system_charset_info);
|
||||
protocol->store((uint32) err->get_sql_errno());
|
||||
protocol->store(err->get_message_text(),
|
||||
err->get_message_octet_length(),
|
||||
system_charset_info);
|
||||
if (protocol->write())
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
my_eof(thd);
|
||||
|
||||
thd->warning_info->set_read_only(FALSE);
|
||||
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
|
||||
|
520
sql/sql_error.h
520
sql/sql_error.h
@ -1,4 +1,5 @@
|
||||
/* Copyright (C) 2000-2003 MySQL AB
|
||||
/* Copyright (C) 2000-2003 MySQL AB,
|
||||
Copyright (C) 2008-2009 Sun Microsystems, Inc
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -13,31 +14,514 @@
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
class MYSQL_ERROR: public Sql_alloc
|
||||
#ifndef SQL_ERROR_H
|
||||
#define SQL_ERROR_H
|
||||
|
||||
#include "sql_list.h" /* Sql_alloc, MEM_ROOT */
|
||||
#include "m_string.h" /* LEX_STRING */
|
||||
#include "mysql_com.h" /* MYSQL_ERRMSG_SIZE */
|
||||
|
||||
class THD;
|
||||
|
||||
/**
|
||||
Stores status of the currently executed statement.
|
||||
Cleared at the beginning of the statement, and then
|
||||
can hold either OK, ERROR, or EOF status.
|
||||
Can not be assigned twice per statement.
|
||||
*/
|
||||
|
||||
class Diagnostics_area
|
||||
{
|
||||
public:
|
||||
enum enum_warning_level
|
||||
{ WARN_LEVEL_NOTE, WARN_LEVEL_WARN, WARN_LEVEL_ERROR, WARN_LEVEL_END};
|
||||
|
||||
uint code;
|
||||
enum_warning_level level;
|
||||
char *msg;
|
||||
|
||||
MYSQL_ERROR(THD *thd, uint code_arg, enum_warning_level level_arg,
|
||||
const char *msg_arg)
|
||||
:code(code_arg), level(level_arg)
|
||||
enum enum_diagnostics_status
|
||||
{
|
||||
if (msg_arg)
|
||||
set_msg(thd, msg_arg);
|
||||
/** The area is cleared at start of a statement. */
|
||||
DA_EMPTY= 0,
|
||||
/** Set whenever one calls my_ok(). */
|
||||
DA_OK,
|
||||
/** Set whenever one calls my_eof(). */
|
||||
DA_EOF,
|
||||
/** Set whenever one calls my_error() or my_message(). */
|
||||
DA_ERROR,
|
||||
/** Set in case of a custom response, such as one from COM_STMT_PREPARE. */
|
||||
DA_DISABLED
|
||||
};
|
||||
/** True if status information is sent to the client. */
|
||||
bool is_sent;
|
||||
/** Set to make set_error_status after set_{ok,eof}_status possible. */
|
||||
bool can_overwrite_status;
|
||||
|
||||
void set_ok_status(THD *thd, ulonglong affected_rows_arg,
|
||||
ulonglong last_insert_id_arg,
|
||||
const char *message);
|
||||
void set_eof_status(THD *thd);
|
||||
void set_error_status(THD *thd, uint sql_errno_arg, const char *message_arg,
|
||||
const char *sqlstate);
|
||||
|
||||
void disable_status();
|
||||
|
||||
void reset_diagnostics_area();
|
||||
|
||||
bool is_set() const { return m_status != DA_EMPTY; }
|
||||
bool is_error() const { return m_status == DA_ERROR; }
|
||||
bool is_eof() const { return m_status == DA_EOF; }
|
||||
bool is_ok() const { return m_status == DA_OK; }
|
||||
bool is_disabled() const { return m_status == DA_DISABLED; }
|
||||
enum_diagnostics_status status() const { return m_status; }
|
||||
|
||||
const char *message() const
|
||||
{ DBUG_ASSERT(m_status == DA_ERROR || m_status == DA_OK); return m_message; }
|
||||
|
||||
uint sql_errno() const
|
||||
{ DBUG_ASSERT(m_status == DA_ERROR); return m_sql_errno; }
|
||||
|
||||
const char* get_sqlstate() const
|
||||
{ DBUG_ASSERT(m_status == DA_ERROR); return m_sqlstate; }
|
||||
|
||||
uint server_status() const
|
||||
{
|
||||
DBUG_ASSERT(m_status == DA_OK || m_status == DA_EOF);
|
||||
return m_server_status;
|
||||
}
|
||||
void set_msg(THD *thd, const char *msg_arg);
|
||||
|
||||
ulonglong affected_rows() const
|
||||
{ DBUG_ASSERT(m_status == DA_OK); return m_affected_rows; }
|
||||
|
||||
ulonglong last_insert_id() const
|
||||
{ DBUG_ASSERT(m_status == DA_OK); return m_last_insert_id; }
|
||||
|
||||
uint statement_warn_count() const
|
||||
{
|
||||
DBUG_ASSERT(m_status == DA_OK || m_status == DA_EOF);
|
||||
return m_statement_warn_count;
|
||||
}
|
||||
|
||||
Diagnostics_area() { reset_diagnostics_area(); }
|
||||
|
||||
private:
|
||||
/** Message buffer. Can be used by OK or ERROR status. */
|
||||
char m_message[MYSQL_ERRMSG_SIZE];
|
||||
/**
|
||||
SQL error number. One of ER_ codes from share/errmsg.txt.
|
||||
Set by set_error_status.
|
||||
*/
|
||||
uint m_sql_errno;
|
||||
|
||||
char m_sqlstate[SQLSTATE_LENGTH+1];
|
||||
|
||||
/**
|
||||
Copied from thd->server_status when the diagnostics area is assigned.
|
||||
We need this member as some places in the code use the following pattern:
|
||||
thd->server_status|= ...
|
||||
my_eof(thd);
|
||||
thd->server_status&= ~...
|
||||
Assigned by OK, EOF or ERROR.
|
||||
*/
|
||||
uint m_server_status;
|
||||
/**
|
||||
The number of rows affected by the last statement. This is
|
||||
semantically close to thd->row_count_func, but has a different
|
||||
life cycle. thd->row_count_func stores the value returned by
|
||||
function ROW_COUNT() and is cleared only by statements that
|
||||
update its value, such as INSERT, UPDATE, DELETE and few others.
|
||||
This member is cleared at the beginning of the next statement.
|
||||
|
||||
We could possibly merge the two, but life cycle of thd->row_count_func
|
||||
can not be changed.
|
||||
*/
|
||||
ulonglong m_affected_rows;
|
||||
/**
|
||||
Similarly to the previous member, this is a replacement of
|
||||
thd->first_successful_insert_id_in_prev_stmt, which is used
|
||||
to implement LAST_INSERT_ID().
|
||||
*/
|
||||
ulonglong m_last_insert_id;
|
||||
/**
|
||||
Number of warnings of this last statement. May differ from
|
||||
the number of warnings returned by SHOW WARNINGS e.g. in case
|
||||
the statement doesn't clear the warnings, and doesn't generate
|
||||
them.
|
||||
*/
|
||||
uint m_statement_warn_count;
|
||||
enum_diagnostics_status m_status;
|
||||
};
|
||||
|
||||
MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level,
|
||||
uint code, const char *msg);
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
Representation of a SQL condition.
|
||||
A SQL condition can be a completion condition (note, warning),
|
||||
or an exception condition (error, not found).
|
||||
@note This class is named MYSQL_ERROR instead of SQL_condition for historical reasons,
|
||||
to facilitate merging code with previous releases.
|
||||
*/
|
||||
class MYSQL_ERROR : public Sql_alloc
|
||||
{
|
||||
public:
|
||||
/*
|
||||
Enumeration value describing the severity of the error.
|
||||
|
||||
Note that these enumeration values must correspond to the indices
|
||||
of the sql_print_message_handlers array.
|
||||
*/
|
||||
enum enum_warning_level
|
||||
{ WARN_LEVEL_NOTE, WARN_LEVEL_WARN, WARN_LEVEL_ERROR, WARN_LEVEL_END};
|
||||
/**
|
||||
Get the MESSAGE_TEXT of this condition.
|
||||
@return the message text.
|
||||
*/
|
||||
const char* get_message_text() const;
|
||||
|
||||
/**
|
||||
Get the MESSAGE_OCTET_LENGTH of this condition.
|
||||
@return the length in bytes of the message text.
|
||||
*/
|
||||
int get_message_octet_length() const;
|
||||
|
||||
/**
|
||||
Get the SQLSTATE of this condition.
|
||||
@return the sql state.
|
||||
*/
|
||||
const char* get_sqlstate() const
|
||||
{ return m_returned_sqlstate; }
|
||||
|
||||
/**
|
||||
Get the SQL_ERRNO of this condition.
|
||||
@return the sql error number condition item.
|
||||
*/
|
||||
uint get_sql_errno() const
|
||||
{ return m_sql_errno; }
|
||||
|
||||
/**
|
||||
Get the error level of this condition.
|
||||
@return the error level condition item.
|
||||
*/
|
||||
MYSQL_ERROR::enum_warning_level get_level() const
|
||||
{ return m_level; }
|
||||
|
||||
private:
|
||||
/*
|
||||
The interface of MYSQL_ERROR is mostly private, by design,
|
||||
so that only the following code:
|
||||
- various raise_error() or raise_warning() methods in class THD,
|
||||
- the implementation of SIGNAL / RESIGNAL
|
||||
- catch / re-throw of SQL conditions in stored procedures (sp_rcontext)
|
||||
is allowed to create / modify a SQL condition.
|
||||
Enforcing this policy prevents confusion, since the only public
|
||||
interface available to the rest of the server implementation
|
||||
is the interface offered by the THD methods (THD::raise_error()),
|
||||
which should be used.
|
||||
*/
|
||||
friend class THD;
|
||||
friend class Warning_info;
|
||||
friend class Signal_common;
|
||||
friend class Signal_statement;
|
||||
friend class Resignal_statement;
|
||||
friend class sp_rcontext;
|
||||
|
||||
/**
|
||||
Default constructor.
|
||||
This constructor is usefull when allocating arrays.
|
||||
Note that the init() method should be called to complete the MYSQL_ERROR.
|
||||
*/
|
||||
MYSQL_ERROR();
|
||||
|
||||
/**
|
||||
Complete the MYSQL_ERROR initialisation.
|
||||
@param mem_root The memory root to use for the condition items
|
||||
of this condition
|
||||
*/
|
||||
void init(MEM_ROOT *mem_root);
|
||||
|
||||
/**
|
||||
Constructor.
|
||||
@param mem_root The memory root to use for the condition items
|
||||
of this condition
|
||||
*/
|
||||
MYSQL_ERROR(MEM_ROOT *mem_root);
|
||||
|
||||
/** Destructor. */
|
||||
~MYSQL_ERROR()
|
||||
{}
|
||||
|
||||
/**
|
||||
Copy optional condition items attributes.
|
||||
@param cond the condition to copy.
|
||||
*/
|
||||
void copy_opt_attributes(const MYSQL_ERROR *cond);
|
||||
|
||||
/**
|
||||
Set this condition area with a fixed message text.
|
||||
@param thd the current thread.
|
||||
@param code the error number for this condition.
|
||||
@param str the message text for this condition.
|
||||
@param level the error level for this condition.
|
||||
@param MyFlags additional flags.
|
||||
*/
|
||||
void set(uint sql_errno, const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg);
|
||||
|
||||
/**
|
||||
Set the condition message test.
|
||||
@param str Message text, expressed in the character set derived from
|
||||
the server --language option
|
||||
*/
|
||||
void set_builtin_message_text(const char* str);
|
||||
|
||||
/** Set the SQLSTATE of this condition. */
|
||||
void set_sqlstate(const char* sqlstate);
|
||||
|
||||
/**
|
||||
Clear this SQL condition.
|
||||
*/
|
||||
void clear();
|
||||
|
||||
private:
|
||||
/** SQL CLASS_ORIGIN condition item. */
|
||||
String m_class_origin;
|
||||
|
||||
/** SQL SUBCLASS_ORIGIN condition item. */
|
||||
String m_subclass_origin;
|
||||
|
||||
/** SQL CONSTRAINT_CATALOG condition item. */
|
||||
String m_constraint_catalog;
|
||||
|
||||
/** SQL CONSTRAINT_SCHEMA condition item. */
|
||||
String m_constraint_schema;
|
||||
|
||||
/** SQL CONSTRAINT_NAME condition item. */
|
||||
String m_constraint_name;
|
||||
|
||||
/** SQL CATALOG_NAME condition item. */
|
||||
String m_catalog_name;
|
||||
|
||||
/** SQL SCHEMA_NAME condition item. */
|
||||
String m_schema_name;
|
||||
|
||||
/** SQL TABLE_NAME condition item. */
|
||||
String m_table_name;
|
||||
|
||||
/** SQL COLUMN_NAME condition item. */
|
||||
String m_column_name;
|
||||
|
||||
/** SQL CURSOR_NAME condition item. */
|
||||
String m_cursor_name;
|
||||
|
||||
/** Message text, expressed in the character set implied by --language. */
|
||||
String m_message_text;
|
||||
|
||||
/** MySQL extension, MYSQL_ERRNO condition item. */
|
||||
uint m_sql_errno;
|
||||
|
||||
/**
|
||||
SQL RETURNED_SQLSTATE condition item.
|
||||
This member is always NUL terminated.
|
||||
*/
|
||||
char m_returned_sqlstate[SQLSTATE_LENGTH+1];
|
||||
|
||||
/** Severity (error, warning, note) of this condition. */
|
||||
MYSQL_ERROR::enum_warning_level m_level;
|
||||
|
||||
/** Memory root to use to hold condition item values. */
|
||||
MEM_ROOT *m_mem_root;
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
Information about warnings of the current connection.
|
||||
*/
|
||||
|
||||
class Warning_info
|
||||
{
|
||||
/** A memory root to allocate warnings and errors */
|
||||
MEM_ROOT m_warn_root;
|
||||
/** List of warnings of all severities (levels). */
|
||||
List <MYSQL_ERROR> m_warn_list;
|
||||
/** A break down of the number of warnings per severity (level). */
|
||||
uint m_warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_END];
|
||||
/**
|
||||
The number of warnings of the current statement. Warning_info
|
||||
life cycle differs from statement life cycle -- it may span
|
||||
multiple statements. In that case we get
|
||||
m_statement_warn_count 0, whereas m_warn_list is not empty.
|
||||
*/
|
||||
uint m_statement_warn_count;
|
||||
/*
|
||||
Row counter, to print in errors and warnings. Not increased in
|
||||
create_sort_index(); may differ from examined_row_count.
|
||||
*/
|
||||
ulong m_current_row_for_warning;
|
||||
/** Used to optionally clear warnings only once per statement. */
|
||||
ulonglong m_warn_id;
|
||||
|
||||
private:
|
||||
Warning_info(const Warning_info &rhs); /* Not implemented */
|
||||
Warning_info& operator=(const Warning_info &rhs); /* Not implemented */
|
||||
public:
|
||||
|
||||
Warning_info(ulonglong warn_id_arg);
|
||||
~Warning_info();
|
||||
|
||||
/**
|
||||
Reset the warning information. Clear all warnings,
|
||||
the number of warnings, reset current row counter
|
||||
to point to the first row.
|
||||
*/
|
||||
void clear_warning_info(ulonglong warn_id_arg);
|
||||
/**
|
||||
Only clear warning info if haven't yet done that already
|
||||
for the current query. Allows to be issued at any time
|
||||
during the query, without risk of clearing some warnings
|
||||
that have been generated by the current statement.
|
||||
|
||||
@todo: This is a sign of sloppy coding. Instead we need to
|
||||
designate one place in a statement life cycle where we call
|
||||
clear_warning_info().
|
||||
*/
|
||||
void opt_clear_warning_info(ulonglong query_id)
|
||||
{
|
||||
if (query_id != m_warn_id)
|
||||
clear_warning_info(query_id);
|
||||
}
|
||||
|
||||
void append_warning_info(THD *thd, Warning_info *source)
|
||||
{
|
||||
append_warnings(thd, & source->warn_list());
|
||||
}
|
||||
|
||||
/**
|
||||
Concatenate the list of warnings.
|
||||
It's considered tolerable to lose a warning.
|
||||
*/
|
||||
void append_warnings(THD *thd, List<MYSQL_ERROR> *src)
|
||||
{
|
||||
MYSQL_ERROR *err;
|
||||
MYSQL_ERROR *copy;
|
||||
List_iterator_fast<MYSQL_ERROR> it(*src);
|
||||
/*
|
||||
Don't use ::push_warning() to avoid invocation of condition
|
||||
handlers or escalation of warnings to errors.
|
||||
*/
|
||||
while ((err= it++))
|
||||
{
|
||||
copy= Warning_info::push_warning(thd, err->get_sql_errno(), err->get_sqlstate(),
|
||||
err->get_level(), err->get_message_text());
|
||||
if (copy)
|
||||
copy->copy_opt_attributes(err);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Conditional merge of related warning information areas.
|
||||
*/
|
||||
void merge_with_routine_info(THD *thd, Warning_info *source);
|
||||
|
||||
/**
|
||||
Reset between two COM_ commands. Warnings are preserved
|
||||
between commands, but statement_warn_count indicates
|
||||
the number of warnings of this particular statement only.
|
||||
*/
|
||||
void reset_for_next_command() { m_statement_warn_count= 0; }
|
||||
|
||||
/**
|
||||
Used for @@warning_count system variable, which prints
|
||||
the number of rows returned by SHOW WARNINGS.
|
||||
*/
|
||||
ulong warn_count() const
|
||||
{
|
||||
/*
|
||||
This may be higher than warn_list.elements if we have
|
||||
had more warnings than thd->variables.max_error_count.
|
||||
*/
|
||||
return (m_warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_NOTE] +
|
||||
m_warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_ERROR] +
|
||||
m_warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_WARN]);
|
||||
}
|
||||
|
||||
/**
|
||||
This is for iteration purposes. We return a non-constant reference
|
||||
since List doesn't have constant iterators.
|
||||
*/
|
||||
List<MYSQL_ERROR> &warn_list() { return m_warn_list; }
|
||||
|
||||
/**
|
||||
The number of errors, or number of rows returned by SHOW ERRORS,
|
||||
also the value of session variable @@error_count.
|
||||
*/
|
||||
ulong error_count() const
|
||||
{
|
||||
return m_warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_ERROR];
|
||||
}
|
||||
|
||||
/** Id of the warning information area. */
|
||||
ulonglong warn_id() const { return m_warn_id; }
|
||||
|
||||
/** Do we have any errors and warnings that we can *show*? */
|
||||
bool is_empty() const { return m_warn_list.elements == 0; }
|
||||
|
||||
/** Increment the current row counter to point at the next row. */
|
||||
void inc_current_row_for_warning() { m_current_row_for_warning++; }
|
||||
/** Reset the current row counter. Start counting from the first row. */
|
||||
void reset_current_row_for_warning() { m_current_row_for_warning= 1; }
|
||||
/** Return the current counter value. */
|
||||
ulong current_row_for_warning() const { return m_current_row_for_warning; }
|
||||
|
||||
ulong statement_warn_count() const { return m_statement_warn_count; }
|
||||
|
||||
/**
|
||||
Reserve some space in the condition area.
|
||||
This is a privileged operation, reserved for the RESIGNAL implementation,
|
||||
as only the RESIGNAL statement is allowed to remove conditions from
|
||||
the condition area.
|
||||
For other statements, new conditions are not added to the condition
|
||||
area once the condition area is full.
|
||||
@param thd The current thread
|
||||
@param count The number of slots to reserve
|
||||
*/
|
||||
void reserve_space(THD *thd, uint count);
|
||||
|
||||
/** Add a new condition to the current list. */
|
||||
MYSQL_ERROR *push_warning(THD *thd,
|
||||
uint sql_errno, const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg);
|
||||
|
||||
/**
|
||||
Set the read only status for this statement area.
|
||||
This is a privileged operation, reserved for the implementation of
|
||||
diagnostics related statements, to enforce that the statement area is
|
||||
left untouched during execution.
|
||||
The diagnostics statements are:
|
||||
- SHOW WARNINGS
|
||||
- SHOW ERRORS
|
||||
- GET DIAGNOSTICS
|
||||
@param read_only the read only property to set
|
||||
*/
|
||||
void set_read_only(bool read_only)
|
||||
{ m_read_only= read_only; }
|
||||
|
||||
/**
|
||||
Read only status.
|
||||
@return the read only property
|
||||
*/
|
||||
bool is_read_only() const
|
||||
{ return m_read_only; }
|
||||
|
||||
private:
|
||||
/** Read only status. */
|
||||
bool m_read_only;
|
||||
|
||||
friend class Resignal_statement;
|
||||
};
|
||||
|
||||
void push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level,
|
||||
uint code, const char *msg);
|
||||
void push_warning_printf(THD *thd, MYSQL_ERROR::enum_warning_level level,
|
||||
uint code, const char *format, ...);
|
||||
void mysql_reset_errors(THD *thd, bool force);
|
||||
bool mysqld_show_warnings(THD *thd, ulong levels_to_show);
|
||||
|
||||
extern const LEX_STRING warning_level_names[];
|
||||
|
||||
#endif // SQL_ERROR_H
|
||||
|
@ -810,7 +810,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
||||
error=write_record(thd, table ,&info);
|
||||
if (error)
|
||||
break;
|
||||
thd->row_count++;
|
||||
thd->warning_info->inc_current_row_for_warning();
|
||||
}
|
||||
|
||||
free_underlaid_joins(thd, &thd->lex->select_lex);
|
||||
@ -949,10 +949,12 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
||||
if (ignore)
|
||||
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
|
||||
(lock_type == TL_WRITE_DELAYED) ? (ulong) 0 :
|
||||
(ulong) (info.records - info.copied), (ulong) thd->cuted_fields);
|
||||
(ulong) (info.records - info.copied),
|
||||
(ulong) thd->warning_info->statement_warn_count());
|
||||
else
|
||||
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
|
||||
(ulong) (info.deleted + updated), (ulong) thd->cuted_fields);
|
||||
(ulong) (info.deleted + updated),
|
||||
(ulong) thd->warning_info->statement_warn_count());
|
||||
thd->row_count_func= info.copied + info.deleted + updated;
|
||||
::my_ok(thd, (ulong) thd->row_count_func, id, buff);
|
||||
}
|
||||
@ -1955,7 +1957,7 @@ bool delayed_get_table(THD *thd, TABLE_LIST *table_list)
|
||||
main thread. Use of my_message will enable stored
|
||||
procedures continue handlers.
|
||||
*/
|
||||
my_message(di->thd.main_da.sql_errno(), di->thd.main_da.message(),
|
||||
my_message(di->thd.stmt_da->sql_errno(), di->thd.stmt_da->message(),
|
||||
MYF(0));
|
||||
}
|
||||
di->unlock();
|
||||
@ -2032,7 +2034,7 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd)
|
||||
goto error;
|
||||
if (dead)
|
||||
{
|
||||
my_message(thd.main_da.sql_errno(), thd.main_da.message(), MYF(0));
|
||||
my_message(thd.stmt_da->sql_errno(), thd.stmt_da->message(), MYF(0));
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
@ -2305,8 +2307,8 @@ pthread_handler_t handle_delayed_insert(void *arg)
|
||||
if (my_thread_init())
|
||||
{
|
||||
/* Can't use my_error since store_globals has not yet been called */
|
||||
thd->main_da.set_error_status(thd, ER_OUT_OF_RESOURCES,
|
||||
ER(ER_OUT_OF_RESOURCES));
|
||||
thd->stmt_da->set_error_status(thd, ER_OUT_OF_RESOURCES,
|
||||
ER(ER_OUT_OF_RESOURCES), NULL);
|
||||
goto end;
|
||||
}
|
||||
#endif
|
||||
@ -2316,8 +2318,8 @@ pthread_handler_t handle_delayed_insert(void *arg)
|
||||
if (init_thr_lock() || thd->store_globals())
|
||||
{
|
||||
/* Can't use my_error since store_globals has perhaps failed */
|
||||
thd->main_da.set_error_status(thd, ER_OUT_OF_RESOURCES,
|
||||
ER(ER_OUT_OF_RESOURCES));
|
||||
thd->stmt_da->set_error_status(thd, ER_OUT_OF_RESOURCES,
|
||||
ER(ER_OUT_OF_RESOURCES), NULL);
|
||||
thd->fatal_error();
|
||||
goto err;
|
||||
}
|
||||
@ -2744,7 +2746,7 @@ bool Delayed_insert::handle_inserts(void)
|
||||
{
|
||||
/* This should never happen */
|
||||
table->file->print_error(error,MYF(0));
|
||||
sql_print_error("%s", thd.main_da.message());
|
||||
sql_print_error("%s", thd.stmt_da->message());
|
||||
DBUG_PRINT("error", ("HA_EXTRA_NO_CACHE failed in loop"));
|
||||
goto err;
|
||||
}
|
||||
@ -2786,7 +2788,7 @@ bool Delayed_insert::handle_inserts(void)
|
||||
if ((error=table->file->extra(HA_EXTRA_NO_CACHE)))
|
||||
{ // This shouldn't happen
|
||||
table->file->print_error(error,MYF(0));
|
||||
sql_print_error("%s", thd.main_da.message());
|
||||
sql_print_error("%s", thd.stmt_da->message());
|
||||
DBUG_PRINT("error", ("HA_EXTRA_NO_CACHE failed after loop"));
|
||||
goto err;
|
||||
}
|
||||
@ -3254,10 +3256,12 @@ bool select_insert::send_eof()
|
||||
char buff[160];
|
||||
if (info.ignore)
|
||||
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
|
||||
(ulong) (info.records - info.copied), (ulong) thd->cuted_fields);
|
||||
(ulong) (info.records - info.copied),
|
||||
(ulong) thd->warning_info->statement_warn_count());
|
||||
else
|
||||
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
|
||||
(ulong) (info.deleted+info.updated), (ulong) thd->cuted_fields);
|
||||
(ulong) (info.deleted+info.updated),
|
||||
(ulong) thd->warning_info->statement_warn_count());
|
||||
thd->row_count_func= info.copied + info.deleted +
|
||||
((thd->client_capabilities & CLIENT_FOUND_ROWS) ?
|
||||
info.touched : info.updated);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user