# Tests for the performance schema
#

--source ../include/stage_setup.inc

connect (con1, localhost, user1, , );

--disable_warnings
drop function if exists test.f1;
drop procedure if exists test.p1;
--enable_warnings

delimiter $$;

create function test.f1() returns int
begin
  call test.p1();
  return 1;
end
$$

delimiter ;$$

create procedure test.p1()
begin end;

begin;
# The procedure is in a sub statement,
# so that the current transaction keeps a reference to it.
select test.f1();

connect (con2, localhost, user2, , );

# Will wait on con1, "Waiting for stored procedure metadata lock"
--send
drop procedure test.p1;

--connection default

# user1: Wait for the statement to complete
let $wait_condition=
  select count(*) = 1 from performance_schema.threads
  where `TYPE`='FOREGROUND' and PROCESSLIST_USER like 'user1'
  and PROCESSLIST_COMMAND = 'Sleep';
--source include/wait_condition.inc

# user2: Wait for the drop procedure to block
let $wait_condition=
  select count(*) = 1 from performance_schema.threads
  where `TYPE`='FOREGROUND' and PROCESSLIST_USER like 'user2'
  and PROCESSLIST_STATE = 'Waiting for stored procedure metadata lock';
--source include/wait_condition.inc

call dump_one_thread('user1');
call dump_one_thread('user2');

--connection con1
select test.f1();
commit;

--disconnect con1

--connection con2
--reap

--disconnect con2

--connection default

# Wait for the disconnect to complete
let $wait_condition=
  select count(*) = 0 from performance_schema.threads
  where `TYPE`='FOREGROUND' and PROCESSLIST_USER like 'user%';
--source include/wait_condition.inc

drop function test.f1;

--source ../include/stage_cleanup.inc

