mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
c69e2fc7a8
New more SP-locking friendly approach to handling locks in multi-update. Now we mark all tables of multi-update as needing write lock at parsing stage and if possible downgrade lock at execution stage (For its work SP-locking mechanism needs to know all lock types right after parsing stage). mysql-test/r/sp-threads.result: Added test for bug #9486 "Can't perform multi-update in stored procedure". mysql-test/t/sp-threads.test: Added test for bug #9486 "Can't perform multi-update in stored procedure". sql/sp_head.cc: SP_TABLE, sp_head::merge_table_list()/add_used_tables_to_table_list(): Since some queries during their execution (e.g. multi-update) may change type of lock for some of their tables and thus change lock_type member for some of elements of table list, we should store type of lock in SP_TABLE struct explicitly instead of using lock_type member of TABLE_LIST object pointed by SP_TABLE::table. sql/sql_lex.h: Removed no longer used LEX::multi_lock_option member. sql/sql_prepare.cc: mysql_test_update(): We don't need to bother about LEX::multi_lock_option if we convert multi-update to update anymore. Since nowdays multi-update uses TABLE_LIST::lock_type for specifying lock level of updated tables instead of LEX::multi_lock_option. sql/sql_update.cc: mysql_update()/mysql_multi_update_prepare(): Now we mark all tables of multi-update as needing write lock at parsing stage and if possible downgrade lock at execution stage. Old approach (don't set lock type until execution stage) was not working well with SP-locking (For its work SP-locking mechanism needs to know all lock types right after parsing stage). mysql_multi_update(): We should return FALSE if no error occurs. sql/sql_yacc.yy: update: Now we mark all tables of multi-update as needing write lock at parsing stage and if possible downgrade lock at execution stage. Old approach (don't set lock type until execution stage) was not working well with SP-locking (For its work SP-locking mechanism needs to know all lock types right after parsing stage).
95 lines
1.6 KiB
Text
95 lines
1.6 KiB
Text
#
|
|
# Testing stored procedures with multiple connections,
|
|
# except security/privilege tests, they go to sp-security.test
|
|
#
|
|
|
|
connect (con1root,localhost,root,,);
|
|
connect (con2root,localhost,root,,);
|
|
|
|
connection con1root;
|
|
use test;
|
|
|
|
--disable_warnings
|
|
drop table if exists t1;
|
|
--enable_warnings
|
|
create table t1 (s1 int, s2 int, s3 int);
|
|
|
|
delimiter //;
|
|
create procedure bug4934()
|
|
begin
|
|
insert into t1 values (1,0,1);
|
|
end//
|
|
delimiter ;//
|
|
|
|
|
|
connection con2root;
|
|
use test;
|
|
|
|
call bug4934();
|
|
select * from t1;
|
|
|
|
|
|
connection con1root;
|
|
|
|
drop table t1;
|
|
create table t1 (s1 int, s2 int, s3 int);
|
|
|
|
drop procedure bug4934;
|
|
delimiter //;
|
|
create procedure bug4934()
|
|
begin
|
|
end//
|
|
delimiter ;//
|
|
|
|
|
|
connection con2root;
|
|
|
|
select * from t1;
|
|
call bug4934();
|
|
select * from t1;
|
|
|
|
connection con1root;
|
|
|
|
drop table t1;
|
|
drop procedure bug4934;
|
|
|
|
|
|
#
|
|
# BUG #9486 "Can't perform multi-update in stored procedure"
|
|
#
|
|
--disable_warnings
|
|
drop procedure if exists bug9486;
|
|
drop table if exists t1, t2;
|
|
--enable_warnings
|
|
create table t1 (id1 int, val int);
|
|
create table t2 (id2 int);
|
|
|
|
create procedure bug9486()
|
|
update t1, t2 set val= 1 where id1=id2;
|
|
call bug9486();
|
|
# Let us check that SP invocation requires write lock for t2.
|
|
connection con2root;
|
|
lock tables t2 write;
|
|
connection con1root;
|
|
send call bug9486();
|
|
connection con2root;
|
|
--sleep 2
|
|
# There should be call statement in locked state.
|
|
--replace_column 1 # 6 #
|
|
show processlist;
|
|
unlock tables;
|
|
connection con1root;
|
|
reap;
|
|
|
|
drop procedure bug9486;
|
|
drop table t1, t2;
|
|
|
|
|
|
#
|
|
# BUG#NNNN: New bug synopsis
|
|
#
|
|
#--disable_warnings
|
|
#drop procedure if exists bugNNNN;
|
|
#--enable_warnings
|
|
#create procedure bugNNNN...
|
|
|