[Commits] dcdf0b4: MDEV-8734 mysqlbinlog --start-position isn't bigint

sanja at mariadb.com sanja at mariadb.com
Mon Nov 16 16:41:12 EET 2015


revision-id: dcdf0b49f3362ac4da9ff6e8de88432b021d7105 (mariadb-10.1.8-54-gdcdf0b4)
parent(s): 0dfa0eef596ee677b55976793d632dc9b36928c7
committer: Oleksandr Byelkin
timestamp: 2015-11-16 15:41:09 +0100
message:

MDEV-8734 mysqlbinlog --start-position isn't bigint

fix it only for local operations.

---
 client/mysqlbinlog.cc | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc
index 587e538..b3334ec 100644
--- a/client/mysqlbinlog.cc
+++ b/client/mysqlbinlog.cc
@@ -1405,8 +1405,11 @@ static struct my_option my_options[] =
    "passed on the command line.",
    &start_position, &start_position, 0, GET_ULL,
    REQUIRED_ARG, BIN_LOG_HEADER_SIZE, BIN_LOG_HEADER_SIZE,
-   /* COM_BINLOG_DUMP accepts only 4 bytes for the position */
-   (ulonglong)(~(uint32)0), 0, 0, 0},
+   /*
+     COM_BINLOG_DUMP accepts only 4 bytes for the position
+     so remote log reading has lower limit.
+   */
+   (ulonglong)(0xffffffffffffffffULL), 0, 0, 0},
   {"stop-datetime", OPT_STOP_DATETIME,
    "Stop reading the binlog at first event having a datetime equal or "
    "posterior to the argument; the argument must be a date and time "
@@ -1721,6 +1724,15 @@ static int parse_args(int *argc, char*** argv)
     my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO;
   if (debug_check_flag)
     my_end_arg= MY_CHECK_ERROR;
+  if (start_position > UINT_MAX32 && remote_opt)
+  {
+    /* Here we just emulate old behaviour of option limit handling */
+    fprintf(stderr, "Warning: option 'start-position': unsigned value %llu "
+            "adjusted to 4294967295 (as maximum supported for remote "
+            "operation)",
+            start_position);
+    start_position= UINT_MAX32;
+  }
   return 0;
 }
 
@@ -1953,6 +1965,7 @@ static Exit_status dump_remote_log_entries(PRINT_EVENT_INFO *print_event_info,
     COM_BINLOG_DUMP accepts only 4 bytes for the position, so we are forced to
     cast to uint32.
   */
+  DBUG_ASSERT(start_position <= UINT_MAX32);
   int4store(buf, (uint32)start_position);
   if (!opt_skip_annotate_row_events)
     binlog_flags|= BINLOG_SEND_ANNOTATE_ROWS_EVENT;


More information about the commits mailing list