Commit ce6a2d32 authored by unknown's avatar unknown
Browse files

Merge mysql.com:/usr_rh9/home/elkin.rh9/MySQL/BARE/4.1

into  mysql.com:/usr_rh9/home/elkin.rh9/MySQL/FIXES/4.1-bug19136_unass_user_var


sql/item_func.cc:
  Auto merged
parents 427bcfb4 4ab4631b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -105,5 +105,6 @@ slave-bin.000001 1370 User var 2 1370 @`a`=5
slave-bin.000001	1412	Query	1	1412	use `test`; insert into t1 values (@a),(@a)
slave-bin.000001	1478	User var	2	1478	@`a`=NULL
slave-bin.000001	1503	Query	1	1503	use `test`; insert into t1 values (@a),(@a),(@a*5)
insert into t1 select * FROM (select @var1 union  select @var2) AS t2;
drop table t1;
stop slave;
+6 −0
Original line number Diff line number Diff line
@@ -47,9 +47,15 @@ connection slave;
sync_with_master;
select * from t1;
show binlog events from 141;

#
# BUG19136: Crashing log-bin and uninitialized user variables in a derived table
# just to check nothing bad happens anymore
connection master;
insert into t1 select * FROM (select @var1 union  select @var2) AS t2;
drop table t1;
save_master_pos;

connection slave;
sync_with_master;
stop slave;
+10 −0
Original line number Diff line number Diff line
@@ -2735,14 +2735,24 @@ int get_var_with_binlog(THD *thd, LEX_STRING &name,
      sql_set_variables(), we could instead manually call check() and update();
      this would save memory and time; but calling sql_set_variables() makes
      one unique place to maintain (sql_set_variables()). 

      Manipulation with lex is necessary since free_underlaid_joins
      is going to release memory belonging to the main query.
    */

    List<set_var_base> tmp_var_list;
    LEX *sav_lex= thd->lex, lex_tmp;
    thd->lex= &lex_tmp;
    lex_start(thd, NULL, 0);
    tmp_var_list.push_back(new set_var_user(new Item_func_set_user_var(name,
                                                                       new Item_null())));
    /* Create the variable */
    if (sql_set_variables(thd, &tmp_var_list))
    {
      thd->lex= sav_lex;
      goto err;
    }
    thd->lex= sav_lex;
    if (!(var_entry= get_variable(&thd->user_vars, name, 0)))
      goto err;
  }