mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
A user variable are now always have IMPLICIT coercibility,
independently from the expression it is initialized from. In other words, this change treats a user variable like a table with one column and one record. Discussed with PeterG, Serg and Lars. This change also simplifies replication allowing not to replicate variables' coercibility.
This commit is contained in:
@ -123,7 +123,7 @@ drop table t1;
|
||||
set @a=_latin2'test';
|
||||
select charset(@a),collation(@a),coercibility(@a);
|
||||
charset(@a) collation(@a) coercibility(@a)
|
||||
latin2 latin2_general_ci 3
|
||||
latin2 latin2_general_ci 2
|
||||
select @a=_latin2'TEST';
|
||||
@a=_latin2'TEST'
|
||||
1
|
||||
@ -133,12 +133,13 @@ select @a=_latin2'TEST' collate latin2_bin;
|
||||
set @a=_latin2'test' collate latin2_general_ci;
|
||||
select charset(@a),collation(@a),coercibility(@a);
|
||||
charset(@a) collation(@a) coercibility(@a)
|
||||
latin2 latin2_general_ci 0
|
||||
latin2 latin2_general_ci 2
|
||||
select @a=_latin2'TEST';
|
||||
@a=_latin2'TEST'
|
||||
1
|
||||
select @a=_latin2'TEST' collate latin2_bin;
|
||||
ERROR HY000: Illegal mix of collations (latin2_general_ci,EXPLICIT) and (latin2_bin,EXPLICIT) for operation '='
|
||||
@a=_latin2'TEST' collate latin2_bin
|
||||
0
|
||||
select charset(@a:=_latin2'test');
|
||||
charset(@a:=_latin2'test')
|
||||
latin2
|
||||
@ -147,21 +148,22 @@ collation(@a:=_latin2'test')
|
||||
latin2_general_ci
|
||||
select coercibility(@a:=_latin2'test');
|
||||
coercibility(@a:=_latin2'test')
|
||||
3
|
||||
2
|
||||
select collation(@a:=_latin2'test' collate latin2_bin);
|
||||
collation(@a:=_latin2'test' collate latin2_bin)
|
||||
latin2_bin
|
||||
select coercibility(@a:=_latin2'test' collate latin2_bin);
|
||||
coercibility(@a:=_latin2'test' collate latin2_bin)
|
||||
0
|
||||
2
|
||||
select (@a:=_latin2'test' collate latin2_bin) = _latin2'TEST';
|
||||
(@a:=_latin2'test' collate latin2_bin) = _latin2'TEST'
|
||||
0
|
||||
select charset(@a),collation(@a),coercibility(@a);
|
||||
charset(@a) collation(@a) coercibility(@a)
|
||||
latin2 latin2_bin 0
|
||||
latin2 latin2_bin 2
|
||||
select (@a:=_latin2'test' collate latin2_bin) = _latin2'TEST' collate latin2_general_ci;
|
||||
ERROR HY000: Illegal mix of collations (latin2_bin,EXPLICIT) and (latin2_general_ci,EXPLICIT) for operation '='
|
||||
(@a:=_latin2'test' collate latin2_bin) = _latin2'TEST' collate latin2_general_ci
|
||||
1
|
||||
create table t1 (a varchar(50));
|
||||
reset master;
|
||||
SET TIMESTAMP=10000;
|
||||
|
@ -84,7 +84,6 @@ 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;
|
||||
|
||||
#
|
||||
@ -97,7 +96,6 @@ 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)
|
||||
|
@ -2361,7 +2361,7 @@ static user_var_entry *get_variable(HASH *hash, LEX_STRING &name,
|
||||
entry->value=0;
|
||||
entry->length=0;
|
||||
entry->update_query_id=0;
|
||||
entry->collation.set(NULL, DERIVATION_NONE);
|
||||
entry->collation.set(NULL, DERIVATION_IMPLICIT);
|
||||
/*
|
||||
If we are here, we were called from a SET or a query which sets a
|
||||
variable. Imagine it is this:
|
||||
@ -2419,8 +2419,8 @@ bool Item_func_set_user_var::fix_fields(THD *thd, TABLE_LIST *tables,
|
||||
and the variable has previously been initialized.
|
||||
*/
|
||||
if (!entry->collation.collation || !args[0]->null_value)
|
||||
entry->collation.set(args[0]->collation);
|
||||
collation.set(entry->collation);
|
||||
entry->collation.set(args[0]->collation.collation, DERIVATION_IMPLICIT);
|
||||
collation.set(entry->collation.collation, DERIVATION_IMPLICIT);
|
||||
cached_result_type= args[0]->result_type();
|
||||
return 0;
|
||||
}
|
||||
@ -2432,7 +2432,7 @@ Item_func_set_user_var::fix_length_and_dec()
|
||||
maybe_null=args[0]->maybe_null;
|
||||
max_length=args[0]->max_length;
|
||||
decimals=args[0]->decimals;
|
||||
collation.set(args[0]->collation);
|
||||
collation.set(args[0]->collation.collation, DERIVATION_IMPLICIT);
|
||||
}
|
||||
|
||||
|
||||
@ -2659,7 +2659,7 @@ Item_func_set_user_var::update()
|
||||
res= update_hash((void*) save_result.vstr->ptr(),
|
||||
save_result.vstr->length(), STRING_RESULT,
|
||||
save_result.vstr->charset(),
|
||||
args[0]->collation.derivation);
|
||||
DERIVATION_IMPLICIT);
|
||||
break;
|
||||
}
|
||||
case ROW_RESULT:
|
||||
|
Reference in New Issue
Block a user