mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
BUG#32580 (mysqlbinlog cannot read binlog event generated by user variable usage):
The client program 'mysqlbinlog' crashed when trying to print a User_var_log_event holding a floating-point value since the format specifier for my_b_printf() does not support floating-point format specifiers. This patch prints the floating-point number to an internal buffer, and then writes that buffer to the output instead.
This commit is contained in:
@ -351,4 +351,29 @@ a b
|
||||
1 root@localhost
|
||||
DROP DATABASE mysqltest1;
|
||||
DROP USER untrusted@localhost;
|
||||
BUG#32580: mysqlbinlog cannot read binlog event with user variables
|
||||
USE test;
|
||||
SET BINLOG_FORMAT = STATEMENT;
|
||||
FLUSH LOGS;
|
||||
CREATE TABLE t1 (a_real FLOAT, an_int INT, a_decimal DECIMAL(5,2), a_string CHAR(32));
|
||||
SET @a_real = rand(20) * 1000;
|
||||
SET @an_int = 1000;
|
||||
SET @a_decimal = CAST(rand(19) * 999 AS DECIMAL(5,2));
|
||||
SET @a_string = 'Just a test';
|
||||
INSERT INTO t1 VALUES (@a_real, @an_int, @a_decimal, @a_string);
|
||||
FLUSH LOGS;
|
||||
SELECT * FROM t1;
|
||||
a_real 158.883
|
||||
an_int 1000
|
||||
a_decimal 907.79
|
||||
a_string Just a test
|
||||
DROP TABLE t1;
|
||||
>> mysqlbinlog var/log/master-bin.000019 > var/tmp/bug32580.sql
|
||||
>> mysql test < var/tmp/bug32580.sql
|
||||
SELECT * FROM t1;
|
||||
a_real 158.883
|
||||
an_int 1000
|
||||
a_decimal 907.79
|
||||
a_string Just a test
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
|
@ -278,4 +278,31 @@ connection default;
|
||||
DROP DATABASE mysqltest1;
|
||||
DROP USER untrusted@localhost;
|
||||
|
||||
--echo BUG#32580: mysqlbinlog cannot read binlog event with user variables
|
||||
|
||||
# Testing that various kinds of events can be read and restored properly.
|
||||
|
||||
connection default;
|
||||
USE test;
|
||||
SET BINLOG_FORMAT = STATEMENT;
|
||||
FLUSH LOGS;
|
||||
CREATE TABLE t1 (a_real FLOAT, an_int INT, a_decimal DECIMAL(5,2), a_string CHAR(32));
|
||||
SET @a_real = rand(20) * 1000;
|
||||
SET @an_int = 1000;
|
||||
SET @a_decimal = CAST(rand(19) * 999 AS DECIMAL(5,2));
|
||||
SET @a_string = 'Just a test';
|
||||
INSERT INTO t1 VALUES (@a_real, @an_int, @a_decimal, @a_string);
|
||||
FLUSH LOGS;
|
||||
query_vertical SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
echo >> mysqlbinlog var/log/master-bin.000019 > var/tmp/bug32580.sql;
|
||||
exec $MYSQL_BINLOG $MYSQLTEST_VARDIR/log/master-bin.000019 > $MYSQLTEST_VARDIR/tmp/bug32580.sql;
|
||||
echo >> mysql test < var/tmp/bug32580.sql;
|
||||
exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/bug32580.sql;
|
||||
remove_file $MYSQLTEST_VARDIR/tmp/bug32580.sql;
|
||||
|
||||
query_vertical SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -36,6 +36,16 @@
|
||||
|
||||
#define FLAGSTR(V,F) ((V)&(F)?#F" ":"")
|
||||
|
||||
|
||||
/*
|
||||
Size of buffer for printing a double in format %.<PREC>g
|
||||
|
||||
optional '-' + optional zero + '.' + PREC digits + 'e' + sign +
|
||||
exponent digits + '\0'
|
||||
*/
|
||||
#define FMT_G_BUFSIZE(PREC) (3 + (PREC) + 5 + 1)
|
||||
|
||||
|
||||
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) && !defined(DBUG_OFF) && !defined(_lint)
|
||||
static const char *HA_ERR(int i)
|
||||
{
|
||||
@ -4404,8 +4414,10 @@ void User_var_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info)
|
||||
switch (type) {
|
||||
case REAL_RESULT:
|
||||
double real_val;
|
||||
char real_buf[FMT_G_BUFSIZE(14)];
|
||||
float8get(real_val, val);
|
||||
my_b_printf(&cache, ":=%.14g%s\n", real_val, print_event_info->delimiter);
|
||||
my_sprintf(real_buf, (real_buf, "%.14g", real_val));
|
||||
my_b_printf(&cache, ":=%s%s\n", real_buf, print_event_info->delimiter);
|
||||
break;
|
||||
case INT_RESULT:
|
||||
char int_buf[22];
|
||||
|
Reference in New Issue
Block a user