Commit 85d6278f authored by Monty's avatar Monty Committed by Sergei Golubchik

Change replication to use uchar for all buffers instead of char

This change is to get rid of randomly failing tests, especially those
that reads random position of the binary log. From looking at the logs
it's clear that some failures is because of a read char (with value >= 128)
is converted to a big long value. Using uchar everywhere makes this much
less likely to happen.
Another benefit is that a lot of cast of char to uchar could be removed.

Other things:
- Removed some extra space before '=' and '+=' in assignments
- Fixed indentations and lines > 80 characters
- Replace '16' with 'element_size' (from class definition) in
  Gtid_list_log_event()
parent db9398ba
...@@ -216,7 +216,7 @@ Log_event* read_remote_annotate_event(uchar* net_buf, ulong event_len, ...@@ -216,7 +216,7 @@ Log_event* read_remote_annotate_event(uchar* net_buf, ulong event_len,
memcpy(event_buf, net_buf, event_len); memcpy(event_buf, net_buf, event_len);
event_buf[event_len]= 0; event_buf[event_len]= 0;
if (!(event= Log_event::read_log_event((const char*) event_buf, event_len, if (!(event= Log_event::read_log_event(event_buf, event_len,
error_msg, glob_description_event, error_msg, glob_description_event,
opt_verify_binlog_checksum))) opt_verify_binlog_checksum)))
{ {
...@@ -227,7 +227,7 @@ Log_event* read_remote_annotate_event(uchar* net_buf, ulong event_len, ...@@ -227,7 +227,7 @@ Log_event* read_remote_annotate_event(uchar* net_buf, ulong event_len,
Ensure the event->temp_buf is pointing to the allocated buffer. Ensure the event->temp_buf is pointing to the allocated buffer.
(TRUE = free temp_buf on the event deletion) (TRUE = free temp_buf on the event deletion)
*/ */
event->register_temp_buf((char*)event_buf, TRUE); event->register_temp_buf(event_buf, TRUE);
return event; return event;
} }
...@@ -512,8 +512,7 @@ Exit_status Load_log_processor::load_old_format_file(NET* net, ...@@ -512,8 +512,7 @@ Exit_status Load_log_processor::load_old_format_file(NET* net,
error("Illegal length of packet read from net."); error("Illegal length of packet read from net.");
return ERROR_STOP; return ERROR_STOP;
} }
if (my_write(file, (uchar*) net->read_pos, if (my_write(file, net->read_pos, (uint) packet_len, MYF(MY_WME|MY_NABP)))
(uint) packet_len, MYF(MY_WME|MY_NABP)))
return ERROR_STOP; return ERROR_STOP;
} }
...@@ -2350,7 +2349,7 @@ static Exit_status handle_event_text_mode(PRINT_EVENT_INFO *print_event_info, ...@@ -2350,7 +2349,7 @@ static Exit_status handle_event_text_mode(PRINT_EVENT_INFO *print_event_info,
} }
else else
{ {
if (!(ev= Log_event::read_log_event((const char*) net->read_pos + 1 , if (!(ev= Log_event::read_log_event(net->read_pos + 1 ,
*len - 1, &error_msg, *len - 1, &error_msg,
glob_description_event, glob_description_event,
opt_verify_binlog_checksum))) opt_verify_binlog_checksum)))
...@@ -2362,7 +2361,7 @@ static Exit_status handle_event_text_mode(PRINT_EVENT_INFO *print_event_info, ...@@ -2362,7 +2361,7 @@ static Exit_status handle_event_text_mode(PRINT_EVENT_INFO *print_event_info,
If reading from a remote host, ensure the temp_buf for the If reading from a remote host, ensure the temp_buf for the
Log_event class is pointing to the incoming stream. Log_event class is pointing to the incoming stream.
*/ */
ev->register_temp_buf((char *) net->read_pos + 1, FALSE); ev->register_temp_buf(net->read_pos + 1, FALSE);
} }
Log_event_type type= ev->get_type_code(); Log_event_type type= ev->get_type_code();
...@@ -2463,7 +2462,7 @@ static Exit_status handle_event_raw_mode(PRINT_EVENT_INFO *print_event_info, ...@@ -2463,7 +2462,7 @@ static Exit_status handle_event_raw_mode(PRINT_EVENT_INFO *print_event_info,
const char* logname, uint logname_len) const char* logname, uint logname_len)
{ {
const char *error_msg; const char *error_msg;
const unsigned char *read_pos= mysql->net.read_pos + 1; const uchar *read_pos= mysql->net.read_pos + 1;
Log_event_type type; Log_event_type type;
DBUG_ENTER("handle_event_raw_mode"); DBUG_ENTER("handle_event_raw_mode");
DBUG_ASSERT(opt_raw_mode && remote_opt); DBUG_ASSERT(opt_raw_mode && remote_opt);
...@@ -2476,7 +2475,7 @@ static Exit_status handle_event_raw_mode(PRINT_EVENT_INFO *print_event_info, ...@@ -2476,7 +2475,7 @@ static Exit_status handle_event_raw_mode(PRINT_EVENT_INFO *print_event_info,
if (type == ROTATE_EVENT || type == FORMAT_DESCRIPTION_EVENT) if (type == ROTATE_EVENT || type == FORMAT_DESCRIPTION_EVENT)
{ {
Log_event *ev; Log_event *ev;
if (!(ev= Log_event::read_log_event((const char*) read_pos , if (!(ev= Log_event::read_log_event(read_pos ,
*len - 1, &error_msg, *len - 1, &error_msg,
glob_description_event, glob_description_event,
opt_verify_binlog_checksum))) opt_verify_binlog_checksum)))
...@@ -2489,7 +2488,7 @@ static Exit_status handle_event_raw_mode(PRINT_EVENT_INFO *print_event_info, ...@@ -2489,7 +2488,7 @@ static Exit_status handle_event_raw_mode(PRINT_EVENT_INFO *print_event_info,
If reading from a remote host, ensure the temp_buf for the If reading from a remote host, ensure the temp_buf for the
Log_event class is pointing to the incoming stream. Log_event class is pointing to the incoming stream.
*/ */
ev->register_temp_buf((char *) read_pos, FALSE); ev->register_temp_buf(const_cast<uchar*>(read_pos), FALSE);
if (type == ROTATE_EVENT) if (type == ROTATE_EVENT)
{ {
......
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include "rpl_constants.h" #include "rpl_constants.h"
#include "sql_digest.h" #include "sql_digest.h"
#include "zlib.h" #include "zlib.h"
#include "myisampack.h"
#define my_b_write_string(A, B) my_b_write((A), (uchar*)(B), (uint) (sizeof(B) - 1)) #define my_b_write_string(A, B) my_b_write((A), (uchar*)(B), (uint) (sizeof(B) - 1))
...@@ -143,7 +144,7 @@ class Write_on_release_cache ...@@ -143,7 +144,7 @@ class Write_on_release_cache
constructor, but it would be possible to create a subclass constructor, but it would be possible to create a subclass
holding the IO_CACHE itself. holding the IO_CACHE itself.
*/ */
Write_on_release_cache(IO_CACHE *cache, FILE *file, flag_set flags = 0, Log_event *ev = NULL) Write_on_release_cache(IO_CACHE *cache, FILE *file, flag_set flags= 0, Log_event *ev= NULL)
: m_cache(cache), m_file(file), m_flags(flags), m_ev(ev) : m_cache(cache), m_file(file), m_flags(flags), m_ev(ev)
{ {
reinit_io_cache(m_cache, WRITE_CACHE, 0L, FALSE, TRUE); reinit_io_cache(m_cache, WRITE_CACHE, 0L, FALSE, TRUE);
...@@ -238,13 +239,13 @@ class Write_on_release_cache ...@@ -238,13 +239,13 @@ class Write_on_release_cache
read_str() read_str()
*/ */
static inline int read_str(const char **buf, const char *buf_end, static inline bool read_str(const uchar **buf, const uchar *buf_end,
const char **str, uint8 *len) const char **str, uint8 *len)
{ {
if (*buf + ((uint) (uchar) **buf) >= buf_end) if (*buf + ((uint) **buf) >= buf_end)
return 1; return 1;
*len= (uint8) **buf; *len= (uint8) **buf;
*str= (*buf)+1; *str= (char*) (*buf)+1;
(*buf)+= (uint) *len+1; (*buf)+= (uint) *len+1;
return 0; return 0;
} }
...@@ -304,44 +305,44 @@ uint32 binlog_get_compress_len(uint32 len) ...@@ -304,44 +305,44 @@ uint32 binlog_get_compress_len(uint32 len)
return zero if successful, others otherwise. return zero if successful, others otherwise.
*/ */
int binlog_buf_compress(const char *src, char *dst, uint32 len, uint32 *comlen) int binlog_buf_compress(const uchar *src, uchar *dst, uint32 len, uint32 *comlen)
{ {
uchar lenlen; uchar lenlen;
if (len & 0xFF000000) if (len & 0xFF000000)
{ {
dst[1] = uchar(len >> 24); dst[1]= uchar(len >> 24);
dst[2] = uchar(len >> 16); dst[2]= uchar(len >> 16);
dst[3] = uchar(len >> 8); dst[3]= uchar(len >> 8);
dst[4] = uchar(len); dst[4]= uchar(len);
lenlen = 4; lenlen= 4;
} }
else if (len & 0x00FF0000) else if (len & 0x00FF0000)
{ {
dst[1] = uchar(len >> 16); dst[1]= uchar(len >> 16);
dst[2] = uchar(len >> 8); dst[2]= uchar(len >> 8);
dst[3] = uchar(len); dst[3]= uchar(len);
lenlen = 3; lenlen= 3;
} }
else if (len & 0x0000FF00) else if (len & 0x0000FF00)
{ {
dst[1] = uchar(len >> 8); dst[1]= uchar(len >> 8);
dst[2] = uchar(len); dst[2]= uchar(len);
lenlen = 2; lenlen= 2;
} }
else else
{ {
dst[1] = uchar(len); dst[1]= uchar(len);
lenlen = 1; lenlen= 1;
} }
dst[0] = 0x80 | (lenlen & 0x07); dst[0]= 0x80 | (lenlen & 0x07);
uLongf tmplen = (uLongf)*comlen - BINLOG_COMPRESSED_HEADER_LEN - lenlen - 1; uLongf tmplen= (uLongf)*comlen - BINLOG_COMPRESSED_HEADER_LEN - lenlen - 1;
if (compress((Bytef *)dst + BINLOG_COMPRESSED_HEADER_LEN + lenlen, &tmplen, if (compress((Bytef *)dst + BINLOG_COMPRESSED_HEADER_LEN + lenlen, &tmplen,
(const Bytef *)src, (uLongf)len) != Z_OK) (const Bytef *)src, (uLongf)len) != Z_OK)
{ {
return 1; return 1;
} }
*comlen = (uint32)tmplen + BINLOG_COMPRESSED_HEADER_LEN + lenlen; *comlen= (uint32)tmplen + BINLOG_COMPRESSED_HEADER_LEN + lenlen;
return 0; return 0;
} }
...@@ -360,16 +361,17 @@ int binlog_buf_compress(const char *src, char *dst, uint32 len, uint32 *comlen) ...@@ -360,16 +361,17 @@ int binlog_buf_compress(const char *src, char *dst, uint32 len, uint32 *comlen)
int int
query_event_uncompress(const Format_description_log_event *description_event, query_event_uncompress(const Format_description_log_event *description_event,
bool contain_checksum, const char *src, ulong src_len, bool contain_checksum, const uchar *src, ulong src_len,
char* buf, ulong buf_size, bool* is_malloc, char **dst, uchar* buf, ulong buf_size, bool* is_malloc, uchar **dst,
ulong *newlen) ulong *newlen)
{ {
ulong len = uint4korr(src + EVENT_LEN_OFFSET); ulong len= uint4korr(src + EVENT_LEN_OFFSET);
const char *tmp = src; const uchar *tmp= src;
const char *end = src + len; const uchar *end= src + len;
uchar *new_dst;
// bad event // bad event
if (src_len < len ) if (src_len < len)
return 1; return 1;
DBUG_ASSERT((uchar)src[EVENT_TYPE_OFFSET] == QUERY_COMPRESSED_EVENT); DBUG_ASSERT((uchar)src[EVENT_TYPE_OFFSET] == QUERY_COMPRESSED_EVENT);
...@@ -378,97 +380,90 @@ query_event_uncompress(const Format_description_log_event *description_event, ...@@ -378,97 +380,90 @@ query_event_uncompress(const Format_description_log_event *description_event,
uint8 post_header_len= uint8 post_header_len=
description_event->post_header_len[QUERY_COMPRESSED_EVENT-1]; description_event->post_header_len[QUERY_COMPRESSED_EVENT-1];
*is_malloc = false; *is_malloc= false;
tmp += common_header_len; tmp+= common_header_len;
// bad event // bad event
if (end <= tmp) if (end <= tmp)
return 1; return 1;
uint db_len = (uint)tmp[Q_DB_LEN_OFFSET]; uint db_len= (uint)tmp[Q_DB_LEN_OFFSET];
uint16 status_vars_len= uint2korr(tmp + Q_STATUS_VARS_LEN_OFFSET); uint16 status_vars_len= uint2korr(tmp + Q_STATUS_VARS_LEN_OFFSET);
tmp += post_header_len + status_vars_len + db_len + 1; tmp+= post_header_len + status_vars_len + db_len + 1;
// bad event // bad event
if (end <= tmp) if (end <= tmp)
return 1; return 1;
int32 comp_len = (int32)(len - (tmp - src) - int32 comp_len= (int32)(len - (tmp - src) -
(contain_checksum ? BINLOG_CHECKSUM_LEN : 0)); (contain_checksum ? BINLOG_CHECKSUM_LEN : 0));
uint32 un_len = binlog_get_uncompress_len(tmp); uint32 un_len= binlog_get_uncompress_len(tmp);
// bad event // bad event
if (comp_len < 0 || un_len == 0) if (comp_len < 0 || un_len == 0)
return 1; return 1;
*newlen = (ulong)(tmp - src) + un_len; *newlen= (ulong)(tmp - src) + un_len;
if(contain_checksum) if (contain_checksum)
*newlen += BINLOG_CHECKSUM_LEN; *newlen+= BINLOG_CHECKSUM_LEN;
uint32 alloc_size = (uint32)ALIGN_SIZE(*newlen);
char *new_dst = NULL;
uint32 alloc_size= (uint32)ALIGN_SIZE(*newlen);
if (alloc_size <= buf_size) if (alloc_size <= buf_size)
{ new_dst= buf;
new_dst = buf;
}
else else
{ {
new_dst = (char *)my_malloc(PSI_INSTRUMENT_ME, alloc_size, MYF(MY_WME)); new_dst= (uchar *) my_malloc(PSI_INSTRUMENT_ME, alloc_size, MYF(MY_WME));
if (!new_dst) if (!new_dst)
return 1; return 1;
*is_malloc= true;
*is_malloc = true;
} }
/* copy the head*/ /* copy the head*/
memcpy(new_dst, src , tmp - src); memcpy(new_dst, src , tmp - src);
if (binlog_buf_uncompress(tmp, new_dst + (tmp - src), if (binlog_buf_uncompress(tmp, new_dst + (tmp - src), comp_len, &un_len))
comp_len, &un_len))
{ {
if (*is_malloc) if (*is_malloc)
{
*is_malloc= false;
my_free(new_dst); my_free(new_dst);
}
*is_malloc = false;
return 1; return 1;
} }
new_dst[EVENT_TYPE_OFFSET] = QUERY_EVENT; new_dst[EVENT_TYPE_OFFSET]= QUERY_EVENT;
int4store(new_dst + EVENT_LEN_OFFSET, *newlen); int4store(new_dst + EVENT_LEN_OFFSET, *newlen);
if(contain_checksum) if (contain_checksum)
{ {
ulong clear_len = *newlen - BINLOG_CHECKSUM_LEN; ulong clear_len= *newlen - BINLOG_CHECKSUM_LEN;
int4store(new_dst + clear_len, int4store(new_dst + clear_len,
my_checksum(0L, (uchar *)new_dst, clear_len)); my_checksum(0L, (uchar *)new_dst, clear_len));
} }
*dst = new_dst; *dst= new_dst;
return 0; return 0;
} }
int int
row_log_event_uncompress(const Format_description_log_event *description_event, row_log_event_uncompress(const Format_description_log_event *description_event,
bool contain_checksum, const char *src, ulong src_len, bool contain_checksum, const uchar *src, ulong src_len,
char* buf, ulong buf_size, bool* is_malloc, char **dst, uchar* buf, ulong buf_size, bool* is_malloc,
ulong *newlen) uchar **dst, ulong *newlen)
{ {
Log_event_type type = (Log_event_type)(uchar)src[EVENT_TYPE_OFFSET]; Log_event_type type= (Log_event_type)(uchar)src[EVENT_TYPE_OFFSET];
ulong len = uint4korr(src + EVENT_LEN_OFFSET); ulong len= uint4korr(src + EVENT_LEN_OFFSET);
const char *tmp = src; const uchar *tmp= src;
char *new_dst = NULL; uchar *new_dst= NULL;
const char *end = tmp + len; const uchar *end= tmp + len;
// bad event
if (src_len < len) if (src_len < len)
return 1; return 1; // bad event
DBUG_ASSERT(LOG_EVENT_IS_ROW_COMPRESSED(type)); DBUG_ASSERT(LOG_EVENT_IS_ROW_COMPRESSED(type));
uint8 common_header_len= description_event->common_header_len; uint8 common_header_len= description_event->common_header_len;
uint8 post_header_len= description_event->post_header_len[type-1]; uint8 post_header_len= description_event->post_header_len[type-1];
tmp += common_header_len + ROWS_HEADER_LEN_V1; tmp+= common_header_len + ROWS_HEADER_LEN_V1;
if (post_header_len == ROWS_HEADER_LEN_V2) if (post_header_len == ROWS_HEADER_LEN_V2)
{ {
/* /*
...@@ -476,15 +471,14 @@ row_log_event_uncompress(const Format_description_log_event *description_event, ...@@ -476,15 +471,14 @@ row_log_event_uncompress(const Format_description_log_event *description_event,
which includes length bytes which includes length bytes
*/ */
// bad event
if (end - tmp <= 2) if (end - tmp <= 2)
return 1; return 1; // bad event
uint16 var_header_len= uint2korr(tmp); uint16 var_header_len= uint2korr(tmp);
DBUG_ASSERT(var_header_len >= 2); DBUG_ASSERT(var_header_len >= 2);
/* skip over var-len header, extracting 'chunks' */ /* skip over var-len header, extracting 'chunks' */
tmp += var_header_len; tmp+= var_header_len;
/* get the uncompressed event type */ /* get the uncompressed event type */
type= type=
...@@ -497,51 +491,46 @@ row_log_event_uncompress(const Format_description_log_event *description_event, ...@@ -497,51 +491,46 @@ row_log_event_uncompress(const Format_description_log_event *description_event,
(type - WRITE_ROWS_COMPRESSED_EVENT_V1 + WRITE_ROWS_EVENT_V1); (type - WRITE_ROWS_COMPRESSED_EVENT_V1 + WRITE_ROWS_EVENT_V1);
} }
//bad event
if (end <= tmp) if (end <= tmp)
return 1; return 1; //bad event
ulong m_width = net_field_length((uchar **)&tmp); ulong m_width= net_field_length((uchar **)&tmp);
tmp += (m_width + 7) / 8; tmp+= (m_width + 7) / 8;
if (type == UPDATE_ROWS_EVENT_V1 || type == UPDATE_ROWS_EVENT) if (type == UPDATE_ROWS_EVENT_V1 || type == UPDATE_ROWS_EVENT)
{ {
tmp += (m_width + 7) / 8; tmp+= (m_width + 7) / 8;
} }
//bad event
if (end <= tmp) if (end <= tmp)
return 1; return 1; //bad event
uint32 un_len = binlog_get_uncompress_len(tmp); uint32 un_len= binlog_get_uncompress_len(tmp);
//bad event
if (un_len == 0) if (un_len == 0)
return 1; return 1; //bad event
int32 comp_len = (int32)(len - (tmp - src) - int32 comp_len= (int32)(len - (tmp - src) -
(contain_checksum ? BINLOG_CHECKSUM_LEN : 0)); (contain_checksum ? BINLOG_CHECKSUM_LEN : 0));
//bad event
if (comp_len <=0) if (comp_len <=0)
return 1; return 1; //bad event
*newlen = ulong(tmp - src) + un_len; *newlen= ulong(tmp - src) + un_len;
if(contain_checksum) if (contain_checksum)
*newlen += BINLOG_CHECKSUM_LEN; *newlen+= BINLOG_CHECKSUM_LEN;
size_t alloc_size = ALIGN_SIZE(*newlen); size_t alloc_size= ALIGN_SIZE(*newlen);
*is_malloc = false; *is_malloc= false;
if (alloc_size <= buf_size) if (alloc_size <= buf_size)
{ {
new_dst = buf; new_dst= buf;
} }
else else
{ {
new_dst = (char *)my_malloc(PSI_INSTRUMENT_ME, alloc_size, MYF(MY_WME)); new_dst= (uchar*) my_malloc(PSI_INSTRUMENT_ME, alloc_size, MYF(MY_WME));
if (!new_dst) if (!new_dst)
return 1; return 1;
*is_malloc= true;
*is_malloc = true;
} }
/* Copy the head. */ /* Copy the head. */
...@@ -552,18 +541,18 @@ row_log_event_uncompress(const Format_description_log_event *description_event, ...@@ -552,18 +541,18 @@ row_log_event_uncompress(const Format_description_log_event *description_event,
{ {
if (*is_malloc) if (*is_malloc)
my_free(new_dst); my_free(new_dst);
return 1; return 1;
} }
new_dst[EVENT_TYPE_OFFSET] = type; new_dst[EVENT_TYPE_OFFSET]= type;
int4store(new_dst + EVENT_LEN_OFFSET, *newlen); int4store(new_dst + EVENT_LEN_OFFSET, *newlen);
if(contain_checksum){ if (contain_checksum)
ulong clear_len = *newlen - BINLOG_CHECKSUM_LEN; {
ulong clear_len= *newlen - BINLOG_CHECKSUM_LEN;
int4store(new_dst + clear_len, int4store(new_dst + clear_len,
my_checksum(0L, (uchar *)new_dst, clear_len)); my_checksum(0L, (uchar *)new_dst, clear_len));
} }
*dst = new_dst; *dst= new_dst;
return 0; return 0;
} }
...@@ -572,33 +561,33 @@ row_log_event_uncompress(const Format_description_log_event *description_event, ...@@ -572,33 +561,33 @@ row_log_event_uncompress(const Format_description_log_event *description_event,
return 0 means error. return 0 means error.
*/ */
uint32 binlog_get_uncompress_len(const char *buf) uint32 binlog_get_uncompress_len(const uchar *buf)
{ {
uint32 len = 0; uint32 len, lenlen;
uint32 lenlen = 0;
if ((buf == NULL) || ((buf[0] & 0xe0) != 0x80)) if ((buf == NULL) || ((buf[0] & 0xe0) != 0x80))
return len; return 0;
lenlen = buf[0] & 0x07; lenlen= buf[0] & 0x07;
switch(lenlen) buf++;
{ /* Length is stored in high byte first order, like myisam keys */
switch(lenlen) {
case 1: case 1:
len = uchar(buf[1]); len= buf[0];
break; break;
case 2: case 2:
len = uchar(buf[1]) << 8 | uchar(buf[2]); len= mi_uint2korr(buf);
break; break;
case 3: case 3:
len = uchar(buf[1]) << 16 | uchar(buf[2]) << 8 | uchar(buf[3]); len= mi_uint3korr(buf);
break; break;
case 4: case 4:
len = uchar(buf[1]) << 24 | uchar(buf[2]) << 16 | len= mi_uint4korr(buf);
uchar(buf[3]) << 8 | uchar(buf[4]);
break; break;
default: default:
DBUG_ASSERT(lenlen >= 1 && lenlen <= 4); DBUG_ASSERT(lenlen >= 1 && lenlen <= 4);
len= 0;
break; break;
} }
return len; return len;
...@@ -615,27 +604,22 @@ uint32 binlog_get_uncompress_len(const char *buf) ...@@ -615,27 +604,22 @@ uint32 binlog_get_uncompress_len(const char *buf)
return zero if successful, others otherwise. return zero if successful, others otherwise.
*/ */
int binlog_buf_uncompress(const char *src, char *dst, uint32 len, int binlog_buf_uncompress(const uchar *src, uchar *dst, uint32 len,
uint32 *newlen) uint32 *newlen)
{ {
if((src[0] & 0x80) == 0) if ((src[0] & 0x80) == 0)
{
return 1; return 1;
}
uint32 lenlen= src[0] & 0x07; uint32 lenlen= src[0] & 0x07;
uLongf buflen= *newlen; uLongf buflen= *newlen; // zlib type
uint32 alg = (src[0] & 0x70) >> 4; uint32 alg= (src[0] & 0x70) >> 4;
switch(alg) switch(alg) {
{
case 0: case 0:
// zlib // zlib
if(uncompress((Bytef *)dst, &buflen, if (uncompress((Bytef *)dst, &buflen,
(const Bytef*)src + 1 + lenlen, len - 1 - lenlen) != Z_OK) (const Bytef*)src + 1 + lenlen, len - 1 - lenlen) != Z_OK)
{
return 1; return 1;
}
break; break;
default: default:
//TODO //TODO
...@@ -644,7 +628,7 @@ int binlog_buf_uncompress(const char *src, char *dst, uint32 len, ...@@ -644,7 +628,7 @@ int binlog_buf_uncompress(const char *src, char *dst, uint32 len,
} }
DBUG_ASSERT(*newlen == (uint32)buflen); DBUG_ASSERT(*newlen == (uint32)buflen);
*newlen = (uint32)buflen; *newlen= (uint32)buflen;
return 0; return 0;
} }
...@@ -728,17 +712,17 @@ const char* Log_event::get_type_str() ...@@ -728,17 +712,17 @@ const char* Log_event::get_type_str()
Log_event::Log_event() Log_event::Log_event()
*/ */
Log_event::Log_event(const char* buf, Log_event::Log_event(const uchar *buf,
const Format_description_log_event* description_event) const Format_description_log_event* description_event)
:temp_buf(0), exec_time(0), cache_type(Log_event::EVENT_INVALID_CACHE), :temp_buf(0), exec_time(0), cache_type(Log_event::EVENT_INVALID_CACHE),
checksum_alg(BINLOG_CHECKSUM_ALG_UNDEF) checksum_alg(BINLOG_CHECKSUM_ALG_UNDEF)
{ {
#ifndef MYSQL_CLIENT #ifndef MYSQL_CLIENT
thd = 0; thd= 0;
#endif #endif
when = uint4korr(buf); when= uint4korr(buf);
when_sec_part= ~0UL; when_sec_part= ~0UL;
server_id = uint4korr(buf + SERVER_ID_OFFSET); server_id= uint4korr(buf + SERVER_ID_OFFSET);
data_written= uint4korr(buf + EVENT_LEN_OFFSET); data_written= uint4korr(buf + EVENT_LEN_OFFSET);
if (description_event->binlog_version==1) if (description_event->binlog_version==1)
{ {
...@@ -876,7 +860,7 @@ int Log_event::read_log_event(IO_CACHE* file, String* packet, ...@@ -876,7 +860,7 @@ int Log_event::read_log_event(IO_CACHE* file, String* packet,
WolfSSL reads memory out of bounds with decryption/NOPAD) WolfSSL reads memory out of bounds with decryption/NOPAD)
We allocate a little more memory therefore. We allocate a little more memory therefore.
*/ */
sz += MY_AES_BLOCK_SIZE; sz+= MY_AES_BLOCK_SIZE;
#endif #endif
char *newpkt= (char*)my_malloc(PSI_INSTRUMENT_ME, sz, MYF(MY_WME)); char *newpkt= (char*)my_malloc(PSI_INSTRUMENT_ME, sz, MYF(MY_WME));
if (!newpkt) if (!newpkt)
...@@ -909,10 +893,10 @@ int Log_event::read_log_event(IO_CACHE* file, String* packet, ...@@ -909,10 +893,10 @@ int Log_event::read_log_event(IO_CACHE* file, String* packet,
{ {
/* Corrupt the event for Dump thread*/ /* Corrupt the event for Dump thread*/
DBUG_EXECUTE_IF("corrupt_read_log_event2", DBUG_EXECUTE_IF("corrupt_read_log_event2",
uchar *debug_event_buf_c = (uchar*) packet->ptr() + ev_offset; uchar *debug_event_buf_c= (uchar*) packet->ptr() + ev_offset;
if (debug_event_buf_c[EVENT_TYPE_OFFSET] != FORMAT_DESCRIPTION_EVENT) if (debug_event_buf_c[EVENT_TYPE_OFFSET] != FORMAT_DESCRIPTION_EVENT)
{ {
int debug_cor_pos = rand() % (data_len - BINLOG_CHECKSUM_LEN); int debug_cor_pos= rand() % (data_len - BINLOG_CHECKSUM_LEN);
debug_event_buf_c[debug_cor_pos] =~ debug_event_buf_c[debug_cor_pos]; debug_event_buf_c[debug_cor_pos] =~ debug_event_buf_c[debug_cor_pos];
DBUG_PRINT("info", ("Corrupt the event at Log_event::read_log_event: byte on position %d", debug_cor_pos)); DBUG_PRINT("info", ("Corrupt the event at Log_event::read_log_event: byte on position %d", debug_cor_pos));
DBUG_SET("-d,corrupt_read_log_event2"); DBUG_SET("-d,corrupt_read_log_event2");
...@@ -966,9 +950,9 @@ Log_event* Log_event::read_log_event(IO_CACHE* file, ...@@ -966,9 +950,9 @@ Log_event* Log_event::read_log_event(IO_CACHE* file,
goto err; goto err;
} }
if ((res= read_log_event(event.ptr(), event.length(), if ((res= read_log_event((uchar*) event.ptr(), event.length(),
&error, fdle, crc_check))) &error, fdle, crc_check)))
res->register_temp_buf(event.release(), true); res->register_temp_buf((uchar*) event.release(), true);
err: err:
if (unlikely(error)) if (unlikely(error))
...@@ -1004,7 +988,7 @@ Log_event* Log_event::read_log_event(IO_CACHE* file, ...@@ -1004,7 +988,7 @@ Log_event* Log_event::read_log_event(IO_CACHE* file,
constructors. constructors.
*/ */
Log_event* Log_event::read_log_event(const char* buf, uint event_len, Log_event* Log_event::read_log_event(const uchar *buf, uint event_len,
const char **error, const char **error,
const Format_description_log_event *fdle, const Format_description_log_event *fdle,
my_bool crc_check) my_bool crc_check)
...@@ -1026,7 +1010,7 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len, ...@@ -1026,7 +1010,7 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len,
DBUG_RETURN(NULL); // general sanity check - will fail on a partial read DBUG_RETURN(NULL); // general sanity check - will fail on a partial read
} }
uint event_type= (uchar)buf[EVENT_TYPE_OFFSET]; uint event_type= buf[EVENT_TYPE_OFFSET];
// all following START events in the current file are without checksum // all following START events in the current file are without checksum
if (event_type == START_EVENT_V3) if (event_type == START_EVENT_V3)
(const_cast< Format_description_log_event *>(fdle))->checksum_alg= BINLOG_CHECKSUM_ALG_OFF; (const_cast< Format_description_log_event *>(fdle))->checksum_alg= BINLOG_CHECKSUM_ALG_OFF;
...@@ -1055,15 +1039,14 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len, ...@@ -1055,15 +1039,14 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len,
DBUG_EXECUTE_IF("corrupt_read_log_event_char", DBUG_EXECUTE_IF("corrupt_read_log_event_char",
if (event_type != FORMAT_DESCRIPTION_EVENT) if (event_type != FORMAT_DESCRIPTION_EVENT)
{ {
char *debug_event_buf_c = (char *)buf; uchar *debug_event_buf_c= const_cast<uchar*>(buf);
int debug_cor_pos = rand() % (event_len - BINLOG_CHECKSUM_LEN); int debug_cor_pos= rand() % (event_len - BINLOG_CHECKSUM_LEN);
debug_event_buf_c[debug_cor_pos] =~ debug_event_buf_c[debug_cor_pos]; debug_event_buf_c[debug_cor_pos]=~ debug_event_buf_c[debug_cor_pos];
DBUG_PRINT("info", ("Corrupt the event at Log_event::read_log_event(char*,...): byte on position %d", debug_cor_pos)); DBUG_PRINT("info", ("Corrupt the event at Log_event::read_log_event(char*,...): byte on position %d", debug_cor_pos));
DBUG_SET("-d,corrupt_read_log_event_char"); DBUG_SET("-d,corrupt_read_log_event_char");
} }
); );
if (crc_check && if (crc_check && event_checksum_test(const_cast<uchar*>(buf), event_len, alg))
event_checksum_test((uchar *) buf, event_len, alg))
{ {
#ifdef MYSQL_CLIENT #ifdef MYSQL_CLIENT
*error= "Event crc check failed! Most likely there is event corruption."; *error= "Event crc check failed! Most likely there is event corruption.";
...@@ -1135,100 +1118,100 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len, ...@@ -1135,100 +1118,100 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len,
} }
switch(event_type) { switch(event_type) {
case QUERY_EVENT: case QUERY_EVENT:
ev = new Query_log_event(buf, event_len, fdle, QUERY_EVENT); ev= new Query_log_event(buf, event_len, fdle, QUERY_EVENT);
break; break;
case QUERY_COMPRESSED_EVENT: case QUERY_COMPRESSED_EVENT:
ev = new Query_compressed_log_event(buf, event_len, fdle, ev= new Query_compressed_log_event(buf, event_len, fdle,
QUERY_COMPRESSED_EVENT); QUERY_COMPRESSED_EVENT);
break; break;
case LOAD_EVENT: case LOAD_EVENT:
ev = new Load_log_event(buf, event_len, fdle); ev= new Load_log_event(buf, event_len, fdle);
break; break;
case NEW_LOAD_EVENT: case NEW_LOAD_EVENT:
ev = new Load_log_event(buf, event_len, fdle); ev= new Load_log_event(buf, event_len, fdle);
break; break;
case ROTATE_EVENT: case ROTATE_EVENT:
ev = new Rotate_log_event(buf, event_len, fdle); ev= new Rotate_log_event(buf, event_len, fdle);
break; break;
case BINLOG_CHECKPOINT_EVENT: case BINLOG_CHECKPOINT_EVENT:
ev = new Binlog_checkpoint_log_event(buf, event_len, fdle); ev= new Binlog_checkpoint_log_event(buf, event_len, fdle);
break; break;
case GTID_EVENT: case GTID_EVENT:
ev = new Gtid_log_event(buf, event_len, fdle); ev= new Gtid_log_event(buf, event_len, fdle);
break; break;
case GTID_LIST_EVENT: case GTID_LIST_EVENT:
ev = new Gtid_list_log_event(buf, event_len, fdle); ev= new Gtid_list_log_event(buf, event_len, fdle);
break; break;
case CREATE_FILE_EVENT: case CREATE_FILE_EVENT:
ev = new Create_file_log_event(buf, event_len, fdle); ev= new Create_file_log_event(buf, event_len, fdle);
break; break;
case APPEND_BLOCK_EVENT: case APPEND_BLOCK_EVENT:
ev = new Append_block_log_event(buf, event_len, fdle); ev= new Append_block_log_event(buf, event_len, fdle);
break; break;
case DELETE_FILE_EVENT: case DELETE_FILE_EVENT:
ev = new Delete_file_log_event(buf, event_len, fdle); ev= new Delete_file_log_event(buf, event_len, fdle);
break; break;
case EXEC_LOAD_EVENT: case EXEC_LOAD_EVENT:
ev = new Execute_load_log_event(buf, event_len, fdle); ev= new Execute_load_log_event(buf, event_len, fdle);
break; break;
case START_EVENT_V3: /* this is sent only by MySQL <=4.x */ case START_EVENT_V3: /* this is sent only by MySQL <=4.x */
ev = new Start_log_event_v3(buf, event_len, fdle); ev= new Start_log_event_v3(buf, event_len, fdle);
break; break;
case STOP_EVENT: case STOP_EVENT:
ev = new Stop_log_event(buf, fdle); ev= new Stop_log_event(buf, fdle);
break; break;
case INTVAR_EVENT: case INTVAR_EVENT:
ev = new Intvar_log_event(buf, fdle); ev= new Intvar_log_event(buf, fdle);
break; break;
case XID_EVENT: case XID_EVENT:
ev = new Xid_log_event(buf, fdle); ev= new Xid_log_event(buf, fdle);
break; break;
case XA_PREPARE_LOG_EVENT: case XA_PREPARE_LOG_EVENT:
ev = new XA_prepare_log_event(buf, fdle); ev= new XA_prepare_log_event(buf, fdle);
break; break;
case RAND_EVENT: case RAND_EVENT:
ev = new Rand_log_event(buf, fdle); ev= new Rand_log_event(buf, fdle);
break; break;
case USER_VAR_EVENT: case USER_VAR_EVENT:
ev = new User_var_log_event(buf, event_len, fdle); ev= new User_var_log_event(buf, event_len, fdle);
break; break;
case FORMAT_DESCRIPTION_EVENT: case FORMAT_DESCRIPTION_EVENT:
ev = new Format_description_log_event(buf, event_len, fdle); ev= new Format_description_log_event(buf, event_len, fdle);
break; break;
#if defined(HAVE_REPLICATION) #if defined(HAVE_REPLICATION)
case PRE_GA_WRITE_ROWS_EVENT: case PRE_GA_WRITE_ROWS_EVENT:
ev = new Write_rows_log_event_old(buf, event_len, fdle); ev= new Write_rows_log_event_old(buf, event_len, fdle);
break; break;
case PRE_GA_UPDATE_ROWS_EVENT: case PRE_GA_UPDATE_ROWS_EVENT:
ev = new Update_rows_log_event_old(buf, event_len, fdle); ev= new Update_rows_log_event_old(buf, event_len, fdle);
break; break;
case PRE_GA_DELETE_ROWS_EVENT: case PRE_GA_DELETE_ROWS_EVENT:
ev = new Delete_rows_log_event_old(buf, event_len, fdle); ev= new Delete_rows_log_event_old(buf, event_len, fdle);
break; break;
case WRITE_ROWS_EVENT_V1: case WRITE_ROWS_EVENT_V1:
case WRITE_ROWS_EVENT: case WRITE_ROWS_EVENT:
ev = new Write_rows_log_event(buf, event_len, fdle); ev= new Write_rows_log_event(buf, event_len, fdle);
break; break;
case UPDATE_ROWS_EVENT_V1: case UPDATE_ROWS_EVENT_V1:
case UPDATE_ROWS_EVENT: case UPDATE_ROWS_EVENT:
ev = new Update_rows_log_event(buf, event_len, fdle); ev= new Update_rows_log_event(buf, event_len, fdle);
break; break;
case DELETE_ROWS_EVENT_V1: case DELETE_ROWS_EVENT_V1:
case DELETE_ROWS_EVENT: case DELETE_ROWS_EVENT:
ev = new Delete_rows_log_event(buf, event_len, fdle); ev= new Delete_rows_log_event(buf, event_len, fdle);
break; break;
case WRITE_ROWS_COMPRESSED_EVENT: case WRITE_ROWS_COMPRESSED_EVENT:
case WRITE_ROWS_COMPRESSED_EVENT_V1: case WRITE_ROWS_COMPRESSED_EVENT_V1:
ev = new Write_rows_compressed_log_event(buf, event_len, fdle); ev= new Write_rows_compressed_log_event(buf, event_len, fdle);
break; break;
case UPDATE_ROWS_COMPRESSED_EVENT: case UPDATE_ROWS_COMPRESSED_EVENT:
case UPDATE_ROWS_COMPRESSED_EVENT_V1: case UPDATE_ROWS_COMPRESSED_EVENT_V1:
ev = new Update_rows_compressed_log_event(buf, event_len, fdle); ev= new Update_rows_compressed_log_event(buf, event_len, fdle);
break; break;
case DELETE_ROWS_COMPRESSED_EVENT: case DELETE_ROWS_COMPRESSED_EVENT:
case DELETE_ROWS_COMPRESSED_EVENT_V1: case DELETE_ROWS_COMPRESSED_EVENT_V1:
ev = new Delete_rows_compressed_log_event(buf, event_len, fdle); ev= new Delete_rows_compressed_log_event(buf, event_len, fdle);
break; break;
/* MySQL GTID events are ignored */ /* MySQL GTID events are ignored */
...@@ -1242,23 +1225,23 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len, ...@@ -1242,23 +1225,23 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len,
break; break;
case TABLE_MAP_EVENT: case TABLE_MAP_EVENT:
ev = new Table_map_log_event(buf, event_len, fdle); ev= new Table_map_log_event(buf, event_len, fdle);
break; break;
#endif #endif
case BEGIN_LOAD_QUERY_EVENT: case BEGIN_LOAD_QUERY_EVENT:
ev = new Begin_load_query_log_event(buf, event_len, fdle); ev= new Begin_load_query_log_event(buf, event_len, fdle);
break; break;
case EXECUTE_LOAD_QUERY_EVENT: case EXECUTE_LOAD_QUERY_EVENT:
ev= new Execute_load_query_log_event(buf, event_len, fdle); ev= new Execute_load_query_log_event(buf, event_len, fdle);
break; break;
case INCIDENT_EVENT: case INCIDENT_EVENT:
ev = new Incident_log_event(buf, event_len, fdle); ev= new Incident_log_event(buf, event_len, fdle);
break; break;
case ANNOTATE_ROWS_EVENT: case ANNOTATE_ROWS_EVENT:
ev = new Annotate_rows_log_event(buf, event_len, fdle); ev= new Annotate_rows_log_event(buf, event_len, fdle);
break; break;
case START_ENCRYPTION_EVENT: case START_ENCRYPTION_EVENT:
ev = new Start_encryption_log_event(buf, event_len, fdle); ev= new Start_encryption_log_event(buf, event_len, fdle);
break; break;
default: default:
DBUG_PRINT("error",("Unknown event code: %d", DBUG_PRINT("error",("Unknown event code: %d",
...@@ -1362,8 +1345,7 @@ get_str_len_and_pointer(const Log_event::Byte **src, ...@@ -1362,8 +1345,7 @@ get_str_len_and_pointer(const Log_event::Byte **src,
return 0; return 0;
} }
static void copy_str_and_move(const char **src, static void copy_str_and_move(const char **src, Log_event::Byte **dst,
Log_event::Byte **dst,
size_t len) size_t len)
{ {
memcpy(*dst, *src, len); memcpy(*dst, *src, len);
...@@ -1430,7 +1412,7 @@ code_name(int code) ...@@ -1430,7 +1412,7 @@ code_name(int code)
/** /**
This is used by the SQL slave thread to prepare the event before execution. This is used by the SQL slave thread to prepare the event before execution.
*/ */
Query_log_event::Query_log_event(const char* buf, uint event_len, Query_log_event::Query_log_event(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event, *description_event,
Log_event_type event_type) Log_event_type event_type)
...@@ -1463,13 +1445,13 @@ Query_log_event::Query_log_event(const char* buf, uint event_len, ...@@ -1463,13 +1445,13 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
*/ */
if (event_len < (uint)(common_header_len + post_header_len)) if (event_len < (uint)(common_header_len + post_header_len))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
data_len = event_len - (common_header_len + post_header_len); data_len= event_len - (common_header_len + post_header_len);
buf+= common_header_len; buf+= common_header_len;
thread_id = slave_proxy_id = uint4korr(buf + Q_THREAD_ID_OFFSET); thread_id= slave_proxy_id= uint4korr(buf + Q_THREAD_ID_OFFSET);
exec_time = uint4korr(buf + Q_EXEC_TIME_OFFSET); exec_time= uint4korr(buf + Q_EXEC_TIME_OFFSET);
db_len = (uchar)buf[Q_DB_LEN_OFFSET]; // TODO: add a check of all *_len vars db_len= buf[Q_DB_LEN_OFFSET]; // TODO: add a check of all *_len vars
error_code = uint2korr(buf + Q_ERR_CODE_OFFSET); error_code= uint2korr(buf + Q_ERR_CODE_OFFSET);
/* /*
5.0 format starts here. 5.0 format starts here.
...@@ -1672,7 +1654,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len, ...@@ -1672,7 +1654,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
*/ */
#if !defined(MYSQL_CLIENT) && defined(HAVE_QUERY_CACHE) #if !defined(MYSQL_CLIENT) && defined(HAVE_QUERY_CACHE)
if (!(start= data_buf = (Log_event::Byte*) my_malloc(PSI_INSTRUMENT_ME, if (!(start= data_buf= (Log_event::Byte*) my_malloc(PSI_INSTRUMENT_ME,
catalog_len + 1 catalog_len + 1
+ time_zone_len + 1 + time_zone_len + 1
+ user.length + 1 + user.length + 1
...@@ -1684,7 +1666,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len, ...@@ -1684,7 +1666,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
+ QUERY_CACHE_FLAGS_SIZE, + QUERY_CACHE_FLAGS_SIZE,
MYF(MY_WME)))) MYF(MY_WME))))
#else #else
if (!(start= data_buf = (Log_event::Byte*) my_malloc(PSI_INSTRUMENT_ME, if (!(start= data_buf= (Log_event::Byte*) my_malloc(PSI_INSTRUMENT_ME,
catalog_len + 1 catalog_len + 1
+ time_zone_len + 1 + time_zone_len + 1
+ user.length + 1 + user.length + 1
...@@ -1753,11 +1735,10 @@ Query_log_event::Query_log_event(const char* buf, uint event_len, ...@@ -1753,11 +1735,10 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
uint32 max_length= uint32(event_len - ((const char*)(end + db_len + 1) - uint32 max_length= uint32(event_len - ((end + db_len + 1) -
(buf - common_header_len))); (buf - common_header_len)));
if (q_len != max_length || if (q_len != max_length ||
(event_len < uint((const char*)(end + db_len + 1) - (event_len < uint((end + db_len + 1) - (buf - common_header_len))))
(buf - common_header_len))))
{ {
q_len= 0; q_len= 0;
query= NULL; query= NULL;
...@@ -1774,7 +1755,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len, ...@@ -1774,7 +1755,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
Query_compressed_log_event::Query_compressed_log_event(const char *buf, Query_compressed_log_event::Query_compressed_log_event(const uchar *buf,
uint event_len, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event, *description_event,
...@@ -1782,24 +1763,24 @@ Query_compressed_log_event::Query_compressed_log_event(const char *buf, ...@@ -1782,24 +1763,24 @@ Query_compressed_log_event::Query_compressed_log_event(const char *buf,
:Query_log_event(buf, event_len, description_event, event_type), :Query_log_event(buf, event_len, description_event, event_type),
query_buf(NULL) query_buf(NULL)
{ {
if(query) if (query)
{ {
uint32 un_len=binlog_get_uncompress_len(query); uint32 un_len= binlog_get_uncompress_len((uchar*) query);
if (!un_len) if (!un_len)
{ {
query = 0; query= 0;
return; return;
} }
/* Reserve one byte for '\0' */ /* Reserve one byte for '\0' */
query_buf = (Log_event::Byte*)my_malloc(PSI_INSTRUMENT_ME, query_buf= (Log_event::Byte*) my_malloc(PSI_INSTRUMENT_ME,
ALIGN_SIZE(un_len + 1), MYF(MY_WME)); ALIGN_SIZE(un_len + 1), MYF(MY_WME));
if(query_buf && if (query_buf && !binlog_buf_uncompress((uchar*) query, (uchar *) query_buf,
!binlog_buf_uncompress(query, (char *)query_buf, q_len, &un_len)) q_len, &un_len))
{ {
query_buf[un_len] = 0; query_buf[un_len]= 0;
query = (const char *)query_buf; query= (char*) query_buf;
q_len = un_len; q_len= un_len;
} }
else else
{ {
...@@ -1808,6 +1789,7 @@ Query_compressed_log_event::Query_compressed_log_event(const char *buf, ...@@ -1808,6 +1789,7 @@ Query_compressed_log_event::Query_compressed_log_event(const char *buf,
} }
} }
/* /*
Replace a binlog event read into a packet with a dummy event. Either a Replace a binlog event read into a packet with a dummy event. Either a
Query_log_event that has just a comment, or if that will not fit in the Query_log_event that has just a comment, or if that will not fit in the
...@@ -1987,7 +1969,7 @@ Query_log_event::begin_event(String *packet, ulong ev_offset, ...@@ -1987,7 +1969,7 @@ Query_log_event::begin_event(String *packet, ulong ev_offset,
**************************************************************************/ **************************************************************************/
Start_log_event_v3::Start_log_event_v3(const char* buf, uint event_len, Start_log_event_v3::Start_log_event_v3(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event) *description_event)
:Log_event(buf, description_event), binlog_version(BINLOG_VERSION) :Log_event(buf, description_event), binlog_version(BINLOG_VERSION)
...@@ -2085,9 +2067,9 @@ Format_description_log_event(uint8 binlog_ver, const char* server_ver) ...@@ -2085,9 +2067,9 @@ Format_description_log_event(uint8 binlog_ver, const char* server_ver)
Hence, we need to be assign some value here, to avoid reading Hence, we need to be assign some value here, to avoid reading
uninitialized memory when the array is written to disk. uninitialized memory when the array is written to disk.
*/ */
post_header_len[PRE_GA_WRITE_ROWS_EVENT-1] = 0; post_header_len[PRE_GA_WRITE_ROWS_EVENT-1]= 0;
post_header_len[PRE_GA_UPDATE_ROWS_EVENT-1] = 0; post_header_len[PRE_GA_UPDATE_ROWS_EVENT-1]= 0;
post_header_len[PRE_GA_DELETE_ROWS_EVENT-1] = 0; post_header_len[PRE_GA_DELETE_ROWS_EVENT-1]= 0;
post_header_len[TABLE_MAP_EVENT-1]= TABLE_MAP_HEADER_LEN; post_header_len[TABLE_MAP_EVENT-1]= TABLE_MAP_HEADER_LEN;
post_header_len[WRITE_ROWS_EVENT_V1-1]= ROWS_HEADER_LEN_V1; post_header_len[WRITE_ROWS_EVENT_V1-1]= ROWS_HEADER_LEN_V1;
...@@ -2219,10 +2201,8 @@ Format_description_log_event(uint8 binlog_ver, const char* server_ver) ...@@ -2219,10 +2201,8 @@ Format_description_log_event(uint8 binlog_ver, const char* server_ver)
*/ */
Format_description_log_event:: Format_description_log_event::
Format_description_log_event(const char* buf, Format_description_log_event(const uchar *buf, uint event_len,
uint event_len, const Format_description_log_event*
const
Format_description_log_event*
description_event) description_event)
:Start_log_event_v3(buf, event_len, description_event), :Start_log_event_v3(buf, event_len, description_event),
common_header_len(0), post_header_len(NULL), event_type_permutation(0) common_header_len(0), post_header_len(NULL), event_type_permutation(0)
...@@ -2353,7 +2333,7 @@ Format_description_log_event::is_version_before_checksum(const master_version_sp ...@@ -2353,7 +2333,7 @@ Format_description_log_event::is_version_before_checksum(const master_version_sp
checksum-unaware (effectively no checksum) and the actuall checksum-unaware (effectively no checksum) and the actuall
[1-254] range alg descriptor. [1-254] range alg descriptor.
*/ */
enum enum_binlog_checksum_alg get_checksum_alg(const char* buf, ulong len) enum enum_binlog_checksum_alg get_checksum_alg(const uchar *buf, ulong len)
{ {
enum enum_binlog_checksum_alg ret; enum enum_binlog_checksum_alg ret;
char version[ST_SERVER_VER_LEN]; char version[ST_SERVER_VER_LEN];
...@@ -2376,17 +2356,17 @@ enum enum_binlog_checksum_alg get_checksum_alg(const char* buf, ulong len) ...@@ -2376,17 +2356,17 @@ enum enum_binlog_checksum_alg get_checksum_alg(const char* buf, ulong len)
DBUG_RETURN(ret); DBUG_RETURN(ret);
} }
Start_encryption_log_event::Start_encryption_log_event( Start_encryption_log_event::
const char* buf, uint event_len, Start_encryption_log_event(const uchar *buf, uint event_len,
const Format_description_log_event* description_event) const Format_description_log_event* description_event)
:Log_event(buf, description_event) :Log_event(buf, description_event)
{ {
if ((int)event_len == if ((int)event_len ==
LOG_EVENT_MINIMAL_HEADER_LEN + Start_encryption_log_event::get_data_size()) LOG_EVENT_MINIMAL_HEADER_LEN + Start_encryption_log_event::get_data_size())
{ {
buf += LOG_EVENT_MINIMAL_HEADER_LEN; buf+= LOG_EVENT_MINIMAL_HEADER_LEN;
crypto_scheme = *(uchar*)buf; crypto_scheme= *buf;
key_version = uint4korr(buf + BINLOG_CRYPTO_SCHEME_LENGTH); key_version= uint4korr(buf + BINLOG_CRYPTO_SCHEME_LENGTH);
memcpy(nonce, memcpy(nonce,
buf + BINLOG_CRYPTO_SCHEME_LENGTH + BINLOG_KEY_VERSION_LENGTH, buf + BINLOG_CRYPTO_SCHEME_LENGTH + BINLOG_KEY_VERSION_LENGTH,
BINLOG_NONCE_LENGTH); BINLOG_NONCE_LENGTH);
...@@ -2396,7 +2376,7 @@ Start_encryption_log_event::Start_encryption_log_event( ...@@ -2396,7 +2376,7 @@ Start_encryption_log_event::Start_encryption_log_event(
} }
/************************************************************************** /**************************************************************************
Load_log_event methods Load_log_event methods
General note about Load_log_event: the binlogging of LOAD DATA INFILE is General note about Load_log_event: the binlogging of LOAD DATA INFILE is
going to be changed in 5.0 (or maybe in 5.1; not decided yet). going to be changed in 5.0 (or maybe in 5.1; not decided yet).
...@@ -2411,16 +2391,18 @@ Start_encryption_log_event::Start_encryption_log_event( ...@@ -2411,16 +2391,18 @@ Start_encryption_log_event::Start_encryption_log_event(
Note that I (Guilhem) manually tested replication of a big LOAD DATA INFILE Note that I (Guilhem) manually tested replication of a big LOAD DATA INFILE
between 3.23 and 5.0, and between 4.0 and 5.0, and it works fine (and the between 3.23 and 5.0, and between 4.0 and 5.0, and it works fine (and the
positions displayed in SHOW SLAVE STATUS then are fine too). positions displayed in SHOW SLAVE STATUS then are fine too).
**************************************************************************/ **************************************************************************/
/** /**
@note @note
The caller must do buf[event_len] = 0 before he starts using the The caller must do buf[event_len]= 0 before he starts using the
constructed event. constructed event.
*/ */
Load_log_event::Load_log_event(const char *buf, uint event_len,
const Format_description_log_event *description_event) Load_log_event::Load_log_event(const uchar *buf, uint event_len,
const Format_description_log_event
*description_event)
:Log_event(buf, description_event), num_fields(0), fields(0), :Log_event(buf, description_event), num_fields(0), fields(0),
field_lens(0),field_block_len(0), field_lens(0),field_block_len(0),
table_name(0), db(0), fname(0), local_fname(FALSE), table_name(0), db(0), fname(0), local_fname(FALSE),
...@@ -2452,52 +2434,51 @@ Load_log_event::Load_log_event(const char *buf, uint event_len, ...@@ -2452,52 +2434,51 @@ Load_log_event::Load_log_event(const char *buf, uint event_len,
Load_log_event::copy_log_event() Load_log_event::copy_log_event()
*/ */
int Load_log_event::copy_log_event(const char *buf, ulong event_len, int Load_log_event::copy_log_event(const uchar *buf, ulong event_len,
int body_offset, int body_offset,
const Format_description_log_event *description_event) const Format_description_log_event
*description_event)
{ {
DBUG_ENTER("Load_log_event::copy_log_event"); DBUG_ENTER("Load_log_event::copy_log_event");
uint data_len; uint data_len;
if ((int) event_len <= body_offset) if ((int) event_len <= body_offset)
DBUG_RETURN(1); DBUG_RETURN(1);
char* buf_end = (char*)buf + event_len; const uchar *buf_end= buf + event_len;
/* this is the beginning of the post-header */ /* this is the beginning of the post-header */
const char* data_head = buf + description_event->common_header_len; const uchar *data_head= buf + description_event->common_header_len;
thread_id= slave_proxy_id= uint4korr(data_head + L_THREAD_ID_OFFSET); thread_id= slave_proxy_id= uint4korr(data_head + L_THREAD_ID_OFFSET);
exec_time = uint4korr(data_head + L_EXEC_TIME_OFFSET); exec_time= uint4korr(data_head + L_EXEC_TIME_OFFSET);
skip_lines = uint4korr(data_head + L_SKIP_LINES_OFFSET); skip_lines= uint4korr(data_head + L_SKIP_LINES_OFFSET);
table_name_len = (uint)data_head[L_TBL_LEN_OFFSET]; table_name_len= (uint)data_head[L_TBL_LEN_OFFSET];
db_len = (uint)data_head[L_DB_LEN_OFFSET]; db_len= (uint)data_head[L_DB_LEN_OFFSET];
num_fields = uint4korr(data_head + L_NUM_FIELDS_OFFSET); num_fields= uint4korr(data_head + L_NUM_FIELDS_OFFSET);
/* /*
Sql_ex.init() on success returns the pointer to the first byte after Sql_ex.init() on success returns the pointer to the first byte after
the sql_ex structure, which is the start of field lengths array. the sql_ex structure, which is the start of field lengths array.
*/ */
if (!(field_lens= (uchar*)sql_ex.init((char*)buf + body_offset, if (!(field_lens= (uchar*) sql_ex.init(buf + body_offset, buf_end,
buf_end, buf[EVENT_TYPE_OFFSET] != LOAD_EVENT)))
(uchar)buf[EVENT_TYPE_OFFSET] != LOAD_EVENT)))
DBUG_RETURN(1); DBUG_RETURN(1);
data_len = event_len - body_offset; data_len= event_len - body_offset;
if (num_fields > data_len) // simple sanity check against corruption if (num_fields > data_len) // simple sanity check against corruption
DBUG_RETURN(1); DBUG_RETURN(1);
for (uint i = 0; i < num_fields; i++) for (uint i= 0; i < num_fields; i++)
field_block_len += (uint)field_lens[i] + 1; field_block_len+= (uint)field_lens[i] + 1;
fields = (char*)field_lens + num_fields; fields= (char*) field_lens + num_fields;
table_name = fields + field_block_len; table_name= fields + field_block_len;
if (strlen(table_name) > NAME_LEN) if (strlen(table_name) > NAME_LEN)
goto err; goto err;
db = table_name + table_name_len + 1; db= table_name + table_name_len + 1;
DBUG_EXECUTE_IF ("simulate_invalid_address", DBUG_EXECUTE_IF("simulate_invalid_address", db_len= data_len;);
db_len = data_len;); fname= db + db_len + 1;
fname = db + db_len + 1; if ((db_len > data_len) || (fname > (char*) buf_end))
if ((db_len > data_len) || (fname > buf_end))
goto err; goto err;
fname_len = (uint) strlen(fname); fname_len= (uint) strlen(fname);
if ((fname_len > data_len) || (fname + fname_len > buf_end)) if ((fname_len > data_len) || (fname + fname_len > (char*) buf_end))
goto err; goto err;
// null termination is accomplished by the caller doing buf[event_len]=0 // null termination is accomplished by the caller doing buf[event_len]=0
...@@ -2505,7 +2486,7 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len, ...@@ -2505,7 +2486,7 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len,
err: err:
// Invalid event. // Invalid event.
table_name = 0; table_name= 0;
DBUG_RETURN(1); DBUG_RETURN(1);
} }
...@@ -2514,8 +2495,9 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len, ...@@ -2514,8 +2495,9 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len,
Rotate_log_event methods Rotate_log_event methods
**************************************************************************/ **************************************************************************/
Rotate_log_event::Rotate_log_event(const char* buf, uint event_len, Rotate_log_event::Rotate_log_event(const uchar *buf, uint event_len,
const Format_description_log_event* description_event) const Format_description_log_event*
description_event)
:Log_event(buf, description_event) ,new_log_ident(0), flags(DUP_NAME) :Log_event(buf, description_event) ,new_log_ident(0), flags(DUP_NAME)
{ {
DBUG_ENTER("Rotate_log_event::Rotate_log_event(char*,...)"); DBUG_ENTER("Rotate_log_event::Rotate_log_event(char*,...)");
...@@ -2529,7 +2511,8 @@ Rotate_log_event::Rotate_log_event(const char* buf, uint event_len, ...@@ -2529,7 +2511,8 @@ Rotate_log_event::Rotate_log_event(const char* buf, uint event_len,
ident_len= (uint)(event_len - (LOG_EVENT_MINIMAL_HEADER_LEN + post_header_len)); ident_len= (uint)(event_len - (LOG_EVENT_MINIMAL_HEADER_LEN + post_header_len));
ident_offset= post_header_len; ident_offset= post_header_len;
set_if_smaller(ident_len,FN_REFLEN-1); set_if_smaller(ident_len,FN_REFLEN-1);
new_log_ident= my_strndup(PSI_INSTRUMENT_ME, buf + ident_offset, (uint) ident_len, MYF(MY_WME)); new_log_ident= my_strndup(PSI_INSTRUMENT_ME, (char*) buf + ident_offset,
(uint) ident_len, MYF(MY_WME));
DBUG_PRINT("debug", ("new_log_ident: '%s'", new_log_ident)); DBUG_PRINT("debug", ("new_log_ident: '%s'", new_log_ident));
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -2540,7 +2523,7 @@ Rotate_log_event::Rotate_log_event(const char* buf, uint event_len, ...@@ -2540,7 +2523,7 @@ Rotate_log_event::Rotate_log_event(const char* buf, uint event_len,
**************************************************************************/ **************************************************************************/
Binlog_checkpoint_log_event::Binlog_checkpoint_log_event( Binlog_checkpoint_log_event::Binlog_checkpoint_log_event(
const char *buf, uint event_len, const uchar *buf, uint event_len,
const Format_description_log_event *description_event) const Format_description_log_event *description_event)
:Log_event(buf, description_event), binlog_file_name(0) :Log_event(buf, description_event), binlog_file_name(0)
{ {
...@@ -2556,8 +2539,8 @@ Binlog_checkpoint_log_event::Binlog_checkpoint_log_event( ...@@ -2556,8 +2539,8 @@ Binlog_checkpoint_log_event::Binlog_checkpoint_log_event(
binlog_file_len= uint4korr(buf); binlog_file_len= uint4korr(buf);
if (event_len - (header_size + post_header_len) < binlog_file_len) if (event_len - (header_size + post_header_len) < binlog_file_len)
return; return;
binlog_file_name= my_strndup(PSI_INSTRUMENT_ME, buf + post_header_len, binlog_file_len, binlog_file_name= my_strndup(PSI_INSTRUMENT_ME, (char*) buf + post_header_len,
MYF(MY_WME)); binlog_file_len, MYF(MY_WME));
return; return;
} }
...@@ -2566,8 +2549,9 @@ Binlog_checkpoint_log_event::Binlog_checkpoint_log_event( ...@@ -2566,8 +2549,9 @@ Binlog_checkpoint_log_event::Binlog_checkpoint_log_event(
Global transaction ID stuff Global transaction ID stuff
**************************************************************************/ **************************************************************************/
Gtid_log_event::Gtid_log_event(const char *buf, uint event_len, Gtid_log_event::Gtid_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event) const Format_description_log_event
*description_event)
: Log_event(buf, description_event), seq_no(0), commit_id(0) : Log_event(buf, description_event), seq_no(0), commit_id(0)
{ {
uint8 header_size= description_event->common_header_len; uint8 header_size= description_event->common_header_len;
...@@ -2610,8 +2594,9 @@ Gtid_log_event::Gtid_log_event(const char *buf, uint event_len, ...@@ -2610,8 +2594,9 @@ Gtid_log_event::Gtid_log_event(const char *buf, uint event_len,
/* GTID list. */ /* GTID list. */
Gtid_list_log_event::Gtid_list_log_event(const char *buf, uint event_len, Gtid_list_log_event::Gtid_list_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event) const Format_description_log_event
*description_event)
: Log_event(buf, description_event), count(0), list(0), sub_id_list(0) : Log_event(buf, description_event), count(0), list(0), sub_id_list(0)
{ {
uint32 i; uint32 i;
...@@ -2702,7 +2687,7 @@ Gtid_list_log_event::peek(const char *event_start, size_t event_len, ...@@ -2702,7 +2687,7 @@ Gtid_list_log_event::peek(const char *event_start, size_t event_len,
p+= 4; p+= 4;
count= count_field & ((1<<28)-1); count= count_field & ((1<<28)-1);
if (event_len < (uint32)fdev->common_header_len + GTID_LIST_HEADER_LEN + if (event_len < (uint32)fdev->common_header_len + GTID_LIST_HEADER_LEN +
16 * count) element_size * count)
return true; return true;
if (!(gtid_list= (rpl_gtid *)my_malloc(PSI_INSTRUMENT_ME, if (!(gtid_list= (rpl_gtid *)my_malloc(PSI_INSTRUMENT_ME,
sizeof(rpl_gtid)*count + (count == 0), MYF(MY_WME)))) sizeof(rpl_gtid)*count + (count == 0), MYF(MY_WME))))
...@@ -2732,7 +2717,7 @@ Gtid_list_log_event::peek(const char *event_start, size_t event_len, ...@@ -2732,7 +2717,7 @@ Gtid_list_log_event::peek(const char *event_start, size_t event_len,
Intvar_log_event::Intvar_log_event() Intvar_log_event::Intvar_log_event()
*/ */
Intvar_log_event::Intvar_log_event(const char* buf, Intvar_log_event::Intvar_log_event(const uchar *buf,
const Format_description_log_event* description_event) const Format_description_log_event* description_event)
:Log_event(buf, description_event) :Log_event(buf, description_event)
{ {
...@@ -2762,7 +2747,7 @@ const char* Intvar_log_event::get_var_type_name() ...@@ -2762,7 +2747,7 @@ const char* Intvar_log_event::get_var_type_name()
Rand_log_event methods Rand_log_event methods
**************************************************************************/ **************************************************************************/
Rand_log_event::Rand_log_event(const char* buf, Rand_log_event::Rand_log_event(const uchar *buf,
const Format_description_log_event* description_event) const Format_description_log_event* description_event)
:Log_event(buf, description_event) :Log_event(buf, description_event)
{ {
...@@ -2788,7 +2773,7 @@ Rand_log_event::Rand_log_event(const char* buf, ...@@ -2788,7 +2773,7 @@ Rand_log_event::Rand_log_event(const char* buf,
*/ */
Xid_log_event:: Xid_log_event::
Xid_log_event(const char* buf, Xid_log_event(const uchar *buf,
const Format_description_log_event *description_event) const Format_description_log_event *description_event)
:Xid_apply_log_event(buf, description_event) :Xid_apply_log_event(buf, description_event)
{ {
...@@ -2802,7 +2787,7 @@ Xid_log_event(const char* buf, ...@@ -2802,7 +2787,7 @@ Xid_log_event(const char* buf,
XA_prepare_log_event methods XA_prepare_log_event methods
**************************************************************************/ **************************************************************************/
XA_prepare_log_event:: XA_prepare_log_event::
XA_prepare_log_event(const char* buf, XA_prepare_log_event(const uchar *buf,
const Format_description_log_event *description_event) const Format_description_log_event *description_event)
:Xid_apply_log_event(buf, description_event) :Xid_apply_log_event(buf, description_event)
{ {
...@@ -2841,7 +2826,7 @@ XA_prepare_log_event(const char* buf, ...@@ -2841,7 +2826,7 @@ XA_prepare_log_event(const char* buf,
**************************************************************************/ **************************************************************************/
User_var_log_event:: User_var_log_event::
User_var_log_event(const char* buf, uint event_len, User_var_log_event(const uchar *buf, uint event_len,
const Format_description_log_event* description_event) const Format_description_log_event* description_event)
:Log_event(buf, description_event) :Log_event(buf, description_event)
#ifndef MYSQL_CLIENT #ifndef MYSQL_CLIENT
...@@ -2849,7 +2834,7 @@ User_var_log_event(const char* buf, uint event_len, ...@@ -2849,7 +2834,7 @@ User_var_log_event(const char* buf, uint event_len,
#endif #endif
{ {
bool error= false; bool error= false;
const char* buf_start= buf, *buf_end= buf + event_len; const uchar *buf_start= buf, *buf_end= buf + event_len;
/* The Post-Header is empty. The Variable Data part begins immediately. */ /* The Post-Header is empty. The Variable Data part begins immediately. */
buf+= description_event->common_header_len + buf+= description_event->common_header_len +
...@@ -2869,7 +2854,7 @@ User_var_log_event(const char* buf, uint event_len, ...@@ -2869,7 +2854,7 @@ User_var_log_event(const char* buf, uint event_len,
may have the bigger value possible, is_null= True and there is no may have the bigger value possible, is_null= True and there is no
payload for val, or even that name_len is 0. payload for val, or even that name_len is 0.
*/ */
if (name + name_len + UV_VAL_IS_NULL > buf_end) if (name + name_len + UV_VAL_IS_NULL > (char*) buf_end)
{ {
error= true; error= true;
goto err; goto err;
...@@ -2890,7 +2875,7 @@ User_var_log_event(const char* buf, uint event_len, ...@@ -2890,7 +2875,7 @@ User_var_log_event(const char* buf, uint event_len,
val= (char *) (buf + UV_VAL_IS_NULL + UV_VAL_TYPE_SIZE + val= (char *) (buf + UV_VAL_IS_NULL + UV_VAL_TYPE_SIZE +
UV_CHARSET_NUMBER_SIZE + UV_VAL_LEN_SIZE); UV_CHARSET_NUMBER_SIZE + UV_VAL_LEN_SIZE);
if (val > buf_end) if (val > (char*) buf_end)
{ {
error= true; error= true;
goto err; goto err;
...@@ -2912,7 +2897,7 @@ User_var_log_event(const char* buf, uint event_len, ...@@ -2912,7 +2897,7 @@ User_var_log_event(const char* buf, uint event_len,
Old events will not have this extra byte, thence, Old events will not have this extra byte, thence,
we keep the flags set to UNDEF_F. we keep the flags set to UNDEF_F.
*/ */
size_t bytes_read= (val + val_len) - buf_start; size_t bytes_read= (val + val_len) - (char*) buf_start;
if (bytes_read > event_len) if (bytes_read > event_len)
{ {
error= true; error= true;
...@@ -2940,16 +2925,19 @@ User_var_log_event(const char* buf, uint event_len, ...@@ -2940,16 +2925,19 @@ User_var_log_event(const char* buf, uint event_len,
Create_file_log_event ctor Create_file_log_event ctor
*/ */
Create_file_log_event::Create_file_log_event(const char* buf, uint len, Create_file_log_event::
Create_file_log_event(const uchar *buf, uint len,
const Format_description_log_event* description_event) const Format_description_log_event* description_event)
:Load_log_event(buf,0,description_event),fake_base(0),block(0),inited_from_old(0) :Load_log_event(buf,0,description_event),fake_base(0),block(0),
inited_from_old(0)
{ {
DBUG_ENTER("Create_file_log_event::Create_file_log_event(char*,...)"); DBUG_ENTER("Create_file_log_event::Create_file_log_event(char*,...)");
uint block_offset; uint block_offset;
uint header_len= description_event->common_header_len; uint header_len= description_event->common_header_len;
uint8 load_header_len= description_event->post_header_len[LOAD_EVENT-1]; uint8 load_header_len= description_event->post_header_len[LOAD_EVENT-1];
uint8 create_file_header_len= description_event->post_header_len[CREATE_FILE_EVENT-1]; uint8 create_file_header_len= description_event->post_header_len[CREATE_FILE_EVENT-1];
if (!(event_buf= (char*) my_memdup(PSI_INSTRUMENT_ME, buf, len, MYF(MY_WME))) || if (!(event_buf= (uchar*) my_memdup(PSI_INSTRUMENT_ME, buf, len,
MYF(MY_WME))) ||
copy_log_event(event_buf,len, copy_log_event(event_buf,len,
(((uchar)buf[EVENT_TYPE_OFFSET] == LOAD_EVENT) ? (((uchar)buf[EVENT_TYPE_OFFSET] == LOAD_EVENT) ?
load_header_len + header_len : load_header_len + header_len :
...@@ -2979,13 +2967,13 @@ Create_file_log_event::Create_file_log_event(const char* buf, uint len, ...@@ -2979,13 +2967,13 @@ Create_file_log_event::Create_file_log_event(const char* buf, uint len,
create_file_header_len + 1); create_file_header_len + 1);
if (len < block_offset) if (len < block_offset)
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
block = (uchar*)buf + block_offset; block= const_cast<uchar*>(buf) + block_offset;
block_len = len - block_offset; block_len= len - block_offset;
} }
else else
{ {
sql_ex.force_new_format(); sql_ex.force_new_format();
inited_from_old = 1; inited_from_old= 1;
} }
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -2999,7 +2987,8 @@ Create_file_log_event::Create_file_log_event(const char* buf, uint len, ...@@ -2999,7 +2987,8 @@ Create_file_log_event::Create_file_log_event(const char* buf, uint len,
Append_block_log_event ctor Append_block_log_event ctor
*/ */
Append_block_log_event::Append_block_log_event(const char* buf, uint len, Append_block_log_event::
Append_block_log_event(const uchar *buf, uint len,
const Format_description_log_event* description_event) const Format_description_log_event* description_event)
:Log_event(buf, description_event),block(0) :Log_event(buf, description_event),block(0)
{ {
...@@ -3011,7 +3000,7 @@ Append_block_log_event::Append_block_log_event(const char* buf, uint len, ...@@ -3011,7 +3000,7 @@ Append_block_log_event::Append_block_log_event(const char* buf, uint len,
if (len < total_header_len) if (len < total_header_len)
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
file_id= uint4korr(buf + common_header_len + AB_FILE_ID_OFFSET); file_id= uint4korr(buf + common_header_len + AB_FILE_ID_OFFSET);
block= (uchar*)buf + total_header_len; block= const_cast<uchar*>(buf) + total_header_len;
block_len= len - total_header_len; block_len= len - total_header_len;
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -3025,7 +3014,8 @@ Append_block_log_event::Append_block_log_event(const char* buf, uint len, ...@@ -3025,7 +3014,8 @@ Append_block_log_event::Append_block_log_event(const char* buf, uint len,
Delete_file_log_event ctor Delete_file_log_event ctor
*/ */
Delete_file_log_event::Delete_file_log_event(const char* buf, uint len, Delete_file_log_event::
Delete_file_log_event(const uchar *buf, uint len,
const Format_description_log_event* description_event) const Format_description_log_event* description_event)
:Log_event(buf, description_event),file_id(0) :Log_event(buf, description_event),file_id(0)
{ {
...@@ -3045,7 +3035,8 @@ Delete_file_log_event::Delete_file_log_event(const char* buf, uint len, ...@@ -3045,7 +3035,8 @@ Delete_file_log_event::Delete_file_log_event(const char* buf, uint len,
Execute_load_log_event ctor Execute_load_log_event ctor
*/ */
Execute_load_log_event::Execute_load_log_event(const char* buf, uint len, Execute_load_log_event::
Execute_load_log_event(const uchar *buf, uint len,
const Format_description_log_event* description_event) const Format_description_log_event* description_event)
:Log_event(buf, description_event), file_id(0) :Log_event(buf, description_event), file_id(0)
{ {
...@@ -3062,7 +3053,7 @@ Execute_load_log_event::Execute_load_log_event(const char* buf, uint len, ...@@ -3062,7 +3053,7 @@ Execute_load_log_event::Execute_load_log_event(const char* buf, uint len,
**************************************************************************/ **************************************************************************/
Begin_load_query_log_event:: Begin_load_query_log_event::
Begin_load_query_log_event(const char* buf, uint len, Begin_load_query_log_event(const uchar *buf, uint len,
const Format_description_log_event* desc_event) const Format_description_log_event* desc_event)
:Append_block_log_event(buf, len, desc_event) :Append_block_log_event(buf, len, desc_event)
{ {
...@@ -3075,7 +3066,7 @@ Begin_load_query_log_event(const char* buf, uint len, ...@@ -3075,7 +3066,7 @@ Begin_load_query_log_event(const char* buf, uint len,
Execute_load_query_log_event:: Execute_load_query_log_event::
Execute_load_query_log_event(const char* buf, uint event_len, Execute_load_query_log_event(const uchar *buf, uint event_len,
const Format_description_log_event* desc_event): const Format_description_log_event* desc_event):
Query_log_event(buf, event_len, desc_event, EXECUTE_LOAD_QUERY_EVENT), Query_log_event(buf, event_len, desc_event, EXECUTE_LOAD_QUERY_EVENT),
file_id(0), fn_pos_start(0), fn_pos_end(0) file_id(0), fn_pos_start(0), fn_pos_end(0)
...@@ -3111,10 +3102,10 @@ ulong Execute_load_query_log_event::get_post_header_size_for_derived() ...@@ -3111,10 +3102,10 @@ ulong Execute_load_query_log_event::get_post_header_size_for_derived()
sql_ex_info::init() sql_ex_info::init()
*/ */
const char *sql_ex_info::init(const char *buf, const char *buf_end, const uchar *sql_ex_info::init(const uchar *buf, const uchar *buf_end,
bool use_new_format) bool use_new_format)
{ {
cached_new_format = use_new_format; cached_new_format= use_new_format;
if (use_new_format) if (use_new_format)
{ {
empty_flags=0; empty_flags=0;
...@@ -3131,19 +3122,19 @@ const char *sql_ex_info::init(const char *buf, const char *buf_end, ...@@ -3131,19 +3122,19 @@ const char *sql_ex_info::init(const char *buf, const char *buf_end,
read_str(&buf, buf_end, &line_start, &line_start_len) || read_str(&buf, buf_end, &line_start, &line_start_len) ||
read_str(&buf, buf_end, &escaped, &escaped_len)) read_str(&buf, buf_end, &escaped, &escaped_len))
return 0; return 0;
opt_flags = *buf++; opt_flags= *buf++;
} }
else else
{ {
if (buf_end - buf < 7) if (buf_end - buf < 7)
return 0; // Wrong data return 0; // Wrong data
field_term_len= enclosed_len= line_term_len= line_start_len= escaped_len=1; field_term_len= enclosed_len= line_term_len= line_start_len= escaped_len=1;
field_term = buf++; // Use first byte in string field_term= (char*) buf++; // Use first byte in string
enclosed= buf++; enclosed= (char*) buf++;
line_term= buf++; line_term= (char*) buf++;
line_start= buf++; line_start= (char*) buf++;
escaped= buf++; escaped= (char*) buf++;
opt_flags = *buf++; opt_flags= *buf++;
empty_flags= *buf++; empty_flags= *buf++;
if (empty_flags & FIELD_TERM_EMPTY) if (empty_flags & FIELD_TERM_EMPTY)
field_term_len=0; field_term_len=0;
...@@ -3166,7 +3157,7 @@ const char *sql_ex_info::init(const char *buf, const char *buf_end, ...@@ -3166,7 +3157,7 @@ const char *sql_ex_info::init(const char *buf, const char *buf_end,
**************************************************************************/ **************************************************************************/
Rows_log_event::Rows_log_event(const char *buf, uint event_len, Rows_log_event::Rows_log_event(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event) *description_event)
: Log_event(buf, description_event), : Log_event(buf, description_event),
...@@ -3201,7 +3192,7 @@ Rows_log_event::Rows_log_event(const char *buf, uint event_len, ...@@ -3201,7 +3192,7 @@ Rows_log_event::Rows_log_event(const char *buf, uint event_len,
event_len, common_header_len, event_len, common_header_len,
post_header_len)); post_header_len));
const char *post_start= buf + common_header_len; const uchar *post_start= buf + common_header_len;
post_start+= RW_MAPID_OFFSET; post_start+= RW_MAPID_OFFSET;
if (post_header_len == 6) if (post_header_len == 6)
{ {
...@@ -3238,9 +3229,9 @@ Rows_log_event::Rows_log_event(const char *buf, uint event_len, ...@@ -3238,9 +3229,9 @@ Rows_log_event::Rows_log_event(const char *buf, uint event_len,
var_header_len-= 2; var_header_len-= 2;
/* Iterate over var-len header, extracting 'chunks' */ /* Iterate over var-len header, extracting 'chunks' */
const char* start= post_start + 2; const uchar *start= post_start + 2;
const char* end= start + var_header_len; const uchar *end= start + var_header_len;
for (const char* pos= start; pos < end;) for (const uchar* pos= start; pos < end;)
{ {
switch(*pos++) switch(*pos++)
{ {
...@@ -3275,7 +3266,7 @@ Rows_log_event::Rows_log_event(const char *buf, uint event_len, ...@@ -3275,7 +3266,7 @@ Rows_log_event::Rows_log_event(const char *buf, uint event_len,
uchar const *const ptr_width= var_start; uchar const *const ptr_width= var_start;
uchar *ptr_after_width= (uchar*) ptr_width; uchar *ptr_after_width= (uchar*) ptr_width;
DBUG_PRINT("debug", ("Reading from %p", ptr_after_width)); DBUG_PRINT("debug", ("Reading from %p", ptr_after_width));
m_width = net_field_length(&ptr_after_width); m_width= net_field_length(&ptr_after_width);
DBUG_PRINT("debug", ("m_width=%lu", m_width)); DBUG_PRINT("debug", ("m_width=%lu", m_width));
/* Avoid reading out of buffer */ /* Avoid reading out of buffer */
...@@ -3361,18 +3352,19 @@ Rows_log_event::Rows_log_event(const char *buf, uint event_len, ...@@ -3361,18 +3352,19 @@ Rows_log_event::Rows_log_event(const char *buf, uint event_len,
void Rows_log_event::uncompress_buf() void Rows_log_event::uncompress_buf()
{ {
uint32 un_len = binlog_get_uncompress_len((char *)m_rows_buf); uint32 un_len= binlog_get_uncompress_len(m_rows_buf);
if (!un_len) if (!un_len)
return; return;
uchar *new_buf= (uchar*) my_malloc(PSI_INSTRUMENT_ME, ALIGN_SIZE(un_len), MYF(MY_WME)); uchar *new_buf= (uchar*) my_malloc(PSI_INSTRUMENT_ME, ALIGN_SIZE(un_len),
MYF(MY_WME));
if (new_buf) if (new_buf)
{ {
if(!binlog_buf_uncompress((char *)m_rows_buf, (char *)new_buf, if (!binlog_buf_uncompress(m_rows_buf, new_buf,
(uint32)(m_rows_cur - m_rows_buf), &un_len)) (uint32)(m_rows_cur - m_rows_buf), &un_len))
{ {
my_free(m_rows_buf); my_free(m_rows_buf);
m_rows_buf = new_buf; m_rows_buf= new_buf;
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
m_curr_row= m_rows_buf; m_curr_row= m_rows_buf;
#endif #endif
...@@ -3409,7 +3401,7 @@ int Rows_log_event::get_data_size() ...@@ -3409,7 +3401,7 @@ int Rows_log_event::get_data_size()
(general_type_code == UPDATE_ROWS_EVENT ? no_bytes_in_map(&m_cols_ai) : 0) + (general_type_code == UPDATE_ROWS_EVENT ? no_bytes_in_map(&m_cols_ai) : 0) +
m_rows_cur - m_rows_buf);); m_rows_cur - m_rows_buf););
int data_size= 0; int data_size= 0;
Log_event_type type = get_type_code(); Log_event_type type= get_type_code();
bool is_v2_event= LOG_EVENT_IS_ROW_V2(type); bool is_v2_event= LOG_EVENT_IS_ROW_V2(type);
if (is_v2_event) if (is_v2_event)
{ {
...@@ -3437,7 +3429,8 @@ int Rows_log_event::get_data_size() ...@@ -3437,7 +3429,8 @@ int Rows_log_event::get_data_size()
Annotate_rows_log_event member functions Annotate_rows_log_event member functions
**************************************************************************/ **************************************************************************/
Annotate_rows_log_event::Annotate_rows_log_event(const char *buf, Annotate_rows_log_event::
Annotate_rows_log_event(const uchar *buf,
uint event_len, uint event_len,
const Format_description_log_event *desc) const Format_description_log_event *desc)
: Log_event(buf, desc), : Log_event(buf, desc),
...@@ -3518,7 +3511,7 @@ bool Annotate_rows_log_event::is_valid() const ...@@ -3518,7 +3511,7 @@ bool Annotate_rows_log_event::is_valid() const
Constructor used by slave to read the event from the binary log. Constructor used by slave to read the event from the binary log.
*/ */
#if defined(HAVE_REPLICATION) #if defined(HAVE_REPLICATION)
Table_map_log_event::Table_map_log_event(const char *buf, uint event_len, Table_map_log_event::Table_map_log_event(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event) *description_event)
...@@ -3553,7 +3546,7 @@ Table_map_log_event::Table_map_log_event(const char *buf, uint event_len, ...@@ -3553,7 +3546,7 @@ Table_map_log_event::Table_map_log_event(const char *buf, uint event_len,
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
/* Read the post-header */ /* Read the post-header */
const char *post_start= buf + common_header_len; const uchar *post_start= buf + common_header_len;
post_start+= TM_MAPID_OFFSET; post_start+= TM_MAPID_OFFSET;
VALIDATE_BYTES_READ(post_start, buf, event_len); VALIDATE_BYTES_READ(post_start, buf, event_len);
...@@ -3575,7 +3568,7 @@ Table_map_log_event::Table_map_log_event(const char *buf, uint event_len, ...@@ -3575,7 +3568,7 @@ Table_map_log_event::Table_map_log_event(const char *buf, uint event_len,
m_flags= uint2korr(post_start); m_flags= uint2korr(post_start);
/* Read the variable part of the event */ /* Read the variable part of the event */
const char *const vpart= buf + common_header_len + post_header_len; const uchar *const vpart= buf + common_header_len + post_header_len;
/* Extract the length of the various parts from the buffer */ /* Extract the length of the various parts from the buffer */
uchar const *const ptr_dblen= (uchar const*)vpart + 0; uchar const *const ptr_dblen= (uchar const*)vpart + 0;
...@@ -3594,9 +3587,9 @@ Table_map_log_event::Table_map_log_event(const char *buf, uint event_len, ...@@ -3594,9 +3587,9 @@ Table_map_log_event::Table_map_log_event(const char *buf, uint event_len,
m_colcnt= net_field_length(&ptr_after_colcnt); m_colcnt= net_field_length(&ptr_after_colcnt);
DBUG_PRINT("info",("m_dblen: %lu off: %ld m_tbllen: %lu off: %ld m_colcnt: %lu off: %ld", DBUG_PRINT("info",("m_dblen: %lu off: %ld m_tbllen: %lu off: %ld m_colcnt: %lu off: %ld",
(ulong) m_dblen, (long) (ptr_dblen-(const uchar*)vpart), (ulong) m_dblen, (long) (ptr_dblen - vpart),
(ulong) m_tbllen, (long) (ptr_tbllen-(const uchar*)vpart), (ulong) m_tbllen, (long) (ptr_tbllen - vpart),
m_colcnt, (long) (ptr_colcnt-(const uchar*)vpart))); m_colcnt, (long) (ptr_colcnt - vpart)));
/* Allocate mem for all fields in one go. If fails, caught in is_valid() */ /* Allocate mem for all fields in one go. If fails, caught in is_valid() */
m_memory= (uchar*) my_multi_malloc(PSI_INSTRUMENT_ME, MYF(MY_WME), m_memory= (uchar*) my_multi_malloc(PSI_INSTRUMENT_ME, MYF(MY_WME),
...@@ -3906,7 +3899,7 @@ Optional_metadata_fields(unsigned char* optional_metadata, ...@@ -3906,7 +3899,7 @@ Optional_metadata_fields(unsigned char* optional_metadata,
Constructor used by slave to read the event from the binary log. Constructor used by slave to read the event from the binary log.
*/ */
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Write_rows_log_event::Write_rows_log_event(const char *buf, uint event_len, Write_rows_log_event::Write_rows_log_event(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event) *description_event)
: Rows_log_event(buf, event_len, description_event) : Rows_log_event(buf, event_len, description_event)
...@@ -3914,7 +3907,7 @@ Write_rows_log_event::Write_rows_log_event(const char *buf, uint event_len, ...@@ -3914,7 +3907,7 @@ Write_rows_log_event::Write_rows_log_event(const char *buf, uint event_len,
} }
Write_rows_compressed_log_event::Write_rows_compressed_log_event( Write_rows_compressed_log_event::Write_rows_compressed_log_event(
const char *buf, uint event_len, const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event) *description_event)
: Write_rows_log_event(buf, event_len, description_event) : Write_rows_log_event(buf, event_len, description_event)
...@@ -3932,7 +3925,7 @@ Write_rows_compressed_log_event::Write_rows_compressed_log_event( ...@@ -3932,7 +3925,7 @@ Write_rows_compressed_log_event::Write_rows_compressed_log_event(
Constructor used by slave to read the event from the binary log. Constructor used by slave to read the event from the binary log.
*/ */
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Delete_rows_log_event::Delete_rows_log_event(const char *buf, uint event_len, Delete_rows_log_event::Delete_rows_log_event(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event) *description_event)
: Rows_log_event(buf, event_len, description_event) : Rows_log_event(buf, event_len, description_event)
...@@ -3940,7 +3933,7 @@ Delete_rows_log_event::Delete_rows_log_event(const char *buf, uint event_len, ...@@ -3940,7 +3933,7 @@ Delete_rows_log_event::Delete_rows_log_event(const char *buf, uint event_len,
} }
Delete_rows_compressed_log_event::Delete_rows_compressed_log_event( Delete_rows_compressed_log_event::Delete_rows_compressed_log_event(
const char *buf, uint event_len, const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event) *description_event)
: Delete_rows_log_event(buf, event_len, description_event) : Delete_rows_log_event(buf, event_len, description_event)
...@@ -3968,7 +3961,7 @@ Update_rows_log_event::~Update_rows_log_event() ...@@ -3968,7 +3961,7 @@ Update_rows_log_event::~Update_rows_log_event()
Constructor used by slave to read the event from the binary log. Constructor used by slave to read the event from the binary log.
*/ */
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Update_rows_log_event::Update_rows_log_event(const char *buf, uint event_len, Update_rows_log_event::Update_rows_log_event(const uchar *buf, uint event_len,
const const
Format_description_log_event Format_description_log_event
*description_event) *description_event)
...@@ -3977,7 +3970,7 @@ Update_rows_log_event::Update_rows_log_event(const char *buf, uint event_len, ...@@ -3977,7 +3970,7 @@ Update_rows_log_event::Update_rows_log_event(const char *buf, uint event_len,
} }
Update_rows_compressed_log_event::Update_rows_compressed_log_event( Update_rows_compressed_log_event::Update_rows_compressed_log_event(
const char *buf, uint event_len, const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event) *description_event)
: Update_rows_log_event(buf, event_len, description_event) : Update_rows_log_event(buf, event_len, description_event)
...@@ -3986,7 +3979,7 @@ Update_rows_compressed_log_event::Update_rows_compressed_log_event( ...@@ -3986,7 +3979,7 @@ Update_rows_compressed_log_event::Update_rows_compressed_log_event(
} }
#endif #endif
Incident_log_event::Incident_log_event(const char *buf, uint event_len, Incident_log_event::Incident_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *descr_event) const Format_description_log_event *descr_event)
: Log_event(buf, descr_event) : Log_event(buf, descr_event)
{ {
...@@ -4012,8 +4005,8 @@ Incident_log_event::Incident_log_event(const char *buf, uint event_len, ...@@ -4012,8 +4005,8 @@ Incident_log_event::Incident_log_event(const char *buf, uint event_len,
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
m_incident= static_cast<Incident>(incident_number); m_incident= static_cast<Incident>(incident_number);
char const *ptr= buf + common_header_len + post_header_len; uchar const *ptr= buf + common_header_len + post_header_len;
char const *const str_end= buf + event_len; uchar const *const str_end= buf + event_len;
uint8 len= 0; // Assignment to keep compiler happy uint8 len= 0; // Assignment to keep compiler happy
const char *str= NULL; // Assignment to keep compiler happy const char *str= NULL; // Assignment to keep compiler happy
if (read_str(&ptr, str_end, &str, &len)) if (read_str(&ptr, str_end, &str, &len))
...@@ -4055,7 +4048,7 @@ Incident_log_event::description() const ...@@ -4055,7 +4048,7 @@ Incident_log_event::description() const
} }
Ignorable_log_event::Ignorable_log_event(const char *buf, Ignorable_log_event::Ignorable_log_event(const uchar *buf,
const Format_description_log_event const Format_description_log_event
*descr_event, *descr_event,
const char *event_name) const char *event_name)
......
...@@ -1205,7 +1205,7 @@ class Log_event ...@@ -1205,7 +1205,7 @@ class Log_event
A temp buffer for read_log_event; it is later analysed according to the A temp buffer for read_log_event; it is later analysed according to the
event's type, and its content is distributed in the event-specific fields. event's type, and its content is distributed in the event-specific fields.
*/ */
char *temp_buf; uchar *temp_buf;
/* /*
TRUE <=> this event 'owns' temp_buf and should call my_free() when done TRUE <=> this event 'owns' temp_buf and should call my_free() when done
...@@ -1453,10 +1453,10 @@ class Log_event ...@@ -1453,10 +1453,10 @@ class Log_event
{ {
return (cache_type == Log_event::EVENT_NO_CACHE); return (cache_type == Log_event::EVENT_NO_CACHE);
} }
Log_event(const char* buf, const Format_description_log_event Log_event(const uchar *buf, const Format_description_log_event
*description_event); *description_event);
virtual ~Log_event() { free_temp_buf();} virtual ~Log_event() { free_temp_buf();}
void register_temp_buf(char* buf, bool must_free) void register_temp_buf(uchar* buf, bool must_free)
{ {
temp_buf= buf; temp_buf= buf;
event_owns_temp_buf= must_free; event_owns_temp_buf= must_free;
...@@ -1475,7 +1475,7 @@ class Log_event ...@@ -1475,7 +1475,7 @@ class Log_event
is calculated during write() is calculated during write()
*/ */
virtual int get_data_size() { return 0;} virtual int get_data_size() { return 0;}
static Log_event* read_log_event(const char* buf, uint event_len, static Log_event* read_log_event(const uchar *buf, uint event_len,
const char **error, const char **error,
const Format_description_log_event const Format_description_log_event
*description_event, my_bool crc_check); *description_event, my_bool crc_check);
...@@ -2150,7 +2150,7 @@ class Query_log_event: public Log_event ...@@ -2150,7 +2150,7 @@ class Query_log_event: public Log_event
#endif #endif
Query_log_event(); Query_log_event();
Query_log_event(const char* buf, uint event_len, Query_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event, const Format_description_log_event *description_event,
Log_event_type event_type); Log_event_type event_type);
~Query_log_event() ~Query_log_event()
...@@ -2182,8 +2182,10 @@ class Query_log_event: public Log_event ...@@ -2182,8 +2182,10 @@ class Query_log_event: public Log_event
int do_apply_event(rpl_group_info *rgi, int do_apply_event(rpl_group_info *rgi,
const char *query_arg, const char *query_arg,
uint32 q_len_arg); uint32 q_len_arg);
static bool peek_is_commit_rollback(const char *event_start, static bool peek_is_commit_rollback(const uchar *event_start,
size_t event_len, enum enum_binlog_checksum_alg checksum_alg); size_t event_len,
enum enum_binlog_checksum_alg
checksum_alg);
#endif /* HAVE_REPLICATION */ #endif /* HAVE_REPLICATION */
/* /*
If true, the event always be applied by slave SQL thread or be printed by If true, the event always be applied by slave SQL thread or be printed by
...@@ -2216,7 +2218,7 @@ class Query_compressed_log_event:public Query_log_event{ ...@@ -2216,7 +2218,7 @@ class Query_compressed_log_event:public Query_log_event{
protected: protected:
Log_event::Byte* query_buf; // point to the uncompressed query Log_event::Byte* query_buf; // point to the uncompressed query
public: public:
Query_compressed_log_event(const char* buf, uint event_len, Query_compressed_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event, const Format_description_log_event *description_event,
Log_event_type event_type); Log_event_type event_type);
~Query_compressed_log_event() ~Query_compressed_log_event()
...@@ -2268,7 +2270,7 @@ struct sql_ex_info ...@@ -2268,7 +2270,7 @@ struct sql_ex_info
line_start_len + escaped_len + 6 : 7); line_start_len + escaped_len + 6 : 7);
} }
bool write_data(Log_event_writer *writer); bool write_data(Log_event_writer *writer);
const char* init(const char* buf, const char* buf_end, bool use_new_format); const uchar *init(const uchar *buf, const uchar* buf_end, bool use_new_format);
bool new_format() bool new_format()
{ {
return ((cached_new_format != -1) ? cached_new_format : return ((cached_new_format != -1) ? cached_new_format :
...@@ -2482,7 +2484,7 @@ class Load_log_event: public Log_event ...@@ -2482,7 +2484,7 @@ class Load_log_event: public Log_event
{ {
private: private:
protected: protected:
int copy_log_event(const char *buf, ulong event_len, int copy_log_event(const uchar *buf, ulong event_len,
int body_offset, int body_offset,
const Format_description_log_event* description_event); const Format_description_log_event* description_event);
...@@ -2563,7 +2565,7 @@ class Load_log_event: public Log_event ...@@ -2563,7 +2565,7 @@ class Load_log_event: public Log_event
logging of LOAD DATA is going to be changed in 4.1 or 5.0, this is only used logging of LOAD DATA is going to be changed in 4.1 or 5.0, this is only used
for the common_header_len (post_header_len will not be changed). for the common_header_len (post_header_len will not be changed).
*/ */
Load_log_event(const char* buf, uint event_len, Load_log_event(const uchar *buf, uint event_len,
const Format_description_log_event* description_event); const Format_description_log_event* description_event);
~Load_log_event() ~Load_log_event()
{} {}
...@@ -2654,7 +2656,7 @@ class Start_log_event_v3: public Log_event ...@@ -2654,7 +2656,7 @@ class Start_log_event_v3: public Log_event
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); bool print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
Start_log_event_v3(const char* buf, uint event_len, Start_log_event_v3(const uchar *buf, uint event_len,
const Format_description_log_event* description_event); const Format_description_log_event* description_event);
~Start_log_event_v3() {} ~Start_log_event_v3() {}
Log_event_type get_type_code() { return START_EVENT_V3;} Log_event_type get_type_code() { return START_EVENT_V3;}
...@@ -2723,9 +2725,9 @@ class Start_encryption_log_event : public Log_event ...@@ -2723,9 +2725,9 @@ class Start_encryption_log_event : public Log_event
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); bool print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
Start_encryption_log_event( Start_encryption_log_event(const uchar *buf, uint event_len,
const char* buf, uint event_len, const Format_description_log_event
const Format_description_log_event* description_event); *description_event);
bool is_valid() const { return crypto_scheme == 1; } bool is_valid() const { return crypto_scheme == 1; }
...@@ -2828,7 +2830,7 @@ class Format_description_log_event: public Start_log_event_v3 ...@@ -2828,7 +2830,7 @@ class Format_description_log_event: public Start_log_event_v3
const uint8 *event_type_permutation; const uint8 *event_type_permutation;
Format_description_log_event(uint8 binlog_ver, const char* server_ver=0); Format_description_log_event(uint8 binlog_ver, const char* server_ver=0);
Format_description_log_event(const char* buf, uint event_len, Format_description_log_event(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event); *description_event);
~Format_description_log_event() ~Format_description_log_event()
...@@ -2942,7 +2944,7 @@ Intvar_log_event(THD* thd_arg,uchar type_arg, ulonglong val_arg, ...@@ -2942,7 +2944,7 @@ Intvar_log_event(THD* thd_arg,uchar type_arg, ulonglong val_arg,
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); bool print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
Intvar_log_event(const char* buf, Intvar_log_event(const uchar *buf,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
~Intvar_log_event() {} ~Intvar_log_event() {}
Log_event_type get_type_code() { return INTVAR_EVENT;} Log_event_type get_type_code() { return INTVAR_EVENT;}
...@@ -3023,7 +3025,7 @@ class Rand_log_event: public Log_event ...@@ -3023,7 +3025,7 @@ class Rand_log_event: public Log_event
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); bool print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
Rand_log_event(const char* buf, Rand_log_event(const uchar *buf,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
~Rand_log_event() {} ~Rand_log_event() {}
Log_event_type get_type_code() { return RAND_EVENT;} Log_event_type get_type_code() { return RAND_EVENT;}
...@@ -3050,7 +3052,7 @@ class Xid_apply_log_event: public Log_event ...@@ -3050,7 +3052,7 @@ class Xid_apply_log_event: public Log_event
Xid_apply_log_event(THD* thd_arg): Xid_apply_log_event(THD* thd_arg):
Log_event(thd_arg, 0, TRUE) {} Log_event(thd_arg, 0, TRUE) {}
#endif #endif
Xid_apply_log_event(const char* buf, Xid_apply_log_event(const uchar *buf,
const Format_description_log_event *description_event): const Format_description_log_event *description_event):
Log_event(buf, description_event) {} Log_event(buf, description_event) {}
...@@ -3103,7 +3105,7 @@ class Xid_log_event: public Xid_apply_log_event ...@@ -3103,7 +3105,7 @@ class Xid_log_event: public Xid_apply_log_event
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); bool print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
Xid_log_event(const char* buf, Xid_log_event(const uchar *buf,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
~Xid_log_event() {} ~Xid_log_event() {}
Log_event_type get_type_code() { return XID_EVENT;} Log_event_type get_type_code() { return XID_EVENT;}
...@@ -3248,7 +3250,7 @@ class XA_prepare_log_event: public Xid_apply_log_event ...@@ -3248,7 +3250,7 @@ class XA_prepare_log_event: public Xid_apply_log_event
#else #else
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); bool print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
XA_prepare_log_event(const char* buf, XA_prepare_log_event(const uchar *buf,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
~XA_prepare_log_event() {} ~XA_prepare_log_event() {}
Log_event_type get_type_code() { return XA_PREPARE_LOG_EVENT; } Log_event_type get_type_code() { return XA_PREPARE_LOG_EVENT; }
...@@ -3305,7 +3307,8 @@ class User_var_log_event: public Log_event ...@@ -3305,7 +3307,8 @@ class User_var_log_event: public Log_event
bool deferred; bool deferred;
query_id_t query_id; query_id_t query_id;
User_var_log_event(THD* thd_arg, const char *name_arg, size_t name_len_arg, User_var_log_event(THD* thd_arg, const char *name_arg, size_t name_len_arg,
const char *val_arg, size_t val_len_arg, Item_result type_arg, const char *val_arg, size_t val_len_arg,
Item_result type_arg,
uint charset_number_arg, uchar flags_arg, uint charset_number_arg, uchar flags_arg,
bool using_trans, bool direct) bool using_trans, bool direct)
:Log_event(thd_arg, 0, using_trans), :Log_event(thd_arg, 0, using_trans),
...@@ -3322,7 +3325,7 @@ class User_var_log_event: public Log_event ...@@ -3322,7 +3325,7 @@ class User_var_log_event: public Log_event
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); bool print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
User_var_log_event(const char* buf, uint event_len, User_var_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
~User_var_log_event() {} ~User_var_log_event() {}
Log_event_type get_type_code() { return USER_VAR_EVENT;} Log_event_type get_type_code() { return USER_VAR_EVENT;}
...@@ -3370,7 +3373,7 @@ class Stop_log_event: public Log_event ...@@ -3370,7 +3373,7 @@ class Stop_log_event: public Log_event
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); bool print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
Stop_log_event(const char* buf, Stop_log_event(const uchar *buf,
const Format_description_log_event *description_event): const Format_description_log_event *description_event):
Log_event(buf, description_event) Log_event(buf, description_event)
{} {}
...@@ -3451,7 +3454,7 @@ class Rotate_log_event: public Log_event ...@@ -3451,7 +3454,7 @@ class Rotate_log_event: public Log_event
DUP_NAME= 2, // if constructor should dup the string argument DUP_NAME= 2, // if constructor should dup the string argument
RELAY_LOG=4 // rotate event for relay log RELAY_LOG=4 // rotate event for relay log
}; };
const char* new_log_ident; const char *new_log_ident;
ulonglong pos; ulonglong pos;
uint ident_len; uint ident_len;
uint flags; uint flags;
...@@ -3466,7 +3469,7 @@ class Rotate_log_event: public Log_event ...@@ -3466,7 +3469,7 @@ class Rotate_log_event: public Log_event
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); bool print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
Rotate_log_event(const char* buf, uint event_len, Rotate_log_event(const uchar *buf, uint event_len,
const Format_description_log_event* description_event); const Format_description_log_event* description_event);
~Rotate_log_event() ~Rotate_log_event()
{ {
...@@ -3505,8 +3508,9 @@ class Binlog_checkpoint_log_event: public Log_event ...@@ -3505,8 +3508,9 @@ class Binlog_checkpoint_log_event: public Log_event
#else #else
bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); bool print(FILE *file, PRINT_EVENT_INFO *print_event_info);
#endif #endif
Binlog_checkpoint_log_event(const char *buf, uint event_len, Binlog_checkpoint_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event
*description_event);
~Binlog_checkpoint_log_event() { my_free(binlog_file_name); } ~Binlog_checkpoint_log_event() { my_free(binlog_file_name); }
Log_event_type get_type_code() { return BINLOG_CHECKPOINT_EVENT;} Log_event_type get_type_code() { return BINLOG_CHECKPOINT_EVENT;}
int get_data_size() { return binlog_file_len + BINLOG_CHECKPOINT_HEADER_LEN;} int get_data_size() { return binlog_file_len + BINLOG_CHECKPOINT_HEADER_LEN;}
...@@ -3638,7 +3642,7 @@ class Gtid_log_event: public Log_event ...@@ -3638,7 +3642,7 @@ class Gtid_log_event: public Log_event
#else #else
bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); bool print(FILE *file, PRINT_EVENT_INFO *print_event_info);
#endif #endif
Gtid_log_event(const char *buf, uint event_len, Gtid_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
~Gtid_log_event() { } ~Gtid_log_event() { }
Log_event_type get_type_code() { return GTID_EVENT; } Log_event_type get_type_code() { return GTID_EVENT; }
...@@ -3652,7 +3656,7 @@ class Gtid_log_event: public Log_event ...@@ -3652,7 +3656,7 @@ class Gtid_log_event: public Log_event
bool write(); bool write();
static int make_compatible_event(String *packet, bool *need_dummy_event, static int make_compatible_event(String *packet, bool *need_dummy_event,
ulong ev_offset, enum enum_binlog_checksum_alg checksum_alg); ulong ev_offset, enum enum_binlog_checksum_alg checksum_alg);
static bool peek(const char *event_start, size_t event_len, static bool peek(const uchar *event_start, size_t event_len,
enum enum_binlog_checksum_alg checksum_alg, enum enum_binlog_checksum_alg checksum_alg,
uint32 *domain_id, uint32 *server_id, uint64 *seq_no, uint32 *domain_id, uint32 *server_id, uint64 *seq_no,
uchar *flags2, const Format_description_log_event *fdev); uchar *flags2, const Format_description_log_event *fdev);
...@@ -3752,7 +3756,7 @@ class Gtid_list_log_event: public Log_event ...@@ -3752,7 +3756,7 @@ class Gtid_list_log_event: public Log_event
#else #else
bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); bool print(FILE *file, PRINT_EVENT_INFO *print_event_info);
#endif #endif
Gtid_list_log_event(const char *buf, uint event_len, Gtid_list_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
~Gtid_list_log_event() { my_free(list); my_free(sub_id_list); } ~Gtid_list_log_event() { my_free(list); my_free(sub_id_list); }
Log_event_type get_type_code() { return GTID_LIST_EVENT; } Log_event_type get_type_code() { return GTID_LIST_EVENT; }
...@@ -3796,8 +3800,8 @@ class Create_file_log_event: public Load_log_event ...@@ -3796,8 +3800,8 @@ class Create_file_log_event: public Load_log_event
*/ */
bool fake_base; bool fake_base;
public: public:
uchar* block; uchar *block;
const char *event_buf; const uchar *event_buf;
uint block_len; uint block_len;
uint file_id; uint file_id;
bool inited_from_old; bool inited_from_old;
...@@ -3819,7 +3823,7 @@ class Create_file_log_event: public Load_log_event ...@@ -3819,7 +3823,7 @@ class Create_file_log_event: public Load_log_event
bool enable_local); bool enable_local);
#endif #endif
Create_file_log_event(const char* buf, uint event_len, Create_file_log_event(const uchar *buf, uint event_len,
const Format_description_log_event* description_event); const Format_description_log_event* description_event);
~Create_file_log_event() ~Create_file_log_event()
{ {
...@@ -3871,7 +3875,7 @@ class Append_block_log_event: public Log_event ...@@ -3871,7 +3875,7 @@ class Append_block_log_event: public Log_event
event needs to have a 'db' member to be well filtered by event needs to have a 'db' member to be well filtered by
binlog-*-db rules). 'db' is not written to the binlog (it's not binlog-*-db rules). 'db' is not written to the binlog (it's not
used by Append_block_log_event::write()), so it can't be read in used by Append_block_log_event::write()), so it can't be read in
the Append_block_log_event(const char* buf, int event_len) the Append_block_log_event(const uchar *buf, int event_len)
constructor. In other words, 'db' is used only for filtering by constructor. In other words, 'db' is used only for filtering by
binlog-*-db rules. Create_file_log_event is different: it's 'db' binlog-*-db rules. Create_file_log_event is different: it's 'db'
(which is inherited from Load_log_event) is written to the binlog (which is inherited from Load_log_event) is written to the binlog
...@@ -3890,7 +3894,7 @@ class Append_block_log_event: public Log_event ...@@ -3890,7 +3894,7 @@ class Append_block_log_event: public Log_event
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); bool print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
Append_block_log_event(const char* buf, uint event_len, Append_block_log_event(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event); *description_event);
~Append_block_log_event() {} ~Append_block_log_event() {}
...@@ -3932,7 +3936,7 @@ class Delete_file_log_event: public Log_event ...@@ -3932,7 +3936,7 @@ class Delete_file_log_event: public Log_event
bool enable_local); bool enable_local);
#endif #endif
Delete_file_log_event(const char* buf, uint event_len, Delete_file_log_event(const uchar *buf, uint event_len,
const Format_description_log_event* description_event); const Format_description_log_event* description_event);
~Delete_file_log_event() {} ~Delete_file_log_event() {}
Log_event_type get_type_code() { return DELETE_FILE_EVENT;} Log_event_type get_type_code() { return DELETE_FILE_EVENT;}
...@@ -3971,7 +3975,7 @@ class Execute_load_log_event: public Log_event ...@@ -3971,7 +3975,7 @@ class Execute_load_log_event: public Log_event
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); bool print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
Execute_load_log_event(const char* buf, uint event_len, Execute_load_log_event(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event); *description_event);
~Execute_load_log_event() {} ~Execute_load_log_event() {}
...@@ -4011,7 +4015,7 @@ class Begin_load_query_log_event: public Append_block_log_event ...@@ -4011,7 +4015,7 @@ class Begin_load_query_log_event: public Append_block_log_event
int get_create_or_append() const; int get_create_or_append() const;
#endif /* HAVE_REPLICATION */ #endif /* HAVE_REPLICATION */
#endif #endif
Begin_load_query_log_event(const char* buf, uint event_len, Begin_load_query_log_event(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event); *description_event);
~Begin_load_query_log_event() {} ~Begin_load_query_log_event() {}
...@@ -4069,7 +4073,7 @@ class Execute_load_query_log_event: public Query_log_event ...@@ -4069,7 +4073,7 @@ class Execute_load_query_log_event: public Query_log_event
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info, bool print(FILE* file, PRINT_EVENT_INFO* print_event_info,
const char *local_fname); const char *local_fname);
#endif #endif
Execute_load_query_log_event(const char* buf, uint event_len, Execute_load_query_log_event(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event); *description_event);
~Execute_load_query_log_event() {} ~Execute_load_query_log_event() {}
...@@ -4104,7 +4108,7 @@ class Unknown_log_event: public Log_event ...@@ -4104,7 +4108,7 @@ class Unknown_log_event: public Log_event
Log_event's ctor, this way we can extract maximum information from the Log_event's ctor, this way we can extract maximum information from the
event's header (the unique ID for example). event's header (the unique ID for example).
*/ */
Unknown_log_event(const char* buf, Unknown_log_event(const uchar *buf,
const Format_description_log_event *description_event): const Format_description_log_event *description_event):
Log_event(buf, description_event), what(UNKNOWN) Log_event(buf, description_event), what(UNKNOWN)
{} {}
...@@ -4136,7 +4140,7 @@ class Annotate_rows_log_event: public Log_event ...@@ -4136,7 +4140,7 @@ class Annotate_rows_log_event: public Log_event
#ifndef MYSQL_CLIENT #ifndef MYSQL_CLIENT
Annotate_rows_log_event(THD*, bool using_trans, bool direct); Annotate_rows_log_event(THD*, bool using_trans, bool direct);
#endif #endif
Annotate_rows_log_event(const char *buf, uint event_len, Annotate_rows_log_event(const uchar *buf, uint event_len,
const Format_description_log_event*); const Format_description_log_event*);
~Annotate_rows_log_event(); ~Annotate_rows_log_event();
...@@ -4786,7 +4790,7 @@ class Table_map_log_event : public Log_event ...@@ -4786,7 +4790,7 @@ class Table_map_log_event : public Log_event
Table_map_log_event(THD *thd, TABLE *tbl, ulong tid, bool is_transactional); Table_map_log_event(THD *thd, TABLE *tbl, ulong tid, bool is_transactional);
#endif #endif
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Table_map_log_event(const char *buf, uint event_len, Table_map_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
#endif #endif
...@@ -5113,7 +5117,7 @@ class Rows_log_event : public Log_event ...@@ -5113,7 +5117,7 @@ class Rows_log_event : public Log_event
MY_BITMAP const *cols, bool is_transactional, MY_BITMAP const *cols, bool is_transactional,
Log_event_type event_type); Log_event_type event_type);
#endif #endif
Rows_log_event(const char *row_data, uint event_len, Rows_log_event(const uchar *row_data, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
void uncompress_buf(); void uncompress_buf();
...@@ -5302,7 +5306,7 @@ class Write_rows_log_event : public Rows_log_event ...@@ -5302,7 +5306,7 @@ class Write_rows_log_event : public Rows_log_event
bool is_transactional); bool is_transactional);
#endif #endif
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Write_rows_log_event(const char *buf, uint event_len, Write_rows_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
#endif #endif
#if defined(MYSQL_SERVER) #if defined(MYSQL_SERVER)
...@@ -5344,7 +5348,7 @@ class Write_rows_compressed_log_event : public Write_rows_log_event ...@@ -5344,7 +5348,7 @@ class Write_rows_compressed_log_event : public Write_rows_log_event
virtual bool write(); virtual bool write();
#endif #endif
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Write_rows_compressed_log_event(const char *buf, uint event_len, Write_rows_compressed_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
#endif #endif
private: private:
...@@ -5384,7 +5388,7 @@ class Update_rows_log_event : public Rows_log_event ...@@ -5384,7 +5388,7 @@ class Update_rows_log_event : public Rows_log_event
virtual ~Update_rows_log_event(); virtual ~Update_rows_log_event();
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Update_rows_log_event(const char *buf, uint event_len, Update_rows_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
#endif #endif
...@@ -5432,7 +5436,7 @@ class Update_rows_compressed_log_event : public Update_rows_log_event ...@@ -5432,7 +5436,7 @@ class Update_rows_compressed_log_event : public Update_rows_log_event
virtual bool write(); virtual bool write();
#endif #endif
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Update_rows_compressed_log_event(const char *buf, uint event_len, Update_rows_compressed_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
#endif #endif
private: private:
...@@ -5474,7 +5478,7 @@ class Delete_rows_log_event : public Rows_log_event ...@@ -5474,7 +5478,7 @@ class Delete_rows_log_event : public Rows_log_event
Delete_rows_log_event(THD*, TABLE*, ulong, bool is_transactional); Delete_rows_log_event(THD*, TABLE*, ulong, bool is_transactional);
#endif #endif
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Delete_rows_log_event(const char *buf, uint event_len, Delete_rows_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
#endif #endif
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
...@@ -5516,7 +5520,7 @@ class Delete_rows_compressed_log_event : public Delete_rows_log_event ...@@ -5516,7 +5520,7 @@ class Delete_rows_compressed_log_event : public Delete_rows_log_event
virtual bool write(); virtual bool write();
#endif #endif
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Delete_rows_compressed_log_event(const char *buf, uint event_len, Delete_rows_compressed_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
#endif #endif
private: private:
...@@ -5610,7 +5614,7 @@ class Incident_log_event : public Log_event { ...@@ -5610,7 +5614,7 @@ class Incident_log_event : public Log_event {
virtual bool write_data_body(); virtual bool write_data_body();
#endif #endif
Incident_log_event(const char *buf, uint event_len, Incident_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *descr_event); const Format_description_log_event *descr_event);
virtual ~Incident_log_event(); virtual ~Incident_log_event();
...@@ -5673,7 +5677,7 @@ class Ignorable_log_event : public Log_event { ...@@ -5673,7 +5677,7 @@ class Ignorable_log_event : public Log_event {
} }
#endif #endif
Ignorable_log_event(const char *buf, Ignorable_log_event(const uchar *buf,
const Format_description_log_event *descr_event, const Format_description_log_event *descr_event,
const char *event_name); const char *event_name);
virtual ~Ignorable_log_event(); virtual ~Ignorable_log_event();
...@@ -5726,7 +5730,7 @@ class Heartbeat_log_event: public Log_event ...@@ -5726,7 +5730,7 @@ class Heartbeat_log_event: public Log_event
{ {
public: public:
uint8 hb_flags; uint8 hb_flags;
Heartbeat_log_event(const char* buf, ulong event_len, Heartbeat_log_event(const uchar *buf, uint event_len,
const Format_description_log_event* description_event); const Format_description_log_event* description_event);
Log_event_type get_type_code() { return HEARTBEAT_LOG_EVENT; } Log_event_type get_type_code() { return HEARTBEAT_LOG_EVENT; }
bool is_valid() const bool is_valid() const
...@@ -5734,12 +5738,12 @@ class Heartbeat_log_event: public Log_event ...@@ -5734,12 +5738,12 @@ class Heartbeat_log_event: public Log_event
return (log_ident != NULL && ident_len <= FN_REFLEN-1 && return (log_ident != NULL && ident_len <= FN_REFLEN-1 &&
log_pos >= BIN_LOG_HEADER_SIZE); log_pos >= BIN_LOG_HEADER_SIZE);
} }
const char * get_log_ident() { return log_ident; } const uchar * get_log_ident() { return log_ident; }
uint get_ident_len() { return ident_len; } uint get_ident_len() { return ident_len; }
private: private:
const char* log_ident;
uint ident_len; uint ident_len;
const uchar *log_ident;
}; };
inline int Log_event_writer::write(Log_event *ev) inline int Log_event_writer::write(Log_event *ev)
...@@ -5760,9 +5764,10 @@ inline int Log_event_writer::write(Log_event *ev) ...@@ -5760,9 +5764,10 @@ inline int Log_event_writer::write(Log_event *ev)
bool slave_execute_deferred_events(THD *thd); bool slave_execute_deferred_events(THD *thd);
#endif #endif
bool event_that_should_be_ignored(const char *buf); bool event_that_should_be_ignored(const uchar *buf);
bool event_checksum_test(uchar *buf, ulong event_len, enum_binlog_checksum_alg alg); bool event_checksum_test(uchar *buf, ulong event_len,
enum enum_binlog_checksum_alg get_checksum_alg(const char* buf, ulong len); enum_binlog_checksum_alg alg);
enum enum_binlog_checksum_alg get_checksum_alg(const uchar *buf, ulong len);
extern TYPELIB binlog_checksum_typelib; extern TYPELIB binlog_checksum_typelib;
#ifdef WITH_WSREP #ifdef WITH_WSREP
enum Log_event_type wsrep_peak_event(rpl_group_info *rgi, ulonglong* event_size); enum Log_event_type wsrep_peak_event(rpl_group_info *rgi, ulonglong* event_size);
...@@ -5773,17 +5778,23 @@ enum Log_event_type wsrep_peak_event(rpl_group_info *rgi, ulonglong* event_size) ...@@ -5773,17 +5778,23 @@ enum Log_event_type wsrep_peak_event(rpl_group_info *rgi, ulonglong* event_size)
*/ */
int binlog_buf_compress(const char *src, char *dst, uint32 len, uint32 *comlen); int binlog_buf_compress(const uchar *src, uchar *dst, uint32 len,
int binlog_buf_uncompress(const char *src, char *dst, uint32 len, uint32 *newlen); uint32 *comlen);
int binlog_buf_uncompress(const uchar *src, uchar *dst, uint32 len,
uint32 *newlen);
uint32 binlog_get_compress_len(uint32 len); uint32 binlog_get_compress_len(uint32 len);
uint32 binlog_get_uncompress_len(const char *buf); uint32 binlog_get_uncompress_len(const uchar *buf);
int query_event_uncompress(const Format_description_log_event *description_event, bool contain_checksum, int query_event_uncompress(const Format_description_log_event *description_event,
const char *src, ulong src_len, char* buf, ulong buf_size, bool* is_malloc, bool contain_checksum,
char **dst, ulong *newlen); const uchar *src, ulong src_len, uchar *buf,
ulong buf_size, bool* is_malloc,
int row_log_event_uncompress(const Format_description_log_event *description_event, bool contain_checksum, uchar **dst, ulong *newlen);
const char *src, ulong src_len, char* buf, ulong buf_size, bool* is_malloc, int row_log_event_uncompress(const Format_description_log_event
char **dst, ulong *newlen); *description_event,
bool contain_checksum,
const uchar *src, ulong src_len,
uchar* buf, ulong buf_size, bool *is_malloc,
uchar **dst, ulong *newlen);
#endif /* _log_event_h */ #endif /* _log_event_h */
...@@ -1587,7 +1587,7 @@ bool Log_event::print_base64(IO_CACHE* file, ...@@ -1587,7 +1587,7 @@ bool Log_event::print_base64(IO_CACHE* file,
PRINT_EVENT_INFO* print_event_info, PRINT_EVENT_INFO* print_event_info,
bool do_print_encoded) bool do_print_encoded)
{ {
uchar *ptr= (uchar *)temp_buf; uchar *ptr= temp_buf;
uint32 size= uint4korr(ptr + EVENT_LEN_OFFSET); uint32 size= uint4korr(ptr + EVENT_LEN_OFFSET);
DBUG_ENTER("Log_event::print_base64"); DBUG_ENTER("Log_event::print_base64");
...@@ -1602,31 +1602,31 @@ bool Log_event::print_base64(IO_CACHE* file, ...@@ -1602,31 +1602,31 @@ bool Log_event::print_base64(IO_CACHE* file,
switch (ev_type) { switch (ev_type) {
case WRITE_ROWS_EVENT: case WRITE_ROWS_EVENT:
ptr[EVENT_TYPE_OFFSET]= DELETE_ROWS_EVENT; ptr[EVENT_TYPE_OFFSET]= DELETE_ROWS_EVENT;
ev= new Delete_rows_log_event((const char*) ptr, tmp_size, ev= new Delete_rows_log_event(ptr, tmp_size,
glob_description_event); glob_description_event);
ev->change_to_flashback_event(print_event_info, ptr, ev_type); ev->change_to_flashback_event(print_event_info, ptr, ev_type);
break; break;
case WRITE_ROWS_EVENT_V1: case WRITE_ROWS_EVENT_V1:
ptr[EVENT_TYPE_OFFSET]= DELETE_ROWS_EVENT_V1; ptr[EVENT_TYPE_OFFSET]= DELETE_ROWS_EVENT_V1;
ev= new Delete_rows_log_event((const char*) ptr, tmp_size, ev= new Delete_rows_log_event(ptr, tmp_size,
glob_description_event); glob_description_event);
ev->change_to_flashback_event(print_event_info, ptr, ev_type); ev->change_to_flashback_event(print_event_info, ptr, ev_type);
break; break;
case DELETE_ROWS_EVENT: case DELETE_ROWS_EVENT:
ptr[EVENT_TYPE_OFFSET]= WRITE_ROWS_EVENT; ptr[EVENT_TYPE_OFFSET]= WRITE_ROWS_EVENT;
ev= new Write_rows_log_event((const char*) ptr, tmp_size, ev= new Write_rows_log_event(ptr, tmp_size,
glob_description_event); glob_description_event);
ev->change_to_flashback_event(print_event_info, ptr, ev_type); ev->change_to_flashback_event(print_event_info, ptr, ev_type);
break; break;
case DELETE_ROWS_EVENT_V1: case DELETE_ROWS_EVENT_V1:
ptr[EVENT_TYPE_OFFSET]= WRITE_ROWS_EVENT_V1; ptr[EVENT_TYPE_OFFSET]= WRITE_ROWS_EVENT_V1;
ev= new Write_rows_log_event((const char*) ptr, tmp_size, ev= new Write_rows_log_event(ptr, tmp_size,
glob_description_event); glob_description_event);
ev->change_to_flashback_event(print_event_info, ptr, ev_type); ev->change_to_flashback_event(print_event_info, ptr, ev_type);
break; break;
case UPDATE_ROWS_EVENT: case UPDATE_ROWS_EVENT:
case UPDATE_ROWS_EVENT_V1: case UPDATE_ROWS_EVENT_V1:
ev= new Update_rows_log_event((const char*) ptr, tmp_size, ev= new Update_rows_log_event(ptr, tmp_size,
glob_description_event); glob_description_event);
ev->change_to_flashback_event(print_event_info, ptr, ev_type); ev->change_to_flashback_event(print_event_info, ptr, ev_type);
break; break;
...@@ -1673,7 +1673,7 @@ bool Log_event::print_base64(IO_CACHE* file, ...@@ -1673,7 +1673,7 @@ bool Log_event::print_base64(IO_CACHE* file,
case TABLE_MAP_EVENT: case TABLE_MAP_EVENT:
{ {
Table_map_log_event *map; Table_map_log_event *map;
map= new Table_map_log_event((const char*) ptr, size, map= new Table_map_log_event(ptr, size,
glob_description_event); glob_description_event);
#ifdef WHEN_FLASHBACK_REVIEW_READY #ifdef WHEN_FLASHBACK_REVIEW_READY
if (need_flashback_review) if (need_flashback_review)
...@@ -1688,42 +1688,42 @@ bool Log_event::print_base64(IO_CACHE* file, ...@@ -1688,42 +1688,42 @@ bool Log_event::print_base64(IO_CACHE* file,
case WRITE_ROWS_EVENT: case WRITE_ROWS_EVENT:
case WRITE_ROWS_EVENT_V1: case WRITE_ROWS_EVENT_V1:
{ {
ev= new Write_rows_log_event((const char*) ptr, size, ev= new Write_rows_log_event(ptr, size,
glob_description_event); glob_description_event);
break; break;
} }
case DELETE_ROWS_EVENT: case DELETE_ROWS_EVENT:
case DELETE_ROWS_EVENT_V1: case DELETE_ROWS_EVENT_V1:
{ {
ev= new Delete_rows_log_event((const char*) ptr, size, ev= new Delete_rows_log_event(ptr, size,
glob_description_event); glob_description_event);
break; break;
} }
case UPDATE_ROWS_EVENT: case UPDATE_ROWS_EVENT:
case UPDATE_ROWS_EVENT_V1: case UPDATE_ROWS_EVENT_V1:
{ {
ev= new Update_rows_log_event((const char*) ptr, size, ev= new Update_rows_log_event(ptr, size,
glob_description_event); glob_description_event);
break; break;
} }
case WRITE_ROWS_COMPRESSED_EVENT: case WRITE_ROWS_COMPRESSED_EVENT:
case WRITE_ROWS_COMPRESSED_EVENT_V1: case WRITE_ROWS_COMPRESSED_EVENT_V1:
{ {
ev= new Write_rows_compressed_log_event((const char*) ptr, size, ev= new Write_rows_compressed_log_event(ptr, size,
glob_description_event); glob_description_event);
break; break;
} }
case UPDATE_ROWS_COMPRESSED_EVENT: case UPDATE_ROWS_COMPRESSED_EVENT:
case UPDATE_ROWS_COMPRESSED_EVENT_V1: case UPDATE_ROWS_COMPRESSED_EVENT_V1:
{ {
ev= new Update_rows_compressed_log_event((const char*) ptr, size, ev= new Update_rows_compressed_log_event(ptr, size,
glob_description_event); glob_description_event);
break; break;
} }
case DELETE_ROWS_COMPRESSED_EVENT: case DELETE_ROWS_COMPRESSED_EVENT:
case DELETE_ROWS_COMPRESSED_EVENT_V1: case DELETE_ROWS_COMPRESSED_EVENT_V1:
{ {
ev= new Delete_rows_compressed_log_event((const char*) ptr, size, ev= new Delete_rows_compressed_log_event(ptr, size,
glob_description_event); glob_description_event);
break; break;
} }
...@@ -3103,7 +3103,8 @@ int Table_map_log_event::rewrite_db(const char* new_db, size_t new_len, ...@@ -3103,7 +3103,8 @@ int Table_map_log_event::rewrite_db(const char* new_db, size_t new_len,
// Create new temp_buf // Create new temp_buf
ulong event_cur_len= uint4korr(temp_buf + EVENT_LEN_OFFSET); ulong event_cur_len= uint4korr(temp_buf + EVENT_LEN_OFFSET);
ulong event_new_len= event_cur_len + len_diff; ulong event_new_len= event_cur_len + len_diff;
char* new_temp_buf= (char*) my_malloc(PSI_NOT_INSTRUMENTED, event_new_len, MYF(MY_WME)); uchar* new_temp_buf= (uchar*) my_malloc(PSI_NOT_INSTRUMENTED, event_new_len,
MYF(MY_WME));
if (!new_temp_buf) if (!new_temp_buf)
{ {
...@@ -3114,7 +3115,7 @@ int Table_map_log_event::rewrite_db(const char* new_db, size_t new_len, ...@@ -3114,7 +3115,7 @@ int Table_map_log_event::rewrite_db(const char* new_db, size_t new_len,
} }
// Rewrite temp_buf // Rewrite temp_buf
char* ptr= new_temp_buf; uchar *ptr= new_temp_buf;
size_t cnt= 0; size_t cnt= 0;
// Copy header and change event length // Copy header and change event length
...@@ -3612,12 +3613,13 @@ bool Write_rows_log_event::print(FILE *file, PRINT_EVENT_INFO* print_event_info) ...@@ -3612,12 +3613,13 @@ bool Write_rows_log_event::print(FILE *file, PRINT_EVENT_INFO* print_event_info)
bool Write_rows_compressed_log_event::print(FILE *file, bool Write_rows_compressed_log_event::print(FILE *file,
PRINT_EVENT_INFO* print_event_info) PRINT_EVENT_INFO* print_event_info)
{ {
char *new_buf; uchar *new_buf;
ulong len; ulong len;
bool is_malloc = false; bool is_malloc = false;
if(!row_log_event_uncompress(glob_description_event, if(!row_log_event_uncompress(glob_description_event,
checksum_alg == BINLOG_CHECKSUM_ALG_CRC32, checksum_alg == BINLOG_CHECKSUM_ALG_CRC32,
temp_buf, UINT_MAX32, NULL, 0, &is_malloc, &new_buf, &len)) temp_buf, UINT_MAX32, NULL, 0, &is_malloc,
&new_buf, &len))
{ {
free_temp_buf(); free_temp_buf();
register_temp_buf(new_buf, true); register_temp_buf(new_buf, true);
...@@ -3648,12 +3650,13 @@ bool Delete_rows_log_event::print(FILE *file, ...@@ -3648,12 +3650,13 @@ bool Delete_rows_log_event::print(FILE *file,
bool Delete_rows_compressed_log_event::print(FILE *file, bool Delete_rows_compressed_log_event::print(FILE *file,
PRINT_EVENT_INFO* print_event_info) PRINT_EVENT_INFO* print_event_info)
{ {
char *new_buf; uchar *new_buf;
ulong len; ulong len;
bool is_malloc = false; bool is_malloc = false;
if(!row_log_event_uncompress(glob_description_event, if(!row_log_event_uncompress(glob_description_event,
checksum_alg == BINLOG_CHECKSUM_ALG_CRC32, checksum_alg == BINLOG_CHECKSUM_ALG_CRC32,
temp_buf, UINT_MAX32, NULL, 0, &is_malloc, &new_buf, &len)) temp_buf, UINT_MAX32, NULL, 0, &is_malloc,
&new_buf, &len))
{ {
free_temp_buf(); free_temp_buf();
register_temp_buf(new_buf, true); register_temp_buf(new_buf, true);
...@@ -3684,12 +3687,13 @@ bool ...@@ -3684,12 +3687,13 @@ bool
Update_rows_compressed_log_event::print(FILE *file, Update_rows_compressed_log_event::print(FILE *file,
PRINT_EVENT_INFO *print_event_info) PRINT_EVENT_INFO *print_event_info)
{ {
char *new_buf; uchar *new_buf;
ulong len; ulong len;
bool is_malloc= false; bool is_malloc= false;
if(!row_log_event_uncompress(glob_description_event, if(!row_log_event_uncompress(glob_description_event,
checksum_alg == BINLOG_CHECKSUM_ALG_CRC32, checksum_alg == BINLOG_CHECKSUM_ALG_CRC32,
temp_buf, UINT_MAX32, NULL, 0, &is_malloc, &new_buf, &len)) temp_buf, UINT_MAX32, NULL, 0, &is_malloc,
&new_buf, &len))
{ {
free_temp_buf(); free_temp_buf();
register_temp_buf(new_buf, true); register_temp_buf(new_buf, true);
......
...@@ -1175,7 +1175,7 @@ Old_rows_log_event::Old_rows_log_event(THD *thd_arg, TABLE *tbl_arg, ulong tid, ...@@ -1175,7 +1175,7 @@ Old_rows_log_event::Old_rows_log_event(THD *thd_arg, TABLE *tbl_arg, ulong tid,
#endif #endif
Old_rows_log_event::Old_rows_log_event(const char *buf, uint event_len, Old_rows_log_event::Old_rows_log_event(const uchar *buf, uint event_len,
Log_event_type event_type, Log_event_type event_type,
const Format_description_log_event const Format_description_log_event
*description_event) *description_event)
...@@ -1198,8 +1198,8 @@ Old_rows_log_event::Old_rows_log_event(const char *buf, uint event_len, ...@@ -1198,8 +1198,8 @@ Old_rows_log_event::Old_rows_log_event(const char *buf, uint event_len,
event_len, common_header_len, event_len, common_header_len,
post_header_len)); post_header_len));
const char *post_start= buf + common_header_len; const uchar *post_start= buf + common_header_len;
DBUG_DUMP("post_header", (uchar*) post_start, post_header_len); DBUG_DUMP("post_header", post_start, post_header_len);
post_start+= RW_MAPID_OFFSET; post_start+= RW_MAPID_OFFSET;
if (post_header_len == 6) if (post_header_len == 6)
{ {
...@@ -2417,7 +2417,7 @@ Write_rows_log_event_old::Write_rows_log_event_old(THD *thd_arg, ...@@ -2417,7 +2417,7 @@ Write_rows_log_event_old::Write_rows_log_event_old(THD *thd_arg,
Constructor used by slave to read the event from the binary log. Constructor used by slave to read the event from the binary log.
*/ */
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Write_rows_log_event_old::Write_rows_log_event_old(const char *buf, Write_rows_log_event_old::Write_rows_log_event_old(const uchar *buf,
uint event_len, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event) *description_event)
...@@ -2530,11 +2530,12 @@ Delete_rows_log_event_old::Delete_rows_log_event_old(THD *thd_arg, ...@@ -2530,11 +2530,12 @@ Delete_rows_log_event_old::Delete_rows_log_event_old(THD *thd_arg,
Constructor used by slave to read the event from the binary log. Constructor used by slave to read the event from the binary log.
*/ */
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Delete_rows_log_event_old::Delete_rows_log_event_old(const char *buf, Delete_rows_log_event_old::
Delete_rows_log_event_old(const uchar *buf,
uint event_len, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event) *description_event)
: Old_rows_log_event(buf, event_len, PRE_GA_DELETE_ROWS_EVENT, :Old_rows_log_event(buf, event_len, PRE_GA_DELETE_ROWS_EVENT,
description_event), description_event),
m_after_image(NULL), m_memory(NULL) m_after_image(NULL), m_memory(NULL)
{ {
...@@ -2544,8 +2545,8 @@ Delete_rows_log_event_old::Delete_rows_log_event_old(const char *buf, ...@@ -2544,8 +2545,8 @@ Delete_rows_log_event_old::Delete_rows_log_event_old(const char *buf,
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
int int Delete_rows_log_event_old::
Delete_rows_log_event_old::do_before_row_operations(const Slave_reporting_capability *const) do_before_row_operations(const Slave_reporting_capability *const)
{ {
if ((m_table->file->ha_table_flags() & HA_PRIMARY_KEY_REQUIRED_FOR_POSITION) && if ((m_table->file->ha_table_flags() & HA_PRIMARY_KEY_REQUIRED_FOR_POSITION) &&
m_table->s->primary_key < MAX_KEY) m_table->s->primary_key < MAX_KEY)
...@@ -2636,7 +2637,7 @@ Update_rows_log_event_old::Update_rows_log_event_old(THD *thd_arg, ...@@ -2636,7 +2637,7 @@ Update_rows_log_event_old::Update_rows_log_event_old(THD *thd_arg,
Constructor used by slave to read the event from the binary log. Constructor used by slave to read the event from the binary log.
*/ */
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Update_rows_log_event_old::Update_rows_log_event_old(const char *buf, Update_rows_log_event_old::Update_rows_log_event_old(const uchar *buf,
uint event_len, uint event_len,
const const
Format_description_log_event Format_description_log_event
...@@ -2652,12 +2653,14 @@ Update_rows_log_event_old::Update_rows_log_event_old(const char *buf, ...@@ -2652,12 +2653,14 @@ Update_rows_log_event_old::Update_rows_log_event_old(const char *buf,
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
int int
Update_rows_log_event_old::do_before_row_operations(const Slave_reporting_capability *const) Update_rows_log_event_old::
do_before_row_operations(const Slave_reporting_capability *const)
{ {
if (m_table->s->keys > 0) if (m_table->s->keys > 0)
{ {
// Allocate buffer for key searches // Allocate buffer for key searches
m_key= (uchar*)my_malloc(key_memory_log_event_old, m_table->key_info->key_length, MYF(MY_WME)); m_key= (uchar*)my_malloc(key_memory_log_event_old,
m_table->key_info->key_length, MYF(MY_WME));
if (!m_key) if (!m_key)
return HA_ERR_OUT_OF_MEM; return HA_ERR_OUT_OF_MEM;
} }
...@@ -2667,8 +2670,8 @@ Update_rows_log_event_old::do_before_row_operations(const Slave_reporting_capabi ...@@ -2667,8 +2670,8 @@ Update_rows_log_event_old::do_before_row_operations(const Slave_reporting_capabi
int int
Update_rows_log_event_old::do_after_row_operations(const Slave_reporting_capability *const, Update_rows_log_event_old::
int error) do_after_row_operations(const Slave_reporting_capability *const, int error)
{ {
/*error= ToDo:find out what this should really be, this triggers close_scan in nbd, returning error?*/ /*error= ToDo:find out what this should really be, this triggers close_scan in nbd, returning error?*/
m_table->file->ha_index_or_rnd_end(); m_table->file->ha_index_or_rnd_end();
......
...@@ -161,7 +161,7 @@ class Old_rows_log_event : public Log_event ...@@ -161,7 +161,7 @@ class Old_rows_log_event : public Log_event
Old_rows_log_event(THD*, TABLE*, ulong table_id, Old_rows_log_event(THD*, TABLE*, ulong table_id,
MY_BITMAP const *cols, bool is_transactional); MY_BITMAP const *cols, bool is_transactional);
#endif #endif
Old_rows_log_event(const char *row_data, uint event_len, Old_rows_log_event(const uchar *row_data, uint event_len,
Log_event_type event_type, Log_event_type event_type,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
...@@ -363,7 +363,7 @@ class Write_rows_log_event_old : public Old_rows_log_event ...@@ -363,7 +363,7 @@ class Write_rows_log_event_old : public Old_rows_log_event
MY_BITMAP const *cols, bool is_transactional); MY_BITMAP const *cols, bool is_transactional);
#endif #endif
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Write_rows_log_event_old(const char *buf, uint event_len, Write_rows_log_event_old(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
#endif #endif
#if !defined(MYSQL_CLIENT) #if !defined(MYSQL_CLIENT)
...@@ -436,7 +436,7 @@ class Update_rows_log_event_old : public Old_rows_log_event ...@@ -436,7 +436,7 @@ class Update_rows_log_event_old : public Old_rows_log_event
#endif #endif
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Update_rows_log_event_old(const char *buf, uint event_len, Update_rows_log_event_old(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
#endif #endif
...@@ -511,7 +511,7 @@ class Delete_rows_log_event_old : public Old_rows_log_event ...@@ -511,7 +511,7 @@ class Delete_rows_log_event_old : public Old_rows_log_event
MY_BITMAP const *cols, bool is_transactional); MY_BITMAP const *cols, bool is_transactional);
#endif #endif
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
Delete_rows_log_event_old(const char *buf, uint event_len, Delete_rows_log_event_old(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
#endif #endif
#if !defined(MYSQL_CLIENT) #if !defined(MYSQL_CLIENT)
......
...@@ -1331,14 +1331,14 @@ bool Query_log_event::write() ...@@ -1331,14 +1331,14 @@ bool Query_log_event::write()
bool Query_compressed_log_event::write() bool Query_compressed_log_event::write()
{ {
char *buffer; uchar *buffer;
uint32 alloc_size, compressed_size; uint32 alloc_size, compressed_size;
bool ret= true; bool ret= true;
compressed_size= alloc_size= binlog_get_compress_len(q_len); compressed_size= alloc_size= binlog_get_compress_len(q_len);
buffer= (char*) my_safe_alloca(alloc_size); buffer= (uchar*) my_safe_alloca(alloc_size);
if (buffer && if (buffer &&
!binlog_buf_compress(query, buffer, q_len, &compressed_size)) !binlog_buf_compress((uchar*) query, buffer, q_len, &compressed_size))
{ {
/* /*
Write the compressed event. We have to temporarily store the event Write the compressed event. We have to temporarily store the event
...@@ -1346,7 +1346,7 @@ bool Query_compressed_log_event::write() ...@@ -1346,7 +1346,7 @@ bool Query_compressed_log_event::write()
*/ */
const char *query_tmp= query; const char *query_tmp= query;
uint32 q_len_tmp= q_len; uint32 q_len_tmp= q_len;
query= buffer; query= (char*) buffer;
q_len= compressed_size; q_len= compressed_size;
ret= Query_log_event::write(); ret= Query_log_event::write();
query= query_tmp; query= query_tmp;
...@@ -2161,9 +2161,10 @@ Query_log_event::do_shall_skip(rpl_group_info *rgi) ...@@ -2161,9 +2161,10 @@ Query_log_event::do_shall_skip(rpl_group_info *rgi)
bool bool
Query_log_event::peek_is_commit_rollback(const char *event_start, Query_log_event::peek_is_commit_rollback(const uchar *event_start,
size_t event_len, size_t event_len,
enum enum_binlog_checksum_alg checksum_alg) enum enum_binlog_checksum_alg
checksum_alg)
{ {
if (checksum_alg == BINLOG_CHECKSUM_ALG_CRC32) if (checksum_alg == BINLOG_CHECKSUM_ALG_CRC32)
{ {
...@@ -3295,12 +3296,12 @@ Gtid_log_event::Gtid_log_event(THD *thd_arg, uint64 seq_no_arg, ...@@ -3295,12 +3296,12 @@ Gtid_log_event::Gtid_log_event(THD *thd_arg, uint64 seq_no_arg,
fully contruct every Gtid_log_event() needlessly. fully contruct every Gtid_log_event() needlessly.
*/ */
bool bool
Gtid_log_event::peek(const char *event_start, size_t event_len, Gtid_log_event::peek(const uchar *event_start, size_t event_len,
enum enum_binlog_checksum_alg checksum_alg, enum enum_binlog_checksum_alg checksum_alg,
uint32 *domain_id, uint32 *server_id, uint64 *seq_no, uint32 *domain_id, uint32 *server_id, uint64 *seq_no,
uchar *flags2, const Format_description_log_event *fdev) uchar *flags2, const Format_description_log_event *fdev)
{ {
const char *p; const uchar *p;
if (checksum_alg == BINLOG_CHECKSUM_ALG_CRC32) if (checksum_alg == BINLOG_CHECKSUM_ALG_CRC32)
{ {
...@@ -3321,7 +3322,7 @@ Gtid_log_event::peek(const char *event_start, size_t event_len, ...@@ -3321,7 +3322,7 @@ Gtid_log_event::peek(const char *event_start, size_t event_len,
p+= 8; p+= 8;
*domain_id= uint4korr(p); *domain_id= uint4korr(p);
p+= 4; p+= 4;
*flags2= (uchar)*p; *flags2= *p;
return false; return false;
} }
...@@ -6006,14 +6007,15 @@ bool Rows_log_event::write_data_body() ...@@ -6006,14 +6007,15 @@ bool Rows_log_event::write_data_body()
bool Rows_log_event::write_compressed() bool Rows_log_event::write_compressed()
{ {
uchar *m_rows_buf_tmp = m_rows_buf; uchar *m_rows_buf_tmp= m_rows_buf;
uchar *m_rows_cur_tmp = m_rows_cur; uchar *m_rows_cur_tmp= m_rows_cur;
bool ret = true; bool ret= true;
uint32 comlen, alloc_size; uint32 comlen, alloc_size;
comlen= alloc_size= binlog_get_compress_len((uint32)(m_rows_cur_tmp - m_rows_buf_tmp)); comlen= alloc_size= binlog_get_compress_len((uint32)(m_rows_cur_tmp -
m_rows_buf = (uchar *)my_safe_alloca(alloc_size); m_rows_buf_tmp));
m_rows_buf= (uchar*) my_safe_alloca(alloc_size);
if(m_rows_buf && if(m_rows_buf &&
!binlog_buf_compress((const char *)m_rows_buf_tmp, (char *)m_rows_buf, !binlog_buf_compress(m_rows_buf_tmp, m_rows_buf,
(uint32)(m_rows_cur_tmp - m_rows_buf_tmp), &comlen)) (uint32)(m_rows_cur_tmp - m_rows_buf_tmp), &comlen))
{ {
m_rows_cur= comlen + m_rows_buf; m_rows_cur= comlen + m_rows_buf;
...@@ -8447,9 +8449,8 @@ Log_event* wsrep_read_log_event( ...@@ -8447,9 +8449,8 @@ Log_event* wsrep_read_log_event(
char **arg_buf, size_t *arg_buf_len, char **arg_buf, size_t *arg_buf_len,
const Format_description_log_event *description_event) const Format_description_log_event *description_event)
{ {
char *head= (*arg_buf); uchar *head= (uchar*) (*arg_buf);
uint data_len = uint4korr(head + EVENT_LEN_OFFSET); uint data_len = uint4korr(head + EVENT_LEN_OFFSET);
char *buf= (*arg_buf);
const char *error= 0; const char *error= 0;
Log_event *res= 0; Log_event *res= 0;
DBUG_ENTER("wsrep_read_log_event"); DBUG_ENTER("wsrep_read_log_event");
...@@ -8460,15 +8461,16 @@ Log_event* wsrep_read_log_event( ...@@ -8460,15 +8461,16 @@ Log_event* wsrep_read_log_event(
goto err; goto err;
} }
res= Log_event::read_log_event(buf, data_len, &error, description_event, false); res= Log_event::read_log_event(head, data_len, &error, description_event,
false);
err: err:
if (!res) if (!res)
{ {
DBUG_ASSERT(error != 0); DBUG_ASSERT(error != 0);
sql_print_error("Error in Log_event::read_log_event(): " sql_print_error("Error in Log_event::read_log_event(): "
"'%s', data_len: %d, event_type: %d", "'%s', data_len: %u, event_type: %d",
error,data_len,(uchar)head[EVENT_TYPE_OFFSET]); error, data_len, (int) head[EVENT_TYPE_OFFSET]);
} }
(*arg_buf)+= data_len; (*arg_buf)+= data_len;
(*arg_buf_len)-= data_len; (*arg_buf_len)-= data_len;
...@@ -8478,8 +8480,7 @@ Log_event* wsrep_read_log_event( ...@@ -8478,8 +8480,7 @@ Log_event* wsrep_read_log_event(
#if defined(HAVE_REPLICATION) #if defined(HAVE_REPLICATION)
int int Incident_log_event::do_apply_event(rpl_group_info *rgi)
Incident_log_event::do_apply_event(rpl_group_info *rgi)
{ {
Relay_log_info const *rli= rgi->rli; Relay_log_info const *rli= rgi->rli;
DBUG_ENTER("Incident_log_event::do_apply_event"); DBUG_ENTER("Incident_log_event::do_apply_event");
...@@ -8532,7 +8533,7 @@ void Ignorable_log_event::pack_info(Protocol *protocol) ...@@ -8532,7 +8533,7 @@ void Ignorable_log_event::pack_info(Protocol *protocol)
#if defined(HAVE_REPLICATION) #if defined(HAVE_REPLICATION)
Heartbeat_log_event::Heartbeat_log_event(const char* buf, ulong event_len, Heartbeat_log_event::Heartbeat_log_event(const uchar *buf, uint event_len,
const Format_description_log_event* description_event) const Format_description_log_event* description_event)
:Log_event(buf, description_event) :Log_event(buf, description_event)
{ {
...@@ -8562,9 +8563,9 @@ Heartbeat_log_event::Heartbeat_log_event(const char* buf, ulong event_len, ...@@ -8562,9 +8563,9 @@ Heartbeat_log_event::Heartbeat_log_event(const char* buf, ulong event_len,
1 Don't write event 1 Don't write event
*/ */
bool event_that_should_be_ignored(const char *buf) bool event_that_should_be_ignored(const uchar *buf)
{ {
uint event_type= (uchar)buf[EVENT_TYPE_OFFSET]; uint event_type= buf[EVENT_TYPE_OFFSET];
if (event_type == GTID_LOG_EVENT || if (event_type == GTID_LOG_EVENT ||
event_type == ANONYMOUS_GTID_LOG_EVENT || event_type == ANONYMOUS_GTID_LOG_EVENT ||
event_type == PREVIOUS_GTIDS_LOG_EVENT || event_type == PREVIOUS_GTIDS_LOG_EVENT ||
......
...@@ -139,8 +139,8 @@ typedef struct st_rows_event_tracker ...@@ -139,8 +139,8 @@ typedef struct st_rows_event_tracker
my_off_t first_seen; my_off_t first_seen;
my_off_t last_seen; my_off_t last_seen;
bool stmt_end_seen; bool stmt_end_seen;
void update(const char* file_name, my_off_t pos, void update(const char *file_name, my_off_t pos,
const char* buf, const uchar *buf,
const Format_description_log_event *fdle); const Format_description_log_event *fdle);
void reset(); void reset();
bool check_and_report(const char* file_name, my_off_t pos); bool check_and_report(const char* file_name, my_off_t pos);
......
...@@ -288,8 +288,15 @@ table_def::~table_def() ...@@ -288,8 +288,15 @@ table_def::~table_def()
@return TRUE if test fails @return TRUE if test fails
FALSE as success FALSE as success
@notes
event_buf will have same values on return. However during the process of
caluclating the checksum, it's temporary changed. Because of this the
event_buf argument is not a pointer to const.
*/ */
bool event_checksum_test(uchar *event_buf, ulong event_len, enum enum_binlog_checksum_alg alg) bool event_checksum_test(uchar *event_buf, ulong event_len,
enum enum_binlog_checksum_alg alg)
{ {
bool res= FALSE; bool res= FALSE;
uint16 flags= 0; // to store in FD's buffer flags orig value uint16 flags= 0; // to store in FD's buffer flags orig value
......
...@@ -52,10 +52,10 @@ int Repl_semi_sync_slave::init_object() ...@@ -52,10 +52,10 @@ int Repl_semi_sync_slave::init_object()
return result; return result;
} }
int Repl_semi_sync_slave::slave_read_sync_header(const char *header, int Repl_semi_sync_slave::slave_read_sync_header(const uchar *header,
unsigned long total_len, unsigned long total_len,
int *semi_flags, int *semi_flags,
const char **payload, const uchar **payload,
unsigned long *payload_len) unsigned long *payload_len)
{ {
int read_res = 0; int read_res = 0;
...@@ -64,7 +64,7 @@ int Repl_semi_sync_slave::slave_read_sync_header(const char *header, ...@@ -64,7 +64,7 @@ int Repl_semi_sync_slave::slave_read_sync_header(const char *header,
if (rpl_semi_sync_slave_status) if (rpl_semi_sync_slave_status)
{ {
if (DBUG_EVALUATE_IF("semislave_corrupt_log", 0, 1) if (DBUG_EVALUATE_IF("semislave_corrupt_log", 0, 1)
&& (unsigned char)(header[0]) == k_packet_magic_num) && header[0] == k_packet_magic_num)
{ {
semi_sync_need_reply = (header[1] & k_packet_flag_sync); semi_sync_need_reply = (header[1] & k_packet_flag_sync);
*payload_len = total_len - 2; *payload_len = total_len - 2;
......
...@@ -78,9 +78,9 @@ class Repl_semi_sync_slave ...@@ -78,9 +78,9 @@ class Repl_semi_sync_slave
* Return: * Return:
* 0: success; non-zero: error * 0: success; non-zero: error
*/ */
int slave_read_sync_header(const char *header, unsigned long total_len, int slave_read_sync_header(const uchar *header, unsigned long total_len,
int *semi_flags, int *semi_flags,
const char **payload, unsigned long *payload_len); const uchar **payload, unsigned long *payload_len);
/* A slave replies to the master indicating its replication process. It /* A slave replies to the master indicating its replication process. It
* indicates that the slave has received all events before the specified * indicates that the slave has received all events before the specified
......
...@@ -171,7 +171,7 @@ static int safe_connect(THD* thd, MYSQL* mysql, Master_info* mi); ...@@ -171,7 +171,7 @@ static int safe_connect(THD* thd, MYSQL* mysql, Master_info* mi);
static int safe_reconnect(THD*, MYSQL*, Master_info*, bool); static int safe_reconnect(THD*, MYSQL*, Master_info*, bool);
static int connect_to_master(THD*, MYSQL*, Master_info*, bool, bool); static int connect_to_master(THD*, MYSQL*, Master_info*, bool, bool);
static Log_event* next_event(rpl_group_info* rgi, ulonglong *event_size); static Log_event* next_event(rpl_group_info* rgi, ulonglong *event_size);
static int queue_event(Master_info* mi,const char* buf,ulong event_len); static int queue_event(Master_info *mi,const uchar *buf, ulong event_len);
static int terminate_slave_thread(THD *, mysql_mutex_t *, mysql_cond_t *, static int terminate_slave_thread(THD *, mysql_mutex_t *, mysql_cond_t *,
volatile uint *, bool); volatile uint *, bool);
static bool check_io_slave_killed(Master_info *mi, const char *info); static bool check_io_slave_killed(Master_info *mi, const char *info);
...@@ -4794,6 +4794,8 @@ pthread_handler_t handle_slave_io(void *arg) ...@@ -4794,6 +4794,8 @@ pthread_handler_t handle_slave_io(void *arg)
thd->set_command(COM_SLAVE_IO); thd->set_command(COM_SLAVE_IO);
while (!io_slave_killed(mi)) while (!io_slave_killed(mi))
{ {
const uchar *event_buf;
THD_STAGE_INFO(thd, stage_requesting_binlog_dump); THD_STAGE_INFO(thd, stage_requesting_binlog_dump);
if (request_dump(thd, mysql, mi, &suppress_warnings)) if (request_dump(thd, mysql, mi, &suppress_warnings))
{ {
...@@ -4805,8 +4807,6 @@ pthread_handler_t handle_slave_io(void *arg) ...@@ -4805,8 +4807,6 @@ pthread_handler_t handle_slave_io(void *arg)
goto connected; goto connected;
} }
const char *event_buf;
mi->slave_running= MYSQL_SLAVE_RUN_READING; mi->slave_running= MYSQL_SLAVE_RUN_READING;
DBUG_ASSERT(mi->last_error().number == 0); DBUG_ASSERT(mi->last_error().number == 0);
ulonglong lastchecktime = my_hrtime().val; ulonglong lastchecktime = my_hrtime().val;
...@@ -4858,10 +4858,11 @@ Stopping slave I/O thread due to out-of-memory error from master"); ...@@ -4858,10 +4858,11 @@ Stopping slave I/O thread due to out-of-memory error from master");
retry_count=0; // ok event, reset retry counter retry_count=0; // ok event, reset retry counter
THD_STAGE_INFO(thd, stage_queueing_master_event_to_the_relay_log); THD_STAGE_INFO(thd, stage_queueing_master_event_to_the_relay_log);
event_buf= (const char*)mysql->net.read_pos + 1; event_buf= mysql->net.read_pos + 1;
mi->semi_ack= 0; mi->semi_ack= 0;
if (repl_semisync_slave. if (repl_semisync_slave.
slave_read_sync_header((const char*)mysql->net.read_pos + 1, event_len, slave_read_sync_header((const uchar*) mysql->net.read_pos + 1,
event_len,
&(mi->semi_ack), &event_buf, &event_len)) &(mi->semi_ack), &event_buf, &event_len))
{ {
mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, NULL, mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, NULL,
...@@ -5941,13 +5942,13 @@ static int process_io_rotate(Master_info *mi, Rotate_log_event *rev) ...@@ -5941,13 +5942,13 @@ static int process_io_rotate(Master_info *mi, Rotate_log_event *rev)
Reads a 3.23 event and converts it to the slave's format. This code was Reads a 3.23 event and converts it to the slave's format. This code was
copied from MySQL 4.0. copied from MySQL 4.0.
*/ */
static int queue_binlog_ver_1_event(Master_info *mi, const char *buf, static int queue_binlog_ver_1_event(Master_info *mi, const uchar *buf,
ulong event_len) ulong event_len)
{ {
const char *errmsg = 0; const char *errmsg = 0;
ulong inc_pos; ulong inc_pos;
bool ignore_event= 0; bool ignore_event= 0;
char *tmp_buf = 0; uchar *tmp_buf = 0;
Relay_log_info *rli= &mi->rli; Relay_log_info *rli= &mi->rli;
DBUG_ENTER("queue_binlog_ver_1_event"); DBUG_ENTER("queue_binlog_ver_1_event");
...@@ -5957,8 +5958,8 @@ static int queue_binlog_ver_1_event(Master_info *mi, const char *buf, ...@@ -5957,8 +5958,8 @@ static int queue_binlog_ver_1_event(Master_info *mi, const char *buf,
*/ */
if ((uchar)buf[EVENT_TYPE_OFFSET] == LOAD_EVENT) if ((uchar)buf[EVENT_TYPE_OFFSET] == LOAD_EVENT)
{ {
if (unlikely(!(tmp_buf=(char*)my_malloc(key_memory_binlog_ver_1_event, if (unlikely(!(tmp_buf= (uchar*) my_malloc(key_memory_binlog_ver_1_event,
event_len+1,MYF(MY_WME))))) event_len+1, MYF(MY_WME)))))
{ {
mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, NULL, mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, NULL,
ER(ER_SLAVE_FATAL_ERROR), "Memory allocation failed"); ER(ER_SLAVE_FATAL_ERROR), "Memory allocation failed");
...@@ -5974,7 +5975,7 @@ static int queue_binlog_ver_1_event(Master_info *mi, const char *buf, ...@@ -5974,7 +5975,7 @@ static int queue_binlog_ver_1_event(Master_info *mi, const char *buf,
*/ */
tmp_buf[event_len++]=0; tmp_buf[event_len++]=0;
int4store(tmp_buf+EVENT_LEN_OFFSET, event_len); int4store(tmp_buf+EVENT_LEN_OFFSET, event_len);
buf = (const char*)tmp_buf; buf= tmp_buf;
} }
/* /*
This will transform LOAD_EVENT into CREATE_FILE_EVENT, ask the master to This will transform LOAD_EVENT into CREATE_FILE_EVENT, ask the master to
...@@ -6061,7 +6062,7 @@ static int queue_binlog_ver_1_event(Master_info *mi, const char *buf, ...@@ -6061,7 +6062,7 @@ static int queue_binlog_ver_1_event(Master_info *mi, const char *buf,
Reads a 4.0 event and converts it to the slave's format. This code was copied Reads a 4.0 event and converts it to the slave's format. This code was copied
from queue_binlog_ver_1_event(), with some affordable simplifications. from queue_binlog_ver_1_event(), with some affordable simplifications.
*/ */
static int queue_binlog_ver_3_event(Master_info *mi, const char *buf, static int queue_binlog_ver_3_event(Master_info *mi, const uchar *buf,
ulong event_len) ulong event_len)
{ {
const char *errmsg = 0; const char *errmsg = 0;
...@@ -6072,7 +6073,7 @@ static int queue_binlog_ver_3_event(Master_info *mi, const char *buf, ...@@ -6072,7 +6073,7 @@ static int queue_binlog_ver_3_event(Master_info *mi, const char *buf,
/* read_log_event() will adjust log_pos to be end_log_pos */ /* read_log_event() will adjust log_pos to be end_log_pos */
Log_event *ev= Log_event *ev=
Log_event::read_log_event(buf,event_len, &errmsg, Log_event::read_log_event(buf, event_len, &errmsg,
mi->rli.relay_log.description_event_for_queue, 0); mi->rli.relay_log.description_event_for_queue, 0);
if (unlikely(!ev)) if (unlikely(!ev))
{ {
...@@ -6127,13 +6128,11 @@ static int queue_binlog_ver_3_event(Master_info *mi, const char *buf, ...@@ -6127,13 +6128,11 @@ static int queue_binlog_ver_3_event(Master_info *mi, const char *buf,
setup with 3.23 master or 4.0 master setup with 3.23 master or 4.0 master
*/ */
static int queue_old_event(Master_info *mi, const char *buf, static int queue_old_event(Master_info *mi, const uchar *buf, ulong event_len)
ulong event_len)
{ {
DBUG_ENTER("queue_old_event"); DBUG_ENTER("queue_old_event");
switch (mi->rli.relay_log.description_event_for_queue->binlog_version) switch (mi->rli.relay_log.description_event_for_queue->binlog_version) {
{
case 1: case 1:
DBUG_RETURN(queue_binlog_ver_1_event(mi,buf,event_len)); DBUG_RETURN(queue_binlog_ver_1_event(mi,buf,event_len));
case 3: case 3:
...@@ -6155,7 +6154,7 @@ static int queue_old_event(Master_info *mi, const char *buf, ...@@ -6155,7 +6154,7 @@ static int queue_old_event(Master_info *mi, const char *buf,
any >=5.0.0 format. any >=5.0.0 format.
*/ */
static int queue_event(Master_info* mi,const char* buf, ulong event_len) static int queue_event(Master_info* mi, const uchar *buf, ulong event_len)
{ {
int error= 0; int error= 0;
StringBuffer<1024> error_msg; StringBuffer<1024> error_msg;
...@@ -6170,8 +6169,8 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) ...@@ -6170,8 +6169,8 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
rpl_gtid event_gtid; rpl_gtid event_gtid;
static uint dbug_rows_event_count __attribute__((unused))= 0; static uint dbug_rows_event_count __attribute__((unused))= 0;
bool is_compress_event = false; bool is_compress_event = false;
char* new_buf = NULL; uchar *new_buf = NULL;
char new_buf_arr[4096]; uchar new_buf_arr[4096];
bool is_malloc = false; bool is_malloc = false;
bool is_rows_event= false; bool is_rows_event= false;
/* /*
...@@ -6184,8 +6183,8 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) ...@@ -6184,8 +6183,8 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
mi->checksum_alg_before_fd != BINLOG_CHECKSUM_ALG_UNDEF ? mi->checksum_alg_before_fd != BINLOG_CHECKSUM_ALG_UNDEF ?
mi->checksum_alg_before_fd : mi->rli.relay_log.relay_log_checksum_alg; mi->checksum_alg_before_fd : mi->rli.relay_log.relay_log_checksum_alg;
char *save_buf= NULL; // needed for checksumming the fake Rotate event const uchar *save_buf= NULL; // needed for checksumming the fake Rotate event
char rot_buf[LOG_EVENT_HEADER_LEN + ROTATE_HEADER_LEN + FN_REFLEN]; uchar rot_buf[LOG_EVENT_HEADER_LEN + ROTATE_HEADER_LEN + FN_REFLEN];
DBUG_ASSERT(checksum_alg == BINLOG_CHECKSUM_ALG_OFF || DBUG_ASSERT(checksum_alg == BINLOG_CHECKSUM_ALG_OFF ||
checksum_alg == BINLOG_CHECKSUM_ALG_UNDEF || checksum_alg == BINLOG_CHECKSUM_ALG_UNDEF ||
...@@ -6219,9 +6218,9 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) ...@@ -6219,9 +6218,9 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
// Emulate the network corruption // Emulate the network corruption
DBUG_EXECUTE_IF("corrupt_queue_event", DBUG_EXECUTE_IF("corrupt_queue_event",
if ((uchar)buf[EVENT_TYPE_OFFSET] != FORMAT_DESCRIPTION_EVENT) if (buf[EVENT_TYPE_OFFSET] != FORMAT_DESCRIPTION_EVENT)
{ {
char *debug_event_buf_c = (char*) buf; uchar *debug_event_buf_c= const_cast<uchar*>(buf);
int debug_cor_pos = rand() % (event_len - BINLOG_CHECKSUM_LEN); int debug_cor_pos = rand() % (event_len - BINLOG_CHECKSUM_LEN);
debug_event_buf_c[debug_cor_pos] =~ debug_event_buf_c[debug_cor_pos]; debug_event_buf_c[debug_cor_pos] =~ debug_event_buf_c[debug_cor_pos];
DBUG_PRINT("info", ("Corrupt the event at queue_event: byte on position %d", debug_cor_pos)); DBUG_PRINT("info", ("Corrupt the event at queue_event: byte on position %d", debug_cor_pos));
...@@ -6229,7 +6228,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) ...@@ -6229,7 +6228,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
} }
); );
if (event_checksum_test((uchar *) buf, event_len, checksum_alg)) if (event_checksum_test((uchar*) buf, event_len, checksum_alg))
{ {
error= ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE; error= ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE;
unlock_data_lock= FALSE; unlock_data_lock= FALSE;
...@@ -6237,7 +6236,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) ...@@ -6237,7 +6236,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
} }
if (mi->rli.relay_log.description_event_for_queue->binlog_version<4 && if (mi->rli.relay_log.description_event_for_queue->binlog_version<4 &&
(uchar)buf[EVENT_TYPE_OFFSET] != FORMAT_DESCRIPTION_EVENT /* a way to escape */) buf[EVENT_TYPE_OFFSET] != FORMAT_DESCRIPTION_EVENT /* a way to escape */)
DBUG_RETURN(queue_old_event(mi,buf,event_len)); DBUG_RETURN(queue_old_event(mi,buf,event_len));
#ifdef ENABLED_DEBUG_SYNC #ifdef ENABLED_DEBUG_SYNC
...@@ -6263,7 +6262,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) ...@@ -6263,7 +6262,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
#endif #endif
mysql_mutex_lock(&mi->data_lock); mysql_mutex_lock(&mi->data_lock);
switch ((uchar)buf[EVENT_TYPE_OFFSET]) { switch (buf[EVENT_TYPE_OFFSET]) {
case STOP_EVENT: case STOP_EVENT:
/* /*
We needn't write this event to the relay log. Indeed, it just indicates a We needn't write this event to the relay log. Indeed, it just indicates a
...@@ -6398,7 +6397,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) ...@@ -6398,7 +6397,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
mi->rli.relay_log.relay_log_checksum_alg); mi->rli.relay_log.relay_log_checksum_alg);
/* the first one */ /* the first one */
DBUG_ASSERT(mi->checksum_alg_before_fd != BINLOG_CHECKSUM_ALG_UNDEF); DBUG_ASSERT(mi->checksum_alg_before_fd != BINLOG_CHECKSUM_ALG_UNDEF);
save_buf= (char *) buf; save_buf= buf;
buf= rot_buf; buf= rot_buf;
} }
else else
...@@ -6418,7 +6417,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) ...@@ -6418,7 +6417,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
mi->rli.relay_log.relay_log_checksum_alg); mi->rli.relay_log.relay_log_checksum_alg);
/* the first one */ /* the first one */
DBUG_ASSERT(mi->checksum_alg_before_fd != BINLOG_CHECKSUM_ALG_UNDEF); DBUG_ASSERT(mi->checksum_alg_before_fd != BINLOG_CHECKSUM_ALG_UNDEF);
save_buf= (char *) buf; save_buf= buf;
buf= rot_buf; buf= rot_buf;
} }
/* /*
...@@ -6503,7 +6502,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) ...@@ -6503,7 +6502,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
error= ER_SLAVE_HEARTBEAT_FAILURE; error= ER_SLAVE_HEARTBEAT_FAILURE;
error_msg.append(STRING_WITH_LEN("inconsistent heartbeat event content;")); error_msg.append(STRING_WITH_LEN("inconsistent heartbeat event content;"));
error_msg.append(STRING_WITH_LEN("the event's data: log_file_name ")); error_msg.append(STRING_WITH_LEN("the event's data: log_file_name "));
error_msg.append(hb.get_log_ident(), (uint) hb.get_ident_len()); error_msg.append((char*) hb.get_log_ident(), (uint) hb.get_ident_len());
error_msg.append(STRING_WITH_LEN(" log_pos ")); error_msg.append(STRING_WITH_LEN(" log_pos "));
error_msg.append_ulonglong(hb.log_pos); error_msg.append_ulonglong(hb.log_pos);
goto err; goto err;
...@@ -6529,7 +6528,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) ...@@ -6529,7 +6528,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
error= ER_SLAVE_HEARTBEAT_FAILURE; error= ER_SLAVE_HEARTBEAT_FAILURE;
error_msg.append(STRING_WITH_LEN("heartbeat is not compatible with local info;")); error_msg.append(STRING_WITH_LEN("heartbeat is not compatible with local info;"));
error_msg.append(STRING_WITH_LEN("the event's data: log_file_name ")); error_msg.append(STRING_WITH_LEN("the event's data: log_file_name "));
error_msg.append(hb.get_log_ident(), (uint) hb.get_ident_len()); error_msg.append((char*) hb.get_log_ident(), (uint) hb.get_ident_len());
error_msg.append(STRING_WITH_LEN(" log_pos ")); error_msg.append(STRING_WITH_LEN(" log_pos "));
error_msg.append_ulonglong(hb.log_pos); error_msg.append_ulonglong(hb.log_pos);
goto err; goto err;
...@@ -6712,7 +6711,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) ...@@ -6712,7 +6711,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
if (query_event_uncompress(rli->relay_log.description_event_for_queue, if (query_event_uncompress(rli->relay_log.description_event_for_queue,
checksum_alg == BINLOG_CHECKSUM_ALG_CRC32, checksum_alg == BINLOG_CHECKSUM_ALG_CRC32,
buf, event_len, new_buf_arr, sizeof(new_buf_arr), buf, event_len, new_buf_arr, sizeof(new_buf_arr),
&is_malloc, (char **)&new_buf, &event_len)) &is_malloc, &new_buf, &event_len))
{ {
char llbuf[22]; char llbuf[22];
error = ER_BINLOG_UNCOMPRESS_ERROR; error = ER_BINLOG_UNCOMPRESS_ERROR;
...@@ -6735,8 +6734,9 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) ...@@ -6735,8 +6734,9 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
{ {
if (row_log_event_uncompress(rli->relay_log.description_event_for_queue, if (row_log_event_uncompress(rli->relay_log.description_event_for_queue,
checksum_alg == BINLOG_CHECKSUM_ALG_CRC32, checksum_alg == BINLOG_CHECKSUM_ALG_CRC32,
buf, event_len, new_buf_arr, sizeof(new_buf_arr), buf, event_len, new_buf_arr,
&is_malloc, (char **)&new_buf, &event_len)) sizeof(new_buf_arr),
&is_malloc, &new_buf, &event_len))
{ {
char llbuf[22]; char llbuf[22];
error = ER_BINLOG_UNCOMPRESS_ERROR; error = ER_BINLOG_UNCOMPRESS_ERROR;
...@@ -6817,7 +6817,8 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) ...@@ -6817,7 +6817,8 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
{ {
if ((uchar)buf[EVENT_TYPE_OFFSET] == XID_EVENT || if ((uchar)buf[EVENT_TYPE_OFFSET] == XID_EVENT ||
((uchar)buf[EVENT_TYPE_OFFSET] == QUERY_EVENT && /* QUERY_COMPRESSED_EVENT would never be commmit or rollback */ ((uchar)buf[EVENT_TYPE_OFFSET] == QUERY_EVENT && /* QUERY_COMPRESSED_EVENT would never be commmit or rollback */
Query_log_event::peek_is_commit_rollback(buf, event_len, Query_log_event::peek_is_commit_rollback(buf,
event_len,
checksum_alg))) checksum_alg)))
{ {
error= ER_SLAVE_RELAY_LOG_WRITE_FAILURE; error= ER_SLAVE_RELAY_LOG_WRITE_FAILURE;
...@@ -8073,14 +8074,14 @@ bool rpl_master_erroneous_autoinc(THD *thd) ...@@ -8073,14 +8074,14 @@ bool rpl_master_erroneous_autoinc(THD *thd)
} }
static bool get_row_event_stmt_end(const char* buf, static bool get_row_event_stmt_end(const uchar *buf,
const Format_description_log_event *fdle) const Format_description_log_event *fdle)
{ {
uint8 const common_header_len= fdle->common_header_len; uint8 const common_header_len= fdle->common_header_len;
Log_event_type event_type= (Log_event_type)(uchar)buf[EVENT_TYPE_OFFSET]; Log_event_type event_type= (Log_event_type)(uchar)buf[EVENT_TYPE_OFFSET];
uint8 const post_header_len= fdle->post_header_len[event_type-1]; uint8 const post_header_len= fdle->post_header_len[event_type-1];
const char *flag_start= buf + common_header_len; const uchar *flag_start= buf + common_header_len;
/* /*
The term 4 below signifies that master is of 'an intermediate source', see The term 4 below signifies that master is of 'an intermediate source', see
Rows_log_event::Rows_log_event. Rows_log_event::Rows_log_event.
...@@ -8110,8 +8111,8 @@ void Rows_event_tracker::reset() ...@@ -8110,8 +8111,8 @@ void Rows_event_tracker::reset()
well as the end-of-statement status of the last one. well as the end-of-statement status of the last one.
*/ */
void Rows_event_tracker::update(const char* file_name, my_off_t pos, void Rows_event_tracker::update(const char *file_name, my_off_t pos,
const char* buf, const uchar *buf,
const Format_description_log_event *fdle) const Format_description_log_event *fdle)
{ {
DBUG_ENTER("Rows_event_tracker::update"); DBUG_ENTER("Rows_event_tracker::update");
......
...@@ -207,7 +207,7 @@ void mysql_client_binlog_statement(THD* thd) ...@@ -207,7 +207,7 @@ void mysql_client_binlog_statement(THD* thd)
int err; int err;
Relay_log_info *rli; Relay_log_info *rli;
rpl_group_info *rgi; rpl_group_info *rgi;
char *buf= NULL; uchar *buf= NULL;
size_t coded_len= 0, decoded_len= 0; size_t coded_len= 0, decoded_len= 0;
rli= thd->rli_fake; rli= thd->rli_fake;
...@@ -243,7 +243,7 @@ void mysql_client_binlog_statement(THD* thd) ...@@ -243,7 +243,7 @@ void mysql_client_binlog_statement(THD* thd)
} }
decoded_len= my_base64_needed_decoded_length((int)coded_len); decoded_len= my_base64_needed_decoded_length((int)coded_len);
if (!(buf= (char *) my_malloc(key_memory_binlog_statement_buffer, if (!(buf= (uchar *) my_malloc(key_memory_binlog_statement_buffer,
decoded_len, MYF(MY_WME)))) decoded_len, MYF(MY_WME))))
{ {
my_error(ER_OUTOFMEMORY, MYF(ME_FATAL), 1); my_error(ER_OUTOFMEMORY, MYF(ME_FATAL), 1);
...@@ -299,7 +299,7 @@ void mysql_client_binlog_statement(THD* thd) ...@@ -299,7 +299,7 @@ void mysql_client_binlog_statement(THD* thd)
Now we start to read events of the buffer, until there are no Now we start to read events of the buffer, until there are no
more. more.
*/ */
for (char *bufptr= buf ; bytes_decoded > 0 ; ) for (uchar *bufptr= buf ; bytes_decoded > 0 ; )
{ {
/* /*
Checking that the first event in the buffer is not truncated. Checking that the first event in the buffer is not truncated.
......
...@@ -1519,9 +1519,10 @@ gtid_state_from_pos(const char *name, uint32 offset, ...@@ -1519,9 +1519,10 @@ gtid_state_from_pos(const char *name, uint32 offset,
goto end; goto end;
} }
current_checksum_alg= get_checksum_alg(packet.ptr(), packet.length()); current_checksum_alg= get_checksum_alg((uchar*) packet.ptr(),
packet.length());
found_format_description_event= true; found_format_description_event= true;
if (unlikely(!(tmp= new Format_description_log_event(packet.ptr(), if (unlikely(!(tmp= new Format_description_log_event((uchar*) packet.ptr(),
packet.length(), packet.length(),
fdev)))) fdev))))
{ {
...@@ -1539,7 +1540,7 @@ gtid_state_from_pos(const char *name, uint32 offset, ...@@ -1539,7 +1540,7 @@ gtid_state_from_pos(const char *name, uint32 offset,
{ {
sele_len -= BINLOG_CHECKSUM_LEN; sele_len -= BINLOG_CHECKSUM_LEN;
} }
Start_encryption_log_event sele(packet.ptr(), sele_len, fdev); Start_encryption_log_event sele((uchar*) packet.ptr(), sele_len, fdev);
if (fdev->start_decryption(&sele)) if (fdev->start_decryption(&sele))
{ {
errormsg= "Could not start decryption of binlog."; errormsg= "Could not start decryption of binlog.";
...@@ -1596,7 +1597,7 @@ gtid_state_from_pos(const char *name, uint32 offset, ...@@ -1596,7 +1597,7 @@ gtid_state_from_pos(const char *name, uint32 offset,
{ {
rpl_gtid gtid; rpl_gtid gtid;
uchar flags2; uchar flags2;
if (unlikely(Gtid_log_event::peek(packet.ptr(), packet.length(), if (unlikely(Gtid_log_event::peek((uchar*) packet.ptr(), packet.length(),
current_checksum_alg, &gtid.domain_id, current_checksum_alg, &gtid.domain_id,
&gtid.server_id, &gtid.seq_no, &flags2, &gtid.server_id, &gtid.seq_no, &flags2,
fdev))) fdev)))
...@@ -1682,8 +1683,8 @@ is_until_reached(binlog_send_info *info, ulong *ev_offset, ...@@ -1682,8 +1683,8 @@ is_until_reached(binlog_send_info *info, ulong *ev_offset,
if (event_type != XID_EVENT && event_type != XA_PREPARE_LOG_EVENT && if (event_type != XID_EVENT && event_type != XA_PREPARE_LOG_EVENT &&
(event_type != QUERY_EVENT || /* QUERY_COMPRESSED_EVENT would never be commmit or rollback */ (event_type != QUERY_EVENT || /* QUERY_COMPRESSED_EVENT would never be commmit or rollback */
!Query_log_event::peek_is_commit_rollback !Query_log_event::peek_is_commit_rollback
(info->packet->ptr()+*ev_offset, ((uchar*) info->packet->ptr() + *ev_offset,
info->packet->length()-*ev_offset, info->packet->length() - *ev_offset,
info->current_checksum_alg))) info->current_checksum_alg)))
return false; return false;
break; break;
...@@ -1762,7 +1763,7 @@ send_event_to_slave(binlog_send_info *info, Log_event_type event_type, ...@@ -1762,7 +1763,7 @@ send_event_to_slave(binlog_send_info *info, Log_event_type event_type,
rpl_gtid event_gtid; rpl_gtid event_gtid;
if (ev_offset > len || if (ev_offset > len ||
Gtid_log_event::peek(packet->ptr()+ev_offset, len - ev_offset, Gtid_log_event::peek((uchar*) packet->ptr()+ev_offset, len - ev_offset,
current_checksum_alg, current_checksum_alg,
&event_gtid.domain_id, &event_gtid.server_id, &event_gtid.domain_id, &event_gtid.server_id,
&event_gtid.seq_no, &flags2, info->fdev)) &event_gtid.seq_no, &flags2, info->fdev))
...@@ -1916,7 +1917,8 @@ send_event_to_slave(binlog_send_info *info, Log_event_type event_type, ...@@ -1916,7 +1917,8 @@ send_event_to_slave(binlog_send_info *info, Log_event_type event_type,
case GTID_SKIP_TRANSACTION: case GTID_SKIP_TRANSACTION:
if (event_type == XID_EVENT || event_type == XA_PREPARE_LOG_EVENT || if (event_type == XID_EVENT || event_type == XA_PREPARE_LOG_EVENT ||
(event_type == QUERY_EVENT && /* QUERY_COMPRESSED_EVENT would never be commmit or rollback */ (event_type == QUERY_EVENT && /* QUERY_COMPRESSED_EVENT would never be commmit or rollback */
Query_log_event::peek_is_commit_rollback(packet->ptr() + ev_offset, Query_log_event::peek_is_commit_rollback((uchar*) packet->ptr() +
ev_offset,
len - ev_offset, len - ev_offset,
current_checksum_alg))) current_checksum_alg)))
info->gtid_skip_group= GTID_SKIP_NOT; info->gtid_skip_group= GTID_SKIP_NOT;
...@@ -2320,7 +2322,8 @@ static int send_format_descriptor_event(binlog_send_info *info, IO_CACHE *log, ...@@ -2320,7 +2322,8 @@ static int send_format_descriptor_event(binlog_send_info *info, IO_CACHE *log,
DBUG_RETURN(1); DBUG_RETURN(1);
} }
info->current_checksum_alg= get_checksum_alg(packet->ptr() + ev_offset, info->current_checksum_alg= get_checksum_alg((uchar*) packet->ptr() +
ev_offset,
packet->length() - ev_offset); packet->length() - ev_offset);
DBUG_ASSERT(info->current_checksum_alg == BINLOG_CHECKSUM_ALG_OFF || DBUG_ASSERT(info->current_checksum_alg == BINLOG_CHECKSUM_ALG_OFF ||
...@@ -2345,7 +2348,7 @@ static int send_format_descriptor_event(binlog_send_info *info, IO_CACHE *log, ...@@ -2345,7 +2348,7 @@ static int send_format_descriptor_event(binlog_send_info *info, IO_CACHE *log,
ev_len-= BINLOG_CHECKSUM_LEN; ev_len-= BINLOG_CHECKSUM_LEN;
Format_description_log_event *tmp; Format_description_log_event *tmp;
if (!(tmp= new Format_description_log_event(packet->ptr() + ev_offset, if (!(tmp= new Format_description_log_event((uchar*) packet->ptr() + ev_offset,
ev_len, info->fdev))) ev_len, info->fdev)))
{ {
info->error= ER_MASTER_FATAL_ERROR_READING_BINLOG; info->error= ER_MASTER_FATAL_ERROR_READING_BINLOG;
...@@ -2437,7 +2440,8 @@ static int send_format_descriptor_event(binlog_send_info *info, IO_CACHE *log, ...@@ -2437,7 +2440,8 @@ static int send_format_descriptor_event(binlog_send_info *info, IO_CACHE *log,
if (event_type == START_ENCRYPTION_EVENT) if (event_type == START_ENCRYPTION_EVENT)
{ {
Start_encryption_log_event *sele= (Start_encryption_log_event *) Start_encryption_log_event *sele= (Start_encryption_log_event *)
Log_event::read_log_event(packet->ptr() + ev_offset, packet->length() Log_event::read_log_event((uchar*) packet->ptr() + ev_offset,
packet->length()
- ev_offset, &info->errmsg, info->fdev, - ev_offset, &info->errmsg, info->fdev,
BINLOG_CHECKSUM_ALG_OFF); BINLOG_CHECKSUM_ALG_OFF);
if (!sele) if (!sele)
......
...@@ -39,7 +39,7 @@ static Log_event* wsrep_read_log_event( ...@@ -39,7 +39,7 @@ static Log_event* wsrep_read_log_event(
char *head= (*arg_buf); char *head= (*arg_buf);
uint data_len= uint4korr(head + EVENT_LEN_OFFSET); uint data_len= uint4korr(head + EVENT_LEN_OFFSET);
char *buf= (*arg_buf); uchar *buf= (uchar*) (*arg_buf);
const char *error= 0; const char *error= 0;
Log_event *res= 0; Log_event *res= 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment