mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
934bb37d39
by binlogging some SET ONE_SHOT CHARACTER_SETetc, which will be enough until we have it more compact and more complete in 5.0. With the present patch, replication will work ok between 4.1.3 master and slaves, as long as: - master and slave have the same GLOBAL.COLLATION_SERVER - COLLATION_DATABASE and CHARACTER_SET_DATABASE are not used - application does not use the fact that table is created with charset of the USEd db (BUG#2326). all of which are not too hard to fulfill. ONE_SHOT is reserved for internal use of mysqlbinlog|mysql and works only for charsets, so we give error if used for non-charset vars. Fix for BUG#3875 "mysqlbinlog produces wrong ouput if query uses variables containing quotes" and BUG#3943 "Queries with non-ASCII literals are not replicated properly after SET NAMES". Detecting that master and slave have different global charsets or server ids. mysql-test/r/rpl_server_id1.result: it's normal to not run as I have added a test to compare server ids of master and slave at startup and stop if equal (unless --replicate-same-server-id) mysql-test/r/rpl_user_variables.result: result update (as we now print charset of user var). mysql-test/r/user_var.result: result update mysql-test/t/rpl_server_id1.test: no need to select as slave is not running mysql-test/t/user_var.test: testing if the content of user vars is escaped when mysqlbinlog prints them, and if the name is backquoted. sql/lex.h: new keyword ONE_SHOT sql/log.cc: when writing to the binlog, before writing the actual statement, write some SET ONE_SHOT CHARACTER_SET_CLIENT etc for the slave to know the charset variables (which are important as they affect the inserted data). sql/log_event.cc: print charset and collation of user var in mysqlbinlog and SHOW BINLOG EVENTS. escape the content of the var. Backquote its name. Will ask Bar to check that using my_charset_bin for escaping is ok. sql/set_var.cc: understand SET CHARACTER_SET_CLIENT=10 (don't require a string, accept a number). Refuse changing of GLOBAL CHARACTER_SET_SERVER/COLLATION_SERVER if binlog or slave, as it will make the master or slave make wrong assumptions. A function to catch SET ONE_SHOT on non-charset variables (which is forbidden) sql/set_var.h: no_support_one_shot to know if the var supports ONE_SHOT (only charset vars do, soon timezones). Accept int arg in SET CHARACTER_SET_etc sql/slave.cc: when I/O slave thread starts, verify that master's and slave charsets match. And by the way verify that server ids are different. Don't fail if UNIX_TIMESTAMP() can't be done on master (very old master), that's not fatal. sql/sql_class.cc: one_shot sql/sql_class.h: one_shot sql/sql_lex.h: one_shot sql/sql_parse.cc: when SET ONE_SHOT is used, verify that it's only used for charset/collation vars; otherwise refuse. sql/sql_yacc.yy: ONE_SHOT keyword in SET
122 lines
3.7 KiB
Text
122 lines
3.7 KiB
Text
# Initialise
|
|
--disable_warnings
|
|
drop table if exists t1,t2;
|
|
--enable_warnings
|
|
|
|
--error 1054
|
|
set @a := foo;
|
|
set @a := connection_id() + 3;
|
|
select @a - connection_id();
|
|
|
|
set @b := 1;
|
|
select @b;
|
|
|
|
# Check using and setting variables with SELECT DISTINCT
|
|
|
|
CREATE TABLE t1 ( i int not null, v int not null,index (i));
|
|
insert into t1 values (1,1),(1,3),(2,1);
|
|
create table t2 (i int not null, unique (i));
|
|
insert into t2 select distinct i from t1;
|
|
select * from t2;
|
|
select distinct t2.i,@vv1:=if(sv1.i,1,0),@vv2:=if(sv2.i,1,0),@vv3:=if(sv3.i,1,0), @vv1+@vv2+@vv3 from t2 left join t1 as sv1 on sv1.i=t2.i and sv1.v=1 left join t1 as sv2 on sv2.i=t2.i and sv2.v=2 left join t1 as sv3 on sv3.i=t2.i and sv3.v=3;
|
|
explain select * from t1 where i=@vv1;
|
|
explain select * from t1 where @vv1:=@vv1+1 and i=@vv1;
|
|
explain select @vv1:=i from t1 where i=@vv1;
|
|
explain select * from t1 where i=@vv1;
|
|
drop table t1,t2;
|
|
|
|
# Check types of variables
|
|
set @a=0,@b=0;
|
|
select @a:=10, @b:=1, @a > @b, @a < @b;
|
|
# Note that here a and b will be avaluated as number
|
|
select @a:="10", @b:="1", @a > @b, @a < @b;
|
|
# Note that here a and b will be avaluated as strings
|
|
select @a:=10, @b:=2, @a > @b, @a < @b;
|
|
select @a:="10", @b:="2", @a > @b, @a < @b;
|
|
|
|
# Fixed bug #1194
|
|
select @a:=1;
|
|
select @a, @a:=1;
|
|
|
|
create table t1 (id int, d double, c char(10));
|
|
insert into t1 values (1,2.0, "test");
|
|
select @c:=0;
|
|
update t1 SET id=(@c:=@c+1);
|
|
select @c;
|
|
select @c:=0;
|
|
update t1 set id=(@c:=@c+1);
|
|
select @c;
|
|
select @c:=0;
|
|
select @c:=@c+1;
|
|
select @d,(@d:=id),@d from t1;
|
|
select @e,(@e:=d),@e from t1;
|
|
select @f,(@f:=c),@f from t1;
|
|
set @g=1;
|
|
select @g,(@g:=c),@g from t1;
|
|
select @c, @d, @e, @f;
|
|
select @d:=id, @e:=id, @f:=id, @g:=@id from t1;
|
|
select @c, @d, @e, @f, @g;
|
|
drop table t1;
|
|
|
|
# just for fun :)
|
|
select @a:=10, @b:=2, @a>@b, @a:="10", @b:="2", @a>@b, @a:=10, @b:=2, @a>@b, @a:="10", @b:="2", @a>@b;
|
|
|
|
#
|
|
# bug#1739
|
|
# Item_func_set_user_var sets update_query_id, Item_func_get_user_var checks it
|
|
#
|
|
create table t1 (i int not null);
|
|
insert t1 values (1),(2),(2),(3),(3),(3);
|
|
select @a:=0; select @a, @a:=@a+count(*), count(*), @a from t1 group by i;
|
|
select @a:=0; select @a+0, @a:=@a+0+count(*), count(*), @a+0 from t1 group by i;
|
|
drop table t1;
|
|
|
|
#
|
|
# Bug #2244: User variables didn't copy collation and derivation
|
|
# attributes from values they were initialized to.
|
|
#
|
|
|
|
set @a=_latin2'test';
|
|
select charset(@a),collation(@a),coercibility(@a);
|
|
select @a=_latin2'TEST';
|
|
select @a=_latin2'TEST' collate latin2_bin;
|
|
|
|
set @a=_latin2'test' collate latin2_general_ci;
|
|
select charset(@a),collation(@a),coercibility(@a);
|
|
select @a=_latin2'TEST';
|
|
--error 1267
|
|
select @a=_latin2'TEST' collate latin2_bin;
|
|
|
|
#
|
|
# Check the same invoking Item_set_user_var
|
|
#
|
|
select charset(@a:=_latin2'test');
|
|
select collation(@a:=_latin2'test');
|
|
select coercibility(@a:=_latin2'test');
|
|
select collation(@a:=_latin2'test' collate latin2_bin);
|
|
select coercibility(@a:=_latin2'test' collate latin2_bin);
|
|
select (@a:=_latin2'test' collate latin2_bin) = _latin2'TEST';
|
|
select charset(@a),collation(@a),coercibility(@a);
|
|
--error 1267
|
|
select (@a:=_latin2'test' collate latin2_bin) = _latin2'TEST' collate latin2_general_ci;
|
|
|
|
# Check that user variables are binlogged correctly (BUG#3875)
|
|
create table t1 (a varchar(50));
|
|
reset master;
|
|
SET TIMESTAMP=10000;
|
|
SET @`a b`='hello';
|
|
INSERT INTO t1 VALUES(@`a b`);
|
|
set @var1= "';aaa";
|
|
insert into t1 values (@var1);
|
|
create table t2 (c char(30)) charset=ucs2;
|
|
set @v=convert('abc' using ucs2);
|
|
insert into t2 values (@v);
|
|
show binlog events from 79;
|
|
# more important than SHOW BINLOG EVENTS, mysqlbinlog (where we
|
|
# absolutely need variables names to be quoted and strings to be
|
|
# escaped).
|
|
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
|
--exec $MYSQL_BINLOG --short-form $MYSQL_TEST_DIR/var/log/master-bin.000001
|
|
drop table t1, t2;
|
|
|
|
|