mysql-test/include/show_query_digest.inc (114 lines of code) (raw):

# Verify SHOW PROCESS LIST AND SHOW ENGINE STATUS under show_query_digest # # Parameters: # $engine - INNODB or ROCKSDB # --source include/have_debug.inc # # SHOW PROCESSLIST with show_query_digest=1 with SQL_STATS_CONTROL # SET @sql_stats_control_save = @@SQL_STATS_CONTROL; SET GLOBAL SQL_STATS_CONTROL='on'; # Need to specify engine explicitly otherwise in InnoDB default engine is MyIASM --eval CREATE TABLE t1 (pk int primary key, a int, b int, c int) ENGINE=$engine; SHOW CREATE TABLE t1; INSERT INTO t1 values (1, 1, 1, 1), (2, 2, 2, 2), (3, 3, 3, 3); # Deadlock some queries before we set show_query_digest if ($engine == INNODB) { SELECT @@show_query_digest; --connect (con1, localhost, root,,) BEGIN; SELECT 1+1, "abc", a, b, c FROM t1 WHERE PK = 1 FOR UPDATE; --connect (con2, localhost, root,,) BEGIN; SELECT 1+1, "abc", a, b, c FROM t1 WHERE PK = 2 FOR UPDATE; --connection con1 SET DEBUG_SYNC = 'lock_wait_will_wait SIGNAL con1_will_wait'; --send SELECT 1+1, "abc", a, b, c FROM t1 WHERE PK = 2 FOR UPDATE --connection con2 SET DEBUG_SYNC = 'now WAIT_FOR con1_will_wait'; --error ER_LOCK_DEADLOCK SELECT 1+1, "abc", a, b, c FROM t1 WHERE PK = 1 FOR UPDATE; ROLLBACK; --connection con1 --reap --disconnect con1 --disconnect con2 connection default; SET @show_query_digest_save = @@show_query_digest; SET show_query_digest=1; # Verify we are showing query digest for deadlock cases --output $MYSQL_TMP_DIR/show_transaction_deadlock_status --eval SHOW ENGINE $engine TRANSACTION STATUS; --exec grep "SELECT ? + ?, ... , \`a\` , \`b\` , \`c\` FROM \`t1\` WHERE \`PK\` = ? FOR UPDATE" $MYSQL_TMP_DIR/show_transaction_deadlock_status --echo Search for skipped records --exec grep "record skipped" $MYSQL_TMP_DIR/show_transaction_deadlock_status SET show_query_digest=@show_query_digest_save; } SET @show_query_digest_save = @@show_query_digest; SET show_query_digest=1; # Regular non-deadlock cases START TRANSACTION; SELECT * FROM t1 WHERE pk=3 FOR UPDATE; --connect (con1,localhost,root,,) --connection con1 START TRANSACTION; SELECT * FROM t1 WHERE pk=1; --send SELECT 1+2, "abc", a, b, c FROM t1 WHERE PK = 3 FOR UPDATE; --connection default let $wait_timeout= 10; let $wait_condition= SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Waiting for row lock' OR STATE LIKE 'statistics' AND ID != CONNECTION_ID(); --source include/wait_condition.inc --replace_column 1 ### 3 ### 6 ### 9 ### 10 ### 11 ### 12 ### --replace_result 'Query attributes' 'Query' --sorted_result SHOW PROCESSLIST; SELECT STATE, INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID != CONNECTION_ID(); --echo Searching for digest query in SHOW ENGINE $engine TRANSACTION STATUS; #--replace_regex /[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} [0-9a-f]+/TIMESTAMP TID/ /0x[a-f0-9]+/PTR/ /[0-9]+/#/ --output $MYSQL_TMP_DIR/show_transaction_status --eval SHOW ENGINE $engine TRANSACTION STATUS; --exec grep "SELECT ? + ?, ... , \`a\` , \`b\` , \`c\` FROM \`t1\` WHERE \`PK\` = ? FOR UPDATE" $MYSQL_TMP_DIR/show_transaction_status if ($engine == INNODB) { --echo Search for skipped records --exec grep "record skipped" $MYSQL_TMP_DIR/show_transaction_status } COMMIT; --connection con1 --reap --disconnect con1 --source include/wait_until_disconnected.inc --connection default SET show_query_digest=@show_query_digest_save; SET GLOBAL SQL_STATS_CONTROL=@sql_stats_control_save; # # SHOW PROCESSLIST with show_query_digest=1 without SQL_STATS_CONTROL # SET @sql_stats_control_save = @@SQL_STATS_CONTROL; SET GLOBAL SQL_STATS_CONTROL='off_hard'; SET @show_query_digest_save = @@show_query_digest; SET show_query_digest=1; START TRANSACTION; SELECT * FROM t1 WHERE pk=3 FOR UPDATE; --connect (con1,localhost,root,,) --connection con1 START TRANSACTION; SELECT * FROM t1 WHERE pk=1; --send SELECT 1+2, "abc", a, b, c FROM t1 WHERE PK = 3 FOR UPDATE; --connection default let $wait_timeout= 10; let $wait_condition= SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Waiting for row lock' OR STATE LIKE 'statistics' AND ID != CONNECTION_ID(); --source include/wait_condition.inc --replace_column 1 ### 3 ### 6 ### 9 ### 10 ### 11 ### 12 ### --replace_result 'Query attributes' 'Query' --sorted_result SHOW PROCESSLIST; SELECT STATE, INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID != CONNECTION_ID(); --echo Searching for digest query in SHOW ENGINE $engine TRANSACTION STATUS; #--replace_regex /[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} [0-9a-f]+/TIMESTAMP TID/ /0x[a-f0-9]+/PTR/ /[0-9]+/#/ --output $MYSQL_TMP_DIR/show_transaction_status --eval SHOW ENGINE $engine TRANSACTION STATUS; --exec grep "digest_missing: sql_stats_control required" $MYSQL_TMP_DIR/show_transaction_status if ($engine == INNODB) { --echo Search for skipped records --exec grep "record skipped" $MYSQL_TMP_DIR/show_transaction_status } COMMIT; --connection con1 --reap --disconnect con1 --source include/wait_until_disconnected.inc --connection default DROP TABLE t1; SET show_query_digest=@show_query_digest_save; SET GLOBAL SQL_STATS_CONTROL=@sql_stats_control_save;