mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge 10.3 into 10.4
This commit is contained in:
@ -3982,6 +3982,7 @@ bool mysql_show_binlog_events(THD* thd)
|
||||
{
|
||||
Protocol *protocol= thd->protocol;
|
||||
List<Item> field_list;
|
||||
char errmsg_buf[MYSYS_ERRMSG_SIZE];
|
||||
const char *errmsg = 0;
|
||||
bool ret = TRUE;
|
||||
/*
|
||||
@ -3996,6 +3997,9 @@ bool mysql_show_binlog_events(THD* thd)
|
||||
Master_info *mi= 0;
|
||||
LOG_INFO linfo;
|
||||
LEX_MASTER_INFO *lex_mi= &thd->lex->mi;
|
||||
enum enum_binlog_checksum_alg checksum_alg;
|
||||
my_off_t binlog_size;
|
||||
MY_STAT s;
|
||||
|
||||
DBUG_ENTER("mysql_show_binlog_events");
|
||||
|
||||
@ -4044,10 +4048,6 @@ bool mysql_show_binlog_events(THD* thd)
|
||||
mi= 0;
|
||||
}
|
||||
|
||||
/* Validate user given position using checksum */
|
||||
if (lex_mi->pos == pos && !opt_master_verify_checksum)
|
||||
verify_checksum_once= true;
|
||||
|
||||
unit->set_limit(thd->lex->current_select);
|
||||
limit_start= unit->offset_limit_cnt;
|
||||
limit_end= unit->select_limit_cnt;
|
||||
@ -4071,6 +4071,17 @@ bool mysql_show_binlog_events(THD* thd)
|
||||
if ((file=open_binlog(&log, linfo.log_file_name, &errmsg)) < 0)
|
||||
goto err;
|
||||
|
||||
my_stat(linfo.log_file_name, &s, MYF(0));
|
||||
binlog_size= s.st_size;
|
||||
if (lex_mi->pos > binlog_size)
|
||||
{
|
||||
sprintf(errmsg_buf, "Invalid pos specified. Requested from pos:%llu is "
|
||||
"greater than actual file size:%lu\n", lex_mi->pos,
|
||||
(ulong)s.st_size);
|
||||
errmsg= errmsg_buf;
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
to account binlog event header size
|
||||
*/
|
||||
@ -4122,7 +4133,43 @@ bool mysql_show_binlog_events(THD* thd)
|
||||
}
|
||||
}
|
||||
|
||||
my_b_seek(&log, pos);
|
||||
if (lex_mi->pos > BIN_LOG_HEADER_SIZE)
|
||||
{
|
||||
checksum_alg= description_event->checksum_alg;
|
||||
/* Validate user given position using checksum */
|
||||
if (checksum_alg != BINLOG_CHECKSUM_ALG_OFF &&
|
||||
checksum_alg != BINLOG_CHECKSUM_ALG_UNDEF)
|
||||
{
|
||||
if (!opt_master_verify_checksum)
|
||||
verify_checksum_once= true;
|
||||
my_b_seek(&log, pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
my_off_t cur_pos= my_b_tell(&log);
|
||||
ulong next_event_len= 0;
|
||||
uchar buff[IO_SIZE];
|
||||
while (cur_pos < pos)
|
||||
{
|
||||
my_b_seek(&log, cur_pos + EVENT_LEN_OFFSET);
|
||||
if (my_b_read(&log, (uchar *)buff, sizeof(next_event_len)))
|
||||
{
|
||||
mysql_mutex_unlock(log_lock);
|
||||
errmsg = "Could not read event_length";
|
||||
goto err;
|
||||
}
|
||||
next_event_len= uint4korr(buff);
|
||||
cur_pos= cur_pos + next_event_len;
|
||||
}
|
||||
if (cur_pos > pos)
|
||||
{
|
||||
mysql_mutex_unlock(log_lock);
|
||||
errmsg= "Invalid input pos specified please provide valid one.";
|
||||
goto err;
|
||||
}
|
||||
my_b_seek(&log, cur_pos);
|
||||
}
|
||||
}
|
||||
|
||||
for (event_count = 0;
|
||||
(ev = Log_event::read_log_event(&log,
|
||||
|
Reference in New Issue
Block a user