Commit d23e8e06 authored by Matthias Leich's avatar Matthias Leich

Fix for Bug#37853

    Test "funcs_1.processlist_val_ps" fails in various ways
+ corrections of logic in poll routines
+ minor improvements
parent 632cf8ef
########### suite/funcs_1/datadict/processlist_val.inc ################# ########### suite/funcs_1/datadict/processlist_val.inc #########################
# # # #
# Testing of values within INFORMATION_SCHEMA.PROCESSLIST # # Testing of values within INFORMATION_SCHEMA.PROCESSLIST #
# # # #
# Ensure that the values fit to the current event of the connection # # Ensure that the values fit to the current state of the connection and #
# and especially that they change if a connection does nothing or # # especially that they change if a connection does nothing or runs some SQL. #
# runs some SQL. # # runs some SQL. #
# Examples: # # Examples: #
# - change the default database # # - change the default database #
# - send some time no SQL command to the server # # - send some period of time no SQL command to the server #
# - send a long running query # # - send a long running query #
# # # #
# Note(mleich): # # Note(mleich): #
# 1. Please inform me if this test fails because of timing problems. # # 1. Please inform me if this test fails because of timing problems. #
# I tried to avoid instabilities but the values within the column # # 2. Storage engine variants of this test do not make sense. #
# TIME are very sensible to fluctuations of the machine load. # # - I_S tables use the MEMORY storage engine whenever possible. #
# I had to unify some TIME values with "--replace_result" in cases # # - There are some I_S tables which need column data types which are not #
# where they are too unstable. # # supported by MEMORY. Example: LONGTEXT/BLOB #
# 2. Storage engine variants of this test do not make sense. # # MyISAM will be used for such tables. #
# - I_S tables use the MEMORY storage engine whenever possible. # # The column PROCESSLIST.INFO is of data type LONGTEXT ----> MyISAM #
# - There are some I_S table which need column data types which # # - There is no impact of the GLOBAL(server) or SESSION default storage #
# are not supported by MEMORY. Example: LONGTEXT/BLOB # # engine setting on the engine used for I_S tables. #
# MyISAM will be used for such tables. # # That means we cannot get NDB or InnoDB instead. #
# The column PROCESSLIST.INFO is of data type LONGTEXT # # 3. The SHOW (FULL) PROCESSLIST command are for comparison. #
# ----> MyISAM # # The main test target is INFORMATION_SCHEMA.PROCESSLIST ! #
# - There is no impact of the GLOBAL(server) or SESSION default # # 4. Attention: #
# storage engine setting on the engine used for I_S tables. # # The values of the PROCESSLIST columns HOST and TIME tend to cause #
# That means we cannot get NDB or InnoDB instead. # # problems and therefore their printing has to be suppressed. #
# 3. The SHOW (FULL) PROCESSLIST command are for comparison. # # Examples of the exact values: #
# The main test target is INFORMATION_SCHEMA.PROCESSLIST ! # # HOST: 'localhost' (UNIX derivates) #
# # # 'localhost:<varying_port>' (WINDOWS) #
# Creation: # # TIME: In many cases within this test 0 seconds but if the testing box is #
# 2007-08-09 mleich Implement this test as part of # # overloaded we might get up to 2 seconds. #
# WL#3982 Test information_schema.processlist # # Solution: #
# 2008-01-05 HHunger Changed time test and long statement test. # # --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> #
# It could happen that the long statement test # # 5. How to debug the script? #
# fail due to timing problems. # # <graphical diff tool> \ #
# 2008-04-14 pcrews Changed --replace_columns to include host # # suite/funcs_1/datadict/processlist_val.inc \ #
# this is due to failure occurring on Windows # # <Result|Reject|Log file> #
# Win results included port number as well causing # # I tweaked a lot of the script lines around "echo" so that you will get a #
# test failures # # lot of useful synchronisation. #
######################################################################## # #
# Creation: #
# 2007-08-09 mleich Implement this test as part of #
# WL#3982 Test information_schema.processlist #
# #
# Last Modification: #
# 2008-07-04 mleich Fix for #
# Bug#37853 Test "funcs_1.processlist_val_ps" fails in #
# various ways #
# - issues with printing of port (Win only) #
# - too optimistic assumptions about timing #
# + corrections of logic in poll routines #
# + minor improvements #
################################################################################
# Basic preparations # Basic preparations
--disable_abort_on_error --error 0, ER_CANNOT_USER
DROP USER ddicttestuser1@'localhost'; DROP USER test_user@'localhost';
--enable_abort_on_error CREATE USER test_user@'localhost';
CREATE USER ddicttestuser1@'localhost'; GRANT ALL ON *.* TO test_user@'localhost';
GRANT ALL ON *.* TO ddicttestuser1@'localhost'; REVOKE PROCESS ON *.* FROM test_user@'localhost';
REVOKE PROCESS ON *.* FROM ddicttestuser1@'localhost'; SET PASSWORD FOR test_user@'localhost' = PASSWORD('ddictpass');
SET PASSWORD FOR ddicttestuser1@'localhost' = PASSWORD('ddictpass');
--disable_warnings --disable_warnings
DROP TABLE IF EXISTS test.t1; DROP TABLE IF EXISTS test.t1;
--enable_warnings --enable_warnings
CREATE TABLE test.t1 (f1 BIGINT); CREATE TABLE test.t1 (f1 BIGINT);
USE test;
echo
# Show the definition of the PROCESSLIST table # Show the definition of the PROCESSLIST table
#-------------------------------------------------------------------------- #--------------------------------------------------------------------------
;
SHOW CREATE TABLE INFORMATION_SCHEMA.PROCESSLIST; SHOW CREATE TABLE INFORMATION_SCHEMA.PROCESSLIST;
echo
# Ensure that the values follow the changing default database and statement # Ensure that the information about the own connection is correct.
#-------------------------------------------------------------------------- #--------------------------------------------------------------------------
# - We have now exact one connection. -> One record ;
SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST; # Expected values
# - Other expected values
# - USER = 'root' # - USER = 'root'
# - HOST = 'localhost' # - HOST (printed value is unified), the exact values are often like
# UNIX: 'localhost'
# WIN: 'localhost:<some port>'
# - DB = 'test' # - DB = 'test'
# - Command = 'Query' # - Command IN (no protocol -> 'Query', ps-protocol -> 'Execute')
# - TIME = 0, I hope the testing machines are all time fast enough # - TIME (printed value will be unified), the exact values are like
# - State IS NULL # "normal" load: 0 (seconds)
# "heavy" load: 1 or more (seconds)
# - State 'executing'
# - INFO must contain the corresponding SHOW/SELECT PROCESSLIST # - INFO must contain the corresponding SHOW/SELECT PROCESSLIST
USE test;
--replace_column 1 <ID>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
--replace_column 1 <ID>
SHOW FULL PROCESSLIST;
# #
# Expect to see now DB = 'information_schema' # 1. Just dump what we get
USE information_schema;
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
# #
# Expect to see now INFO = 'SELECT INFO FROM INFORMATION_SCHEMA.PROCESSLIST;' # Determine the connection id of the current connection (default)
SELECT INFO FROM INFORMATION_SCHEMA.PROCESSLIST; SET @default_id = CONNECTION_ID();
#
# 2. There must be exact one connection with @default_id;
SELECT COUNT(*) = 1 AS "Expect exact one connection with this id"
FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = @default_id;
#
# 3. Check the remaining stuff
SELECT COUNT(*) = 1 AS "Expect 1"
FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = @default_id
AND USER = 'root' AND DB = 'test' AND Command IN('Query','Execute')
AND State = 'executing';
#
# 4. Change the DB
USE information_schema;
SELECT COUNT(*) = 1 AS "Is the DB correct?"
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE ID = @default_id AND DB = 'information_schema';
#
# 5. Change the statement
let $my_statement =
SELECT @my_info := INFO FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE ID = @default_id;
eval $my_statement;
eval
SELECT @my_info = '$my_statement'
AS 'Is the content of PROCESSLIST.INFO correct?';
#
# 6. TIME must have a reasonable value
SELECT COUNT(*) = 1 AS "Has TIME a reasonable value?"
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE ID = @default_id AND 0 <= TIME < 10;
# Ensure that the values for an additional connection are correct echo
# Ensure that the information about an inactive connection is correct.
#-------------------------------------------------------------------------- #--------------------------------------------------------------------------
SELECT ID INTO @my_proclist_id FROM INFORMATION_SCHEMA.PROCESSLIST; ;
--echo echo
--echo ----- establish connection ddicttestuser1 (user = ddicttestuser1) ----- # ----- establish connection con1 (user = test_user) -----
connect (ddicttestuser1,localhost,ddicttestuser1,ddictpass,information_schema); ;
connect (con1,localhost,test_user,ddictpass,information_schema);
# #
--echo echo
--echo ----- switch to connection default (user = root) ----- # ----- switch to connection default (user = root) -----
;
connection default; connection default;
# - We have now a second connection. # We have now a second connection.
# First working phase for this connection is "Connect". # First working phase for the new connection is with Command = 'Connect'.
# This is a very short phase and the likelihood to meet it is # This is a very short phase and the likelihood to meet it is
# - nearly zero on average boxes with low parallel load # - nearly zero on average boxes with low parallel load
# - around some percent on weak or overloaded boxes # - around some percent on weak or overloaded boxes
# (Bug#32153 Status output differs - scheduling ?) # (Bug#32153 Status output differs - scheduling ?)
# Therefore we poll till we reach the long lasting phase with: # Therefore we do not try to catch this state.
# - USER = ddicttestuser1 # We poll till we reach the long lasting phase with Command = 'Sleep'.
# - HOST = 'localhost' # - USER = 'test_user'
# - DB = 'information_schema' # - DB = 'information_schema'
# - Command = 'Sleep' # - Command = 'Sleep'
# - TIME >= 0 Overloaded boxes can cause that we do not hit TIME = 0. # - State is empty
# - State IS NULL # - INFO IS NULL
# - INFO must be empty echo
# # Poll till the connection con1 is in state COMMAND = 'Sleep'.
let $wait_condition= SELECT id,user,host,db,command,@time:=time,state,info FROM INFORMATION_SCHEMA.PROCESSLIST ;
WHERE COMMAND = 'Sleep' AND TIME > 0; let $wait_timeout= 10;
let $wait_condition= SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE COMMAND = 'Sleep' AND USER = 'test_user';
--source include/wait_condition.inc --source include/wait_condition.inc
# 1. Just dump what we get
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SHOW FULL PROCESSLIST;
# #
# Expect to hit TIME > 1. # Pull ID and TIME of the second connection
SELECT @time > 0; SELECT ID,TIME INTO @test_user_con1_id,@time FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE COMMAND = 'Sleep' AND USER = 'test_user';
# #
--echo # Sleep some time # 2. The second connection must (behaviour at least since 2007) have an
# The value of TIME must increase and reach 2 after some sleeps. # ID = ID_of_previous_connection + 1
let $wait_timeout= 4; SELECT @test_user_con1_id = @default_id + 1
let $wait_condition= SELECT id,user,host,db,command,@time2:=time,state,info FROM INFORMATION_SCHEMA.PROCESSLIST AS "Did we got the next higher PROCESSLIST ID?";
WHERE TIME > @time;
--source include/wait_condition.inc
# #
# Expect to hit TIME > @time # 3. TIME must have a reasonable value
SELECT @time < @time2; SELECT 0 <= @time < 10 AS "Has TIME a reasonable value?";
# #
# 4. HOST must be for both connections similar (varying port on Win)
SELECT COUNT(*) = 2 AS "Is HOST LIKE 'localhost%'?"
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE HOST LIKE 'localhost%';
# #
# The second connection must have an ID = my ID + 1; # 5. Check the remaining stuff
SELECT ID = @my_proclist_id + 1 FROM INFORMATION_SCHEMA.PROCESSLIST SELECT COUNT(*) = 1 AS "Expect 1"
WHERE USER = 'ddicttestuser1'; FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = @test_user_con1_id
AND USER = 'test_user' AND DB = 'information_schema'
AND Command = 'Sleep' AND State = '' AND INFO IS NULL;
#
# 6. Check that TIME increases
let $wait_timeout= 10;
let $wait_condition= SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE COMMAND = 'Sleep' AND USER = 'test_user'
AND TIME > @time;
--source include/wait_condition.inc
# Ensure that the user ddicttestuser1 sees only connections with his username echo
# Ensure that the user test_user sees only connections with his username
# because he has not the PROCESS privilege. # because he has not the PROCESS privilege.
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
--echo ;
--echo ----- switch to connection ddicttestuser1 (user = ddicttestuser1) ----- echo
connection ddicttestuser1; # ----- switch to connection con1 (user = test_user) -----
;
connection con1;
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
# Ensure that the user ddicttestuser1 sees all connections with his username. echo
# Ensure that the user test_user sees all connections with his username.
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
--echo ;
--echo ----- establish connection con2 (user = ddicttestuser1) ------ echo
connect (con2,localhost,ddicttestuser1,ddictpass,information_schema); ----- establish connection con2 (user = test_user) ------
# ;
# If the testing box is under heavy load we might see connection ddicttestuser1 connect (con2,localhost,test_user,ddictpass,information_schema);
# within the short phase INFO = 'SHOW FULL PROCESSLIST' and STATE = 'Writing to net'. echo
let $wait_condition= SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST # ----- switch to connection default (user = root) -----
WHERE COMMAND = 'Sleep'; ;
connection default;
# If the testing box is under heavy load we might see within some of the
# next queries connection
# con2 with Command = 'Connect'
# con1 with INFO = 'SHOW FULL PROCESSLIST' and STATE = 'Writing to net'
# Both phases are too short to be checked.
echo
# Poll till all connections of 'test_user' are in a state with COMMAND = 'Sleep'
;
let $wait_condition= SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE USER = 'test_user' AND COMMAND = 'Sleep';
--source include/wait_condition.inc --source include/wait_condition.inc
echo
# ----- switch to connection con2 (user = test_user) -----
;
connection con2;
# Just dump what we get
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
# #
--echo echo
--echo ----- switch to connection default (user = root) ----- # ----- switch to connection default (user = root) -----
;
connection default; connection default;
--echo ----- close connection con2 ----- # Pull the ID of con2, we will need it later
disconnect con2; SELECT ID INTO @test_user_con2_id FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE ID <> @test_user_con1_id
AND USER = 'test_user' AND DB = 'information_schema';
# Ensure we see correct values if a connection is during work echo
# Ensure we get correct information about a connection during work
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
--echo ;
--echo ----- switch to connection ddicttestuser1 (user = ddicttestuser1) ----- echo
connection ddicttestuser1; # ----- switch to connection con2 (user = test_user) -----
# "Organise" a long running command to be observed by the root user ;
--echo connection con2;
--echo # "Organise" a long running command to be observed by the root user.
--echo # Send a long enough running statement to the server, but do not echo
--echo # wait till the result comes back. We will pull this later. # Send a long enough running statement to the server, but do not
send SELECT sleep(2.5),'Command time'; # wait till the result comes back.
;
# Worst case scenario (=high I/O load on testing box):
# - My experience:
# Up to 2 seconds runtime per SELECT ... FROM INFORMATION_SCHEMA.PROCESSLIST
# in rare cases.
# - The following sequence contains ~ 4 of such SELECTs
# Therefore we sleep 10 seconds.
let $sleep_command =
SELECT sleep(10), 17;
send;
eval $sleep_command;
# #
--echo echo
--echo ----- switch to connection default (user = root) ----- # ----- switch to connection default (user = root) -----
;
connection default; connection default;
# Sleep a bit so that we can be nearly sure that we see the SELECT of ddicttestuser1. echo
# Expect to see within the processlist the other connection just during statement # Poll till connection con2 is in state 'User sleep'.
# execution. ;
# - USER = ddicttestuser1 # Expect to see within the processlist the other connection just during
# - HOST = 'localhost' # statement execution.
# - USER = 'test_user'
# - DB = 'information_schema' # - DB = 'information_schema'
# - Command = 'Query'(run without --ps-protocol)/'Execute' (run --ps-protocol) # - Command = 'Query'(run without --ps-protocol)/'Execute' (run --ps-protocol)
# - TIME = 1, Attention: check with TIME = 0 is not stable # - TIME >= 0
# - State IS NULL # - State = 'User sleep'
# - INFO = "SELECT sleep(2.5),'Command time'" # - INFO = $sleep_command
--echo # Sleep some time let $wait_condition=
# The command must be after some time in work by the server. SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST
# So poll till INFO is no more NULL and TIME > 0. WHERE ID = @test_user_con2_id AND Command IN('Query','Execute')
let $wait_condition= SELECT id,user,host,db,command,@time:=time,state,info FROM INFORMATION_SCHEMA.PROCESSLIST AND State = 'User sleep' AND INFO IS NOT NULL ;
WHERE INFO IS NOT NULL AND TIME > 0;
--source include/wait_condition.inc --source include/wait_condition.inc
# 1. Just dump what we get
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SHOW FULL PROCESSLIST;
# #
# Expect to see TIME > 0; # Pull some information about the connection con2
SELECT @time > 0; SELECT STATE, TIME, INFO INTO @state, @time, @info
# FROM INFORMATION_SCHEMA.PROCESSLIST
--echo # Sleep some time WHERE ID = @test_user_con2_id;
# The value of TIME must increase and reach 2 after some sleeps. # 2. TIME must have a reasonable value
let $wait_timeout= 2; SELECT 0 <= @time < 10 AS "Has TIME a reasonable value?";
let $wait_condition= SELECT id,user,host,db,command,@time2:=time,state,info FROM INFORMATION_SCHEMA.PROCESSLIST # 3. STATE must be 'User sleep'
WHERE TIME > @time; SELECT @state = 'User sleep' AS "Has STATE the expected value?";
# 4. INFO must fit
eval SELECT @info = '$sleep_command' AS "Has INFO the expected value?";
# 5. Check that TIME increases
let $wait_timeout= 10;
let $wait_condition= SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE ID = @test_user_con2_id AND INFO IS NOT NULL AND TIME > @time;
--source include/wait_condition.inc --source include/wait_condition.inc
# echo
# Expect to see @time < @time2 # ----- switch to connection con2 (user = testuser) -----
SELECT @time < @time2; ;
# connection con2;
--echo echo
--echo ----- switch to connection ddicttestuser1 (user = ddicttestuser1) ----- # Pull("reap") the result set from the statement executed with "send".
connection ddicttestuser1; ;
--echo # Pull("reap") the result set from the statement executed with "send".
reap; reap;
echo
# ----- switch to connection default (user = root) -----
;
connection default;
echo
# Poll till all connections of 'test_user' are in a state with COMMAND = 'Sleep'
;
let $wait_timeout= 10;
let $wait_condition= SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE COMMAND = 'Sleep' AND USER = 'test_user';
--source include/wait_condition.inc
# Ensure that SHOW/SELECT processlist can handle extreme long commands echo
# Ensure that we see that a connection "hangs" when colliding with a
# WRITE TABLE LOCK
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
--echo ;
--echo LOCK TABLE test.t1 WRITE;
--echo # Send a long (21 KB code and runtime = 2 seconds) statement to the server,
--echo # but do not wait till the result comes back. We will pull this later.
# Please do not change the next statement.
# The annoying long line is intended. Many short lines would be a different test.
send SELECT sleep(2),'BEGIN this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.this is the representative of a very long statement.END' AS "my_monster_statement";
# #
--echo echo
--echo ----- switch to connection default (user = root) ----- # ----- switch to connection con2 (user = test_user) -----
;
connection con2;
echo
# Send a statement to the server, but do not wait till the result
# comes back. We will pull this later.
;
send
SELECT COUNT(*) FROM test.t1;
echo
# ----- switch to connection default (user = root) -----
;
connection default; connection default;
--echo # Sleep some time echo
# The command must be after some time in work by the server. # Poll till INFO is no more NULL and State = 'Locked'.
# There is a short phase with STATE IS NULL followed by a longer phase ;
# with STATE = 'executing'.
# So poll till INFO is no more NULL AND STATE = 'executing'.
let $wait_timeout= 9;
let $wait_condition= SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST let $wait_condition= SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE INFO IS NOT NULL AND STATE = 'executing'; WHERE INFO IS NOT NULL AND STATE = 'Locked';
--source include/wait_condition.inc --source include/wait_condition.inc
# #
# Expect to see that SELECT/SHOW PROCESSLIST can handle my statement monster. # Expect to see the state 'Locked' for the third connection because the SELECT
--replace_column 1 <ID> 5 <COMMAND> 6 <TIME> 7 <STATE> # collides with the WRITE TABLE LOCK.
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
--replace_column 1 <ID> 5 <COMMAND> 6 <TIME> 7 <STATE> UNLOCK TABLES;
SHOW FULL PROCESSLIST; #
# SHOW PROCESSLIST truncates INFO after 100 characters. echo
--replace_column 1 <ID> 5 <COMMAND> 6 <TIME> 7 <STATE> # ----- switch to connection con2 (user = test_user) -----
SHOW PROCESSLIST; ;
--echo connection con2;
--echo ----- switch to connection ddicttestuser1 (user = ddicttestuser1) ----- echo
connection ddicttestuser1; # Pull("reap") the result set from the statement executed with "send".
--echo # Pull("reap") the result set from the monster statement executed with "send". ;
reap; reap;
# Ensure that we see that a connection "hangs" when colliding with a
# WRITE TABLE LOCK echo
# Ensure that SHOW/SELECT processlist can handle extreme long commands
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
--echo ;
--echo ----- switch to connection default (user = root) ----- # We do not want to waste runtime, therefore we run the following test based
# on "Lock collision" and not with some "sleep(10)".
echo
# ----- switch to connection default (user = root) -----
;
connection default; connection default;
LOCK TABLE test.t1 WRITE; LOCK TABLE test.t1 WRITE;
# #
--echo echo
--echo ----- switch to connection ddicttestuser1 (user = ddicttestuser1) ----- # ----- switch to connection con2 (user = test_user) -----
connection ddicttestuser1; ;
--echo # Send a statement to the server, but do not wait till the result connection con2;
--echo # comes back. We will pull this later. echo
send SELECT COUNT(*) FROM test.t1; # Send a long (~20 KB code) statement to the server, but do not wait
# # till the result comes back. We will pull this later.
--echo ;
--echo ----- switch to connection default (user = root) ----- let $string=
`SELECT CONCAT('BEGIN-',
REPEAT('This is the representative of a very long statement.',400),
'-END')`;
let $my_statement =
SELECT count(*),'$string' AS "Long string" FROM test.t1;
send;
eval $my_statement;
echo
# ----- switch to connection default (user = root) -----
;
connection default; connection default;
--echo # Sleep some time echo
# The command must be after some time in work by the server. # Poll till INFO is no more NULL and State = 'Locked'.
# So poll till INFO is no more NULL. ;
let $wait_timeout= 4;
let $wait_condition= SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST let $wait_condition= SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE INFO IS NOT NULL AND STATE = 'Locked'; WHERE INFO IS NOT NULL AND STATE = 'Locked';
--source include/wait_condition.inc --source include/wait_condition.inc
# echo
# Expect to see the state 'Locked' for the second connection because the SELECT # Expect result:
# collides with the WRITE TABLE LOCK. # Statement Content of INFO
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> # SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST Complete statement
# SHOW FULL PROCESSLIST Complete statement
# SHOW PROCESSLIST statement truncated after 100 char
;
--replace_column 1 <ID> 3 <HOST_NAME> 5 <COMMAND> 6 <TIME> 7 <STATE>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> --replace_column 1 <ID> 3 <HOST_NAME> 5 <COMMAND> 6 <TIME> 7 <STATE>
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
--replace_column 1 <ID> 3 <HOST_NAME> 5 <COMMAND> 6 <TIME> 7 <STATE>
SHOW PROCESSLIST;
UNLOCK TABLES; UNLOCK TABLES;
# echo
--echo # ----- switch to connection con2 (user = test_user) -----
--echo ----- switch to connection ddicttestuser1 (user = ddicttestuser1) ----- ;
connection ddicttestuser1; connection con2;
--echo # Pull("reap") the result set from the statement executed with "send". echo
# Pull("reap") the result set from the monster statement executed with "send".
;
reap; reap;
# Cleanup # Cleanup
--echo echo
--echo ----- switch to connection default (user = root) ----- # ----- switch to connection default (user = root) -----
;
connection default; connection default;
--echo echo
--echo ----- close connection ddicttestuser1 ----- ----- disconnect con1 and con2 -----
disconnect ddicttestuser1; ;
DROP USER ddicttestuser1@'localhost'; disconnect con1;
disconnect con2;
DROP USER test_user@'localhost';
DROP TABLE test.t1; DROP TABLE test.t1;
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
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