|
|
|
@ -1286,7 +1286,7 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len, |
|
|
|
ev = new Rand_log_event(buf, description_event); |
|
|
|
break; |
|
|
|
case USER_VAR_EVENT: |
|
|
|
ev = new User_var_log_event(buf, description_event); |
|
|
|
ev = new User_var_log_event(buf, event_len, description_event); |
|
|
|
break; |
|
|
|
case FORMAT_DESCRIPTION_EVENT: |
|
|
|
ev = new Format_description_log_event(buf, event_len, description_event); |
|
|
|
@ -5685,18 +5685,34 @@ void User_var_log_event::pack_info(Protocol* protocol) |
|
|
|
|
|
|
|
|
|
|
|
User_var_log_event:: |
|
|
|
User_var_log_event(const char* buf, |
|
|
|
User_var_log_event(const char* buf, uint event_len, |
|
|
|
const Format_description_log_event* description_event) |
|
|
|
:Log_event(buf, description_event) |
|
|
|
#ifndef MYSQL_CLIENT
|
|
|
|
, deferred(false) |
|
|
|
#endif
|
|
|
|
{ |
|
|
|
bool error= false; |
|
|
|
const char* buf_start= buf; |
|
|
|
/* The Post-Header is empty. The Variable Data part begins immediately. */ |
|
|
|
buf+= description_event->common_header_len + |
|
|
|
description_event->post_header_len[USER_VAR_EVENT-1]; |
|
|
|
name_len= uint4korr(buf); |
|
|
|
name= (char *) buf + UV_NAME_LEN_SIZE; |
|
|
|
|
|
|
|
/*
|
|
|
|
We don't know yet is_null value, so we must assume that name_len |
|
|
|
may have the bigger value possible, is_null= True and there is no |
|
|
|
payload for val. |
|
|
|
*/ |
|
|
|
if (0 == name_len || |
|
|
|
!valid_buffer_range<uint>(name_len, buf_start, name, |
|
|
|
event_len - UV_VAL_IS_NULL)) |
|
|
|
{ |
|
|
|
error= true; |
|
|
|
goto err; |
|
|
|
} |
|
|
|
|
|
|
|
buf+= UV_NAME_LEN_SIZE + name_len; |
|
|
|
is_null= (bool) *buf; |
|
|
|
if (is_null) |
|
|
|
@ -5708,13 +5724,31 @@ User_var_log_event(const char* buf, |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
if (!valid_buffer_range<uint>(UV_VAL_IS_NULL + UV_VAL_TYPE_SIZE |
|
|
|
+ UV_CHARSET_NUMBER_SIZE + UV_VAL_LEN_SIZE, |
|
|
|
buf_start, buf, event_len)) |
|
|
|
{ |
|
|
|
error= true; |
|
|
|
goto err; |
|
|
|
} |
|
|
|
|
|
|
|
type= (Item_result) buf[UV_VAL_IS_NULL]; |
|
|
|
charset_number= uint4korr(buf + UV_VAL_IS_NULL + UV_VAL_TYPE_SIZE); |
|
|
|
val_len= uint4korr(buf + UV_VAL_IS_NULL + UV_VAL_TYPE_SIZE + |
|
|
|
UV_CHARSET_NUMBER_SIZE); |
|
|
|
val= (char *) (buf + UV_VAL_IS_NULL + UV_VAL_TYPE_SIZE + |
|
|
|
UV_CHARSET_NUMBER_SIZE + UV_VAL_LEN_SIZE); |
|
|
|
|
|
|
|
if (!valid_buffer_range<uint>(val_len, buf_start, val, event_len)) |
|
|
|
{ |
|
|
|
error= true; |
|
|
|
goto err; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
err: |
|
|
|
if (error) |
|
|
|
name= 0; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -5860,8 +5894,9 @@ void User_var_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info) |
|
|
|
char *hex_str; |
|
|
|
CHARSET_INFO *cs; |
|
|
|
|
|
|
|
if (!(hex_str= (char *)my_alloca(2*val_len+1+2))) // 2 hex digits / byte
|
|
|
|
break; // no error, as we are 'void'
|
|
|
|
hex_str= (char *)my_malloc(2*val_len+1+2,MYF(MY_WME)); // 2 hex digits / byte
|
|
|
|
if (!hex_str) |
|
|
|
return; |
|
|
|
str_to_hex(hex_str, val, val_len); |
|
|
|
/*
|
|
|
|
For proper behaviour when mysqlbinlog|mysql, we need to explicitely |
|
|
|
@ -5879,7 +5914,7 @@ void User_var_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info) |
|
|
|
my_b_printf(&cache, ":=_%s %s COLLATE `%s`%s\n", |
|
|
|
cs->csname, hex_str, cs->name, |
|
|
|
print_event_info->delimiter); |
|
|
|
my_afree(hex_str); |
|
|
|
my_free(hex_str, MYF(MY_WME)); |
|
|
|
} |
|
|
|
break; |
|
|
|
case ROW_RESULT: |
|
|
|
|