Commit 2fb807d1 authored by unknown's avatar unknown
Browse files

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.


mysql-test/r/user_var.result:
  Test changes accordintly
mysql-test/t/user_var.test:
  Test changes accordintly
parent 14707d71
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -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;
+0 −2
Original line number Diff line number Diff line
@@ -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)
+5 −5
Original line number Diff line number Diff line
@@ -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: