summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2020-09-22 21:12:48 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2020-09-22 21:12:48 +0300
commitd9d9c30b707d7634503c8d3bce7dab7f7ec3fd34 (patch)
treedd112cca32b4cbc18980788ad591a61b41add71e /sql
parentfde3d895d9dca494be9fa077835fb2f606a5f3d0 (diff)
parent9d0ee2dcb72c011b4ee73c578cc32b666297ca31 (diff)
downloadmariadb-git-d9d9c30b707d7634503c8d3bce7dab7f7ec3fd34.tar.gz
Merge 10.2 into 10.3
Diffstat (limited to 'sql')
-rw-r--r--sql/item.cc2
-rw-r--r--sql/item_strfunc.h10
-rw-r--r--sql/sql_repl.cc57
3 files changed, 61 insertions, 8 deletions
diff --git a/sql/item.cc b/sql/item.cc
index ff1a0cbd917..4c7e1ab7384 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -2743,8 +2743,6 @@ bool Type_std_attributes::agg_item_set_converter(const DTCollation &coll,
Item* conv= (*arg)->safe_charset_converter(thd, coll.collation);
if (conv == *arg)
continue;
- if (!conv && ((*arg)->collation.repertoire == MY_REPERTOIRE_ASCII))
- conv= new (thd->mem_root) Item_func_conv_charset(thd, *arg, coll.collation, 1);
if (!conv)
{
diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h
index a279dd8598f..c0505773ba8 100644
--- a/sql/item_strfunc.h
+++ b/sql/item_strfunc.h
@@ -1441,11 +1441,19 @@ public:
/*
Conversion from and to "binary" is safe.
Conversion to Unicode is safe.
+ Conversion from an expression with the ASCII repertoire
+ to any character set that can store characters U+0000..U+007F
+ is safe:
+ - All supported multibyte character sets can store U+0000..U+007F
+ - All supported 7bit character sets can store U+0000..U+007F
+ except those marked with MY_CS_NONASCII (e.g. swe7).
Other kind of conversions are potentially lossy.
*/
safe= (args[0]->collation.collation == &my_charset_bin ||
cs == &my_charset_bin ||
- (cs->state & MY_CS_UNICODE));
+ (cs->state & MY_CS_UNICODE) ||
+ (args[0]->collation.repertoire == MY_REPERTOIRE_ASCII &&
+ (cs->mbmaxlen > 1 || !(cs->state & MY_CS_NONASCII))));
}
}
bool is_json_type() { return args[0]->is_json_type(); }
diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc
index 4b23348b306..4c3abc3c5a8 100644
--- a/sql/sql_repl.cc
+++ b/sql/sql_repl.cc
@@ -3906,6 +3906,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;
/*
@@ -3920,6 +3921,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");
@@ -3968,10 +3972,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;
@@ -3995,6 +3995,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
*/
@@ -4046,7 +4057,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,