Commit 944915ca authored by Leonard Zhou's avatar Leonard Zhou

BUG#35515 Aliases of variables in binary log are ignored with NAME_CONST.

      
When add an aliase name after NAME_CONST, the aliase name will be overwrite.
      
NAME_CONST will re-set the field's name only if there isn't an aliase in the
function fix-fields().
If there is an aliase, NAME_CONST doesn't re-set the field's name and keeps the old
name.

mysql-test/r/func_misc.result:
  Test result.
mysql-test/r/rpl_name_const.result:
  Test case.
mysql-test/t/func_misc.test:
  Add NAME_CONST test.
mysql-test/t/rpl_name_const.test:
  Test result.
sql/item.cc:
  Re-set field's name if the name is autogenerated, that mean without aliase.
parent 55c779cd
...@@ -324,4 +324,7 @@ SELECT * FROM t1 WHERE a = NAME_CONST('reportDate', ...@@ -324,4 +324,7 @@ SELECT * FROM t1 WHERE a = NAME_CONST('reportDate',
_binary'2009-01-09' COLLATE 'binary'); _binary'2009-01-09' COLLATE 'binary');
a a
DROP TABLE t1; DROP TABLE t1;
select NAME_CONST('_id',1234) as id;
id
1234
End of 5.0 tests End of 5.0 tests
stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
==== Initialize ====
[on master]
create table t1 (id int);
==== create a procedure that has a column aliase in a subquery ====
drop procedure if exists test_procedure;
create procedure test_procedure(_id int)
begin
insert into t1 (id)
select a.id
from
( select _id as id ) a;
end;$$
==== enable the binary log, then call the procedure ====
call test_procedure(1234);
[on slave]
select * from t1 order by id;
id
1234
==== Clean up ====
[on master]
drop table t1;
drop procedure test_procedure;
...@@ -445,5 +445,10 @@ SELECT * FROM t1 WHERE a = NAME_CONST('reportDate', ...@@ -445,5 +445,10 @@ SELECT * FROM t1 WHERE a = NAME_CONST('reportDate',
_binary'2009-01-09' COLLATE 'binary'); _binary'2009-01-09' COLLATE 'binary');
DROP TABLE t1; DROP TABLE t1;
#
# Bug#35515: Aliases of variables in binary log are ignored with NAME_CONST
#
select NAME_CONST('_id',1234) as id;
--echo End of 5.0 tests --echo End of 5.0 tests
# ==== Purpose ====
#
# Test that aliases of variables in binary log aren't ignored with NAME_CONST.
#
# ==== Method ====
#
# Create a procedure with aliases of variables, then replicate it to slave.
# BUG#35515 Aliases of variables in binary log are ignored with NAME_CONST.
#
source include/master-slave.inc;
--echo ==== Initialize ====
--echo [on master]
--connection master
create table t1 (id int);
--echo ==== create a procedure that has a column aliase in a subquery ====
--disable_warnings
drop procedure if exists test_procedure;
--enable_warnings
delimiter $$;
create procedure test_procedure(_id int)
begin
insert into t1 (id)
select a.id
from
( select _id as id ) a;
end;$$
delimiter ;$$
--echo ==== enable the binary log, then call the procedure ====
call test_procedure(1234);
--echo [on slave]
sync_slave_with_master;
select * from t1 order by id;
--echo ==== Clean up ====
--echo [on master]
connection master;
drop table t1;
drop procedure test_procedure;
...@@ -1282,7 +1282,10 @@ bool Item_name_const::fix_fields(THD *thd, Item **ref) ...@@ -1282,7 +1282,10 @@ bool Item_name_const::fix_fields(THD *thd, Item **ref)
my_error(ER_RESERVED_SYNTAX, MYF(0), "NAME_CONST"); my_error(ER_RESERVED_SYNTAX, MYF(0), "NAME_CONST");
return TRUE; return TRUE;
} }
if (is_autogenerated_name)
{
set_name(item_name->ptr(), (uint) item_name->length(), system_charset_info); set_name(item_name->ptr(), (uint) item_name->length(), system_charset_info);
}
collation.set(value_item->collation.collation, DERIVATION_IMPLICIT); collation.set(value_item->collation.collation, DERIVATION_IMPLICIT);
max_length= value_item->max_length; max_length= value_item->max_length;
decimals= value_item->decimals; decimals= value_item->decimals;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment