diff --git a/mysql-test/r/mysqlbinlog2.result b/mysql-test/r/mysqlbinlog2.result index ef6e4ee80fd..bb73ebde777 100644 --- a/mysql-test/r/mysqlbinlog2.result +++ b/mysql-test/r/mysqlbinlog2.result @@ -18,7 +18,11 @@ insert into t1 values(null, "f"); /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; +# at {pos} +#{yymmdd} {HH:MM:SS} server id 1 end_log_pos {pos} Start: binlog v 4, server v 5.1.18-beta-debug-log created {yymmdd} {HH:MM:SS} at startup ROLLBACK/*!*/; +# at {pos} +#{yymmdd} {HH:MM:SS} server id 1 end_log_pos {pos} Query thread_id={integer} exec_time={integer} error_code=0 use test/*!*/; SET TIMESTAMP=1579609942/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1/*!*/; @@ -26,21 +30,43 @@ SET @@session.sql_mode=0/*!*/; /*!\C latin1 *//*!*/; SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/; create table t1 (a int auto_increment not null primary key, b char(3))/*!*/; +# at {pos} +#{yymmdd} {HH:MM:SS} server id 1 end_log_pos {pos} Intvar SET INSERT_ID=1/*!*/; +# at {pos} +#{yymmdd} {HH:MM:SS} server id 1 end_log_pos {pos} Query thread_id={integer} exec_time={integer} error_code=0 SET TIMESTAMP=1579609942/*!*/; insert into t1 values(null, "a")/*!*/; +# at {pos} +#{yymmdd} {HH:MM:SS} server id 1 end_log_pos {pos} Intvar SET INSERT_ID=2/*!*/; +# at {pos} +#{yymmdd} {HH:MM:SS} server id 1 end_log_pos {pos} Query thread_id={integer} exec_time={integer} error_code=0 SET TIMESTAMP=1579609942/*!*/; insert into t1 values(null, "b")/*!*/; +# at {pos} +#{yymmdd} {HH:MM:SS} server id 1 end_log_pos {pos} Intvar SET INSERT_ID=3/*!*/; +# at {pos} +#{yymmdd} {HH:MM:SS} server id 1 end_log_pos {pos} Query thread_id={integer} exec_time={integer} error_code=0 SET TIMESTAMP=1579609944/*!*/; insert into t1 values(null, "c")/*!*/; +# at {pos} +#{yymmdd} {HH:MM:SS} server id 1 end_log_pos {pos} Intvar SET INSERT_ID=4/*!*/; +# at {pos} +#{yymmdd} {HH:MM:SS} server id 1 end_log_pos {pos} Query thread_id={integer} exec_time={integer} error_code=0 SET TIMESTAMP=1579609946/*!*/; insert into t1 values(null, "d")/*!*/; +# at {pos} +#{yymmdd} {HH:MM:SS} server id 1 end_log_pos {pos} Intvar SET INSERT_ID=5/*!*/; +# at {pos} +#{yymmdd} {HH:MM:SS} server id 1 end_log_pos {pos} Query thread_id={integer} exec_time={integer} error_code=0 SET TIMESTAMP=1579609946/*!*/; insert into t1 values(null, "e")/*!*/; +# at {pos} +#{yymmdd} {HH:MM:SS} server id 1 end_log_pos {pos} Rotate to master-bin.000002 pos: {pos} DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; diff --git a/mysql-test/t/mysqlbinlog2.test b/mysql-test/t/mysqlbinlog2.test index ac647f772b1..3dadc970069 100644 --- a/mysql-test/t/mysqlbinlog2.test +++ b/mysql-test/t/mysqlbinlog2.test @@ -43,7 +43,8 @@ select "--- Local --" as ""; # be time dependent (the Start events). Better than nothing. # ---exec $MYSQL_BINLOG --short-form $MYSQLTEST_VARDIR/log/master-bin.000001 +--replace_regex /[[:<:]][0-9]{6} [0-9 ][0-9]:[0-9]{2}:[0-9]{2}[[:>:]]/{yymmdd} {HH:MM:SS}/ /=[0-9]+ /={integer} / /# at [0-9]+/# at {pos}/ /(pos:?) [0-9]+/\1 {pos}/ +--exec $MYSQL_BINLOG $MYSQLTEST_VARDIR/log/master-bin.000001 --disable_query_log select "--- offset --" as ""; diff --git a/mysys/mf_iocache2.c b/mysys/mf_iocache2.c index bdb5d057a16..1d33b88e269 100644 --- a/mysys/mf_iocache2.c +++ b/mysys/mf_iocache2.c @@ -299,6 +299,7 @@ uint my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args) uint minimum_width; /* as yet unimplemented */ uint minimum_width_sign; uint precision; /* as yet unimplemented for anything but %b */ + my_bool is_zero_padded; /* Store the location of the beginning of a format directive, for the @@ -334,11 +335,27 @@ uint my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args) backtrack= fmt; fmt++; + is_zero_padded= FALSE; + minimum_width_sign= 1; minimum_width= 0; precision= 0; - minimum_width_sign= 1; /* Skip if max size is used (to be compatible with printf) */ - while (*fmt == '-') { fmt++; minimum_width_sign= -1; } + +process_flags: + switch (*fmt) + { + case '-': + minimum_width_sign= -1; fmt++; goto process_flags; + case '0': + is_zero_padded= TRUE; fmt++; goto process_flags; + case '#': + /** @todo Implement "#" conversion flag. */ fmt++; goto process_flags; + case ' ': + /** @todo Implement " " conversion flag. */ fmt++; goto process_flags; + case '+': + /** @todo Implement "+" conversion flag. */ fmt++; goto process_flags; + } + if (*fmt == '*') { precision= (int) va_arg(args, int); fmt++; @@ -367,7 +384,7 @@ uint my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args) { reg2 char *par = va_arg(args, char *); uint length2 = (uint) strlen(par); - /* TODO: implement minimum width and precision */ + /* TODO: implement precision */ out_length+= length2; if (my_b_write(info, par, length2)) goto err; @@ -390,6 +407,21 @@ uint my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args) length2= (uint) (int10_to_str((long) iarg,buff, -10) - buff); else length2= (uint) (int10_to_str((long) (uint) iarg,buff,10)- buff); + + /* minimum width padding */ + if (minimum_width > length2) + { + char *buffz; + + buffz= my_alloca(minimum_width - length2); + if (is_zero_padded) + memset(buffz, '0', minimum_width - length2); + else + memset(buffz, ' ', minimum_width - length2); + my_b_write(info, buffz, minimum_width - length2); + my_afree(buffz); + } + out_length+= length2; if (my_b_write(info, buff, length2)) goto err;