mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
e013bf9f0e
MDEV-4489 "Replication of big5, cp932, gbk, sjis strings makes wrong values on slave" has been fixed. Problem: String constants of some Asian charsets (big5,cp932,gbk,sjis) can have backslash '\' (0x5C) in the second byte of multi-byte characters. Replicating of such constants using the standard '\'-escaping is dangerous. Therefore, constants of these charsets are replicated using hex notation: INSERT INTO t1 (a) VALUES (0x815C); However, 0xHHHH constants do not work well in some cases, because they can behave as strings and as numbers, depending on context (for example, depending on the data type of the column in an INSERT statement). This SQL script was not replicated correctly with statement-based replication: SET NAMES gbk; PREPARE STMT FROM 'INSERT INTO t1 (a) VALUES (?)'; SET @a = '1'; EXECUTE STMT USING @a; The INSERT statement was replicated as: INSERT INTO t1 (a) VALUES (0x31); '1' was correctly converted to the number 1 on master. But the 0x31 constant was treated as number 49 on slave. Fix: 1. Binary log now uses X'HHHH' instead of 0xHHHH constants. 2. The X'HHHH' constants now work always as strings, in all contexts. This is the SQL standard compliant behaviour. After the fix, the above statement is replicated as: INSERT INTO t1 (a) VALUES (X'31'); X'31' is treated as string '1' on slave, and is correctly converted to 1. modified: @ mysql-test/r/ctype_cp932_binlog_stm.result @ mysql-test/r/select.result @ mysql-test/r/select_jcl6.result @ mysql-test/r/select_pkeycache.result @ mysql-test/r/user_var-binlog.result @ mysql-test/r/varbinary.result @ mysql-test/suite/binlog/r/binlog_stm_ctype_ucs.result @ mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result @ mysql-test/suite/rpl/r/rpl_charset_sjis.result @ mysql-test/suite/rpl/r/rpl_mdev382.result @ mysql-test/suite/rpl/t/rpl_charset_sjis.test @ mysql-test/t/ctype_cp932_binlog_stm.test @ mysql-test/t/select.test @ mysql-test/t/varbinary.test Adding and updating tests @ sql/item.cc @ sql/item.h @ sql/sql_yacc.yy @ sql/sql_lex.cc Splitting the implementations of X'HH' and 0xHH constants into two separate classes. Fixing the parser to distinguish the two syntaxes. @ sql/log_event.cc Using X'HH' instead of 0xHH for binary logging for string constants of the "dangerous" charsets. @ sql/sql_string.h Adding a helped method String::append_hex().
181 lines
4.7 KiB
Text
181 lines
4.7 KiB
Text
drop table if exists t1;
|
|
select 0x41,0x41+0,0x41 | 0x7fffffffffffffff | 0,0xffffffffffffffff | 0 ;
|
|
0x41 0x41+0 0x41 | 0x7fffffffffffffff | 0 0xffffffffffffffff | 0
|
|
A 65 9223372036854775807 18446744073709551615
|
|
select 0x31+1,concat(0x31)+1,-0xf;
|
|
0x31+1 concat(0x31)+1 -0xf
|
|
50 2 -15
|
|
select x'31',0xffff+0;
|
|
x'31' 0xffff+0
|
|
1 65535
|
|
select X'FFFF'+0;
|
|
X'FFFF'+0
|
|
0
|
|
Warnings:
|
|
Warning 1292 Truncated incorrect DOUBLE value: '\xFF\xFF'
|
|
SELECT x'31'+0, 0x31+0;
|
|
x'31'+0 0x31+0
|
|
1 49
|
|
SELECT x'31'+0.1e0, 0x31+0.1e0;
|
|
x'31'+0.1e0 0x31+0.1e0
|
|
1.1 49.1
|
|
SELECT x'312E39'+0e0, 0x312E39+0e0;
|
|
x'312E39'+0e0 0x312E39+0e0
|
|
1.9 3223097
|
|
SELECT CAST(x'31' AS SIGNED), CAST(0x31 AS SIGNED);
|
|
CAST(x'31' AS SIGNED) CAST(0x31 AS SIGNED)
|
|
1 49
|
|
SELECT CAST(x'31' AS DECIMAL(10,1)), CAST(0x31 AS DECIMAL(10,1));
|
|
CAST(x'31' AS DECIMAL(10,1)) CAST(0x31 AS DECIMAL(10,1))
|
|
1.0 49.0
|
|
SELECT CAST(x'312E39' AS SIGNED), CAST(0x312E39 AS SIGNED);
|
|
CAST(x'312E39' AS SIGNED) CAST(0x312E39 AS SIGNED)
|
|
1 3223097
|
|
Warnings:
|
|
Warning 1292 Truncated incorrect INTEGER value: '1.9'
|
|
SELECT CAST(x'312E39' AS DECIMAL(10,1)), CAST(0x312E39 AS DECIMAL(10,1));
|
|
CAST(x'312E39' AS DECIMAL(10,1)) CAST(0x312E39 AS DECIMAL(10,1))
|
|
1.9 3223097.0
|
|
EXPLAIN EXTENDED SELECT X'FFFF', 0xFFFF;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
|
Warnings:
|
|
Note 1003 select X'ffff' AS `X'FFFF'`,0xffff AS `0xFFFF`
|
|
CREATE TABLE t1 (a int);
|
|
INSERT INTO t1 VALUES (X'31'),(0x31);
|
|
INSERT INTO t1 VALUES (X'312E39'),(0x312E39);
|
|
SELECT * FROM t1;
|
|
a
|
|
1
|
|
49
|
|
2
|
|
3223097
|
|
DROP TABLE t1;
|
|
CREATE TABLE t1 (a DECIMAL(10,1));
|
|
INSERT INTO t1 VALUES (X'31'),(0x31);
|
|
INSERT INTO t1 VALUES (X'312E39'),(0x312E39);
|
|
SELECT * FROM t1;
|
|
a
|
|
1.0
|
|
49.0
|
|
1.9
|
|
3223097.0
|
|
DROP TABLE t1;
|
|
create table t1 (ID int(8) unsigned zerofill not null auto_increment,UNIQ bigint(21) unsigned zerofill not null,primary key (ID),unique (UNIQ) );
|
|
insert into t1 set UNIQ=0x38afba1d73e6a18a;
|
|
insert into t1 set UNIQ=123;
|
|
explain extended select * from t1 where UNIQ=0x38afba1d73e6a18a;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 const UNIQ UNIQ 8 const 1 100.00
|
|
Warnings:
|
|
Note 1003 select 00000001 AS `ID`,004084688022709641610 AS `UNIQ` from `test`.`t1` where 1
|
|
drop table t1;
|
|
select x'hello';
|
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'x'hello'' at line 1
|
|
select 0xfg;
|
|
ERROR 42S22: Unknown column '0xfg' in 'field list'
|
|
create table t1 select 1 as x, 2 as xx;
|
|
select x,xx from t1;
|
|
x xx
|
|
1 2
|
|
drop table t1;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`a` varbinary(255) DEFAULT NULL,
|
|
`b` varchar(255) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
|
select length(a), length(b) from t1;
|
|
length(a) length(b)
|
|
255 3
|
|
255 3
|
|
CHECK TABLE t1 FOR UPGRADE;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check error Table upgrade required. Please do "REPAIR TABLE `t1`" or dump/reload to fix it!
|
|
REPAIR TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 repair status OK
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`a` varbinary(255) DEFAULT NULL,
|
|
`b` varchar(255) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
|
select length(a), length(b) from t1;
|
|
length(a) length(b)
|
|
3 3
|
|
3 3
|
|
insert into t1 values("ccc", "ddd");
|
|
select length(a), length(b) from t1;
|
|
length(a) length(b)
|
|
3 3
|
|
3 3
|
|
3 3
|
|
select hex(a), hex(b) from t1;
|
|
hex(a) hex(b)
|
|
616161 636363
|
|
626262 646464
|
|
636363 646464
|
|
select concat("'", a, "'"), concat("'", b, "'") from t1;
|
|
concat("'", a, "'") concat("'", b, "'")
|
|
'aaa' 'ccc'
|
|
'bbb' 'ddd'
|
|
'ccc' 'ddd'
|
|
drop table t1;
|
|
create table t1(a varbinary(255));
|
|
insert into t1 values("aaa ");
|
|
select length(a) from t1;
|
|
length(a)
|
|
6
|
|
alter table t1 modify a varchar(255);
|
|
select length(a) from t1;
|
|
length(a)
|
|
6
|
|
drop table t1;
|
|
drop table if exists table_28127_a;
|
|
drop table if exists table_28127_b;
|
|
create table table_28127_a(0b02 int);
|
|
show create table table_28127_a;
|
|
Table Create Table
|
|
table_28127_a CREATE TABLE `table_28127_a` (
|
|
`0b02` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
|
create table table_28127_b(0b2 int);
|
|
show create table table_28127_b;
|
|
Table Create Table
|
|
table_28127_b CREATE TABLE `table_28127_b` (
|
|
`0b2` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
|
drop table table_28127_a;
|
|
drop table table_28127_b;
|
|
select 0b01000001;
|
|
0b01000001
|
|
A
|
|
select 0x41;
|
|
0x41
|
|
A
|
|
select b'01000001';
|
|
b'01000001'
|
|
A
|
|
select x'41', 0+x'3635';
|
|
x'41' 0+x'3635'
|
|
A 65
|
|
select N'abc', length(N'abc');
|
|
abc length(N'abc')
|
|
abc 3
|
|
select N'', length(N'');
|
|
length(N'')
|
|
0
|
|
select '', length('');
|
|
length('')
|
|
0
|
|
select b'', 0+b'';
|
|
b'' 0+b''
|
|
0
|
|
select x'', 0+x'';
|
|
x'' 0+x''
|
|
0
|
|
select 0x;
|
|
ERROR 42S22: Unknown column '0x' in 'field list'
|
|
select 0b;
|
|
ERROR 42S22: Unknown column '0b' in 'field list'
|