278 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			278 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
| ######## include/ddl1.inc ######
 | |
| #
 | |
| # Purpose of include/ddl1.inc - include/ddl8.inc:
 | |
| #
 | |
| #    Stress storage engines with rapid CREATE/DROP TABLE/INDEX
 | |
| #    and following SELECT/INSERT/SHOW etc.
 | |
| #
 | |
| # The variables
 | |
| #     $loop_size -- number of rounds till we look at the clock again
 | |
| #     $runtime   -- rough intended runtime per subtest variant
 | |
| #                Real runtime without server restarts and comparison is:
 | |
| #                   -   >= $runtime
 | |
| #                   -   > runtime needed for $loop_size execution loops
 | |
| #     $engine_type -- storage engine to be used in CREATE TABLE
 | |
| # must be set within the routine sourcing this script.
 | |
| #
 | |
| # Other stuff which must already exist:
 | |
| # - connection con2
 | |
| # - stmt_start and stmt_break prepared by the default connection
 | |
| #
 | |
| # Attention:
 | |
| #    The test does suppress the writing of most statements, server error
 | |
| #    messages and result sets.
 | |
| #    This is needed because their number is usual not deterministic.
 | |
| #    The test is partially self checking. That means is prints some
 | |
| #    helpful hints into the protocol and aborts if something is wrong.
 | |
| #
 | |
| # Creation of this test:
 | |
| # 2007-07-04 mleich
 | |
| #
 | |
| ############################################################################
 | |
| #
 | |
| # Some details:
 | |
| #
 | |
| # 1. Base question of the test:
 | |
| #       There was just a create or drop of some object (TABLE/INDEX).
 | |
| #
 | |
| #       Could it happen that the next statement referring to this
 | |
| #       object gets a somehow wrong server response (result set,
 | |
| #       error message, warning) because the creation or removal of
 | |
| #       the object is in an incomplete state?
 | |
| #
 | |
| #       Thinkable reasons for incomplete state of creation or removal:
 | |
| #       The server performs the creation or removal
 | |
| #       - all time incomplete.
 | |
| #         Example:
 | |
| #            Bug#28309 First insert violates unique constraint
 | |
| #                      - was "memory" table empty ?
 | |
| #       - asynchronous
 | |
| #         In that case the next statement has probably to wait till
 | |
| #         completion.
 | |
| #
 | |
| # 2. Why do we use in some scripts "--error 0,<expected error>" followed
 | |
| #    a check of $mysql_errno?
 | |
| #
 | |
| #    System reactions when running with "--error 0,<expected error>":
 | |
| #    - RC=0 --> no error message
 | |
| #    - RC=<expected error> --> no error message
 | |
| #    - RC not in (0,<expected error>) --> error message + abort of script
 | |
| #                                         execution
 | |
| #
 | |
| #    Requirements and tricky solution for statements which are expected
 | |
| #    to fail:
 | |
| #    1. RC=<expected error>
 | |
| #       - no abort of script execution
 | |
| #         --> add "--error <expected error>"
 | |
| #       - no error message into the protocol, because the number of
 | |
| #         executions is NOT deterministic
 | |
| #         --> use "--error 0,<expected error>"
 | |
| #    2. RC=0 = failure
 | |
| #       - abort of script execution
 | |
| #       "--error 0,<expected error>" prevents the automatic abort of
 | |
| #       execution. Therefore we do not need to code the abort.
 | |
| #       --> Check $mysql_errno and do an explicit abort if $mysql_errno = 0.
 | |
| #    3. RC not in (0,<expected error>)
 | |
| #       - abort of script execution
 | |
| #       "--error 0,<expected error>" causes an automatic abort.
 | |
| #
 | |
| # 3. We do not check the correctness of the SHOW CREATE TABLE output
 | |
| #    in detail. This must be done within other tests.
 | |
| #    We only check here that
 | |
| #    - same CREATE TABLE/INDEX statements lead to the same
 | |
| #    - different CREATE TABLE/INDEX statements lead to different
 | |
| #    SHOW CREATE TABLE output
 | |
| #    (Applies to ddl4.inc. and ddl8.inc.)
 | |
| #
 | |
| # 4. It could be assumed that running this test with
 | |
| #    - PS-PROTOCOL
 | |
| #      There are already subtests using prepared statements contained.
 | |
| #    - SP/CURSOR/VIEW-PROTOCOL
 | |
| #      These protocol variants transform SELECTs to hopefully much
 | |
| #      stressing statement sequencies using SP/CURSOR/VIEW.
 | |
| #      The SELECTs within include/ddl*.inc are very simple.
 | |
| #    does not increase the coverage.
 | |
| #    Therefore we skip runs with these protocols.
 | |
| #
 | |
| # 5. The test consumes significant runtime when running on a non RAM
 | |
| #    based filesystem (run without "--mem").
 | |
| #    Therefore we adjust $runtime and $loop_size depending on "--big-test"
 | |
| #    option.
 | |
| #    $runtime and $loop_size do not influence the expected results.
 | |
| #    Rough runtime in seconds reported by mysql-test-run.pl:
 | |
| #        (engine_type = MEMORY)
 | |
| #    option set    -> $runtime $loop_size  real runtime in seconds
 | |
| #                         1        20             68
 | |
| #    --mem                1        20             32
 | |
| #          --big-test     5       100            200
 | |
| #    --mem --big-test     5       100            400
 | |
| #    I assume that runs with slow filesystems are as much valuable
 | |
| #    as runs with extreme fast filesystems.
 | |
| #
 | |
| # 6. Hints for analysis of test failures:
 | |
| #    1. Look into the protocol and check in which ddl*.inc
 | |
| #       script the difference to the expected result occured.
 | |
| #    2. Comment the sourcing of all other ddl*.inc scripts
 | |
| #       out.
 | |
| #    3. Edit the ddl*.inc script where the error occured and
 | |
| #       remove all
 | |
| #       - "--disable_query_log", "--disable_result_log"
 | |
| #       - successful passed subtests.
 | |
| #    4. Alternative:
 | |
| #       Have a look into VARDIR/master-data/mysql/general_log.CSV
 | |
| #       and construct a new testcase from that.
 | |
| #    5. If the problem is not deterministic, please try the following
 | |
| #       - increase $runtime (important), $loop_size (most probably
 | |
| #         less important) within the "t/ddl_<engine>.test" and
 | |
| #         maybe the "--testcase-timeout" assigned to mysqltest-run.pl
 | |
| #       - vary the I/O performance of the testing machine by using
 | |
| #         a RAM or disk based filesystem for VARDIR
 | |
| #
 | |
| 
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| # Settings for Subtest 1 variants
 | |
| # Scenario: CREATE with UNIQUE KEY/INSERT/DROP TABLE like in Bug#28309
 | |
| let $create_table= CREATE TABLE t1 (f1 BIGINT,f2 BIGINT,UNIQUE(f1),UNIQUE(f2))
 | |
| ENGINE = $engine_type;
 | |
| let $insert_into=  INSERT INTO t1 VALUES (1,1), (2,2), (3,3);
 | |
| let $drop_table=   DROP TABLE t1;
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| #
 | |
| --echo # Subtest 1A (one connection, no PREPARE/EXECUTE)
 | |
| --echo #    connection  action
 | |
| --echo #    default:    $create_table
 | |
| --echo #    default:    $insert_into
 | |
| --echo #    default:    $drop_table
 | |
| --disable_query_log
 | |
| connection default;
 | |
| let $run= 1;
 | |
| # Determine the current time.
 | |
| EXECUTE stmt_start;
 | |
| # Run execution loops till the planned runtime is reached
 | |
| while ($run)
 | |
| {
 | |
|    let $loop_run= $loop_size;
 | |
|    while ($loop_run)
 | |
|    {
 | |
|       eval $create_table;
 | |
|       eval $insert_into;
 | |
|       eval $drop_table;
 | |
|       dec $loop_run;
 | |
|    }
 | |
|    if (`EXECUTE stmt_break`)
 | |
|    {
 | |
|       let $run= 0;
 | |
|    }
 | |
| }
 | |
| --enable_query_log
 | |
| #
 | |
| --echo # Subtest 1B (one connection, use PREPARE/EXECUTE)
 | |
| --echo #    connection  action
 | |
| --echo #    default:    $create_table
 | |
| --echo #    default:    $insert_into
 | |
| --echo #    default:    $drop_table
 | |
| --disable_query_log
 | |
| connection default;
 | |
| eval PREPARE create_table FROM "$create_table";
 | |
| EXECUTE create_table;
 | |
| eval PREPARE insert_into FROM "$insert_into";
 | |
| eval PREPARE drop_table FROM "$drop_table";
 | |
| EXECUTE drop_table;
 | |
| let $run= 1;
 | |
| # Determine the current time.
 | |
| EXECUTE stmt_start;
 | |
| # Run execution loops till the planned runtime is reached
 | |
| while ($run)
 | |
| {
 | |
|    let $loop_run= $loop_size;
 | |
|    while ($loop_run)
 | |
|    {
 | |
|       EXECUTE create_table;
 | |
|       EXECUTE insert_into;
 | |
|       EXECUTE drop_table;
 | |
|       dec $loop_run;
 | |
|    }
 | |
|    if (`EXECUTE stmt_break`)
 | |
|    {
 | |
|       let $run= 0;
 | |
|    }
 | |
| }
 | |
| DEALLOCATE PREPARE create_table;
 | |
| DEALLOCATE PREPARE insert_into;
 | |
| DEALLOCATE PREPARE drop_table;
 | |
| --enable_query_log
 | |
| #
 | |
| --echo # Subtest 1C (two connections, no PREPARE/EXECUTE)
 | |
| --echo #    connection  action
 | |
| --echo #    default:    $create_table
 | |
| --echo #    con2:       $insert_into
 | |
| --echo #    con2:       $drop_table
 | |
| --disable_query_log
 | |
| connection default;
 | |
| let $run= 1;
 | |
| # Determine the current time.
 | |
| EXECUTE stmt_start;
 | |
| # Run execution loops till the planned runtime is reached
 | |
| while ($run)
 | |
| {
 | |
|    let $loop_run= $loop_size;
 | |
|    while ($loop_run)
 | |
|    {
 | |
|       eval $create_table;
 | |
|       connection con2;
 | |
|       eval $insert_into;
 | |
|       eval $drop_table;
 | |
|       connection default;
 | |
|       dec $loop_run;
 | |
|    }
 | |
|    if (`EXECUTE stmt_break`)
 | |
|    {
 | |
|       let $run= 0;
 | |
|    }
 | |
| }
 | |
| --enable_query_log
 | |
| #
 | |
| --echo # Subtest 1D (two connections, use PREPARE/EXECUTE)
 | |
| --echo #    connection  action
 | |
| --echo #    default:    $create_table
 | |
| --echo #    con2:       $insert_into
 | |
| --echo #    con2:       $drop_table
 | |
| --disable_query_log
 | |
| connection default;
 | |
| eval PREPARE create_table FROM "$create_table";
 | |
| EXECUTE create_table;
 | |
| connection con2;
 | |
| eval PREPARE insert_into FROM "$insert_into";
 | |
| eval PREPARE drop_table FROM "$drop_table";
 | |
| EXECUTE drop_table;
 | |
| connection default;
 | |
| let $run= 1;
 | |
| # Determine the current time.
 | |
| EXECUTE stmt_start;
 | |
| # Run execution loops till the planned runtime is reached
 | |
| while ($run)
 | |
| {
 | |
|    let $loop_run= $loop_size;
 | |
|    while ($loop_run)
 | |
|    {
 | |
|       EXECUTE create_table;
 | |
|       connection con2;
 | |
|       EXECUTE insert_into;
 | |
|       EXECUTE drop_table;
 | |
|       connection default;
 | |
|       dec $loop_run;
 | |
|    }
 | |
|    if (`EXECUTE stmt_break`)
 | |
|    {
 | |
|       let $run= 0;
 | |
|    }
 | |
| }
 | |
| DEALLOCATE PREPARE create_table;
 | |
| connection con2;
 | |
| DEALLOCATE PREPARE insert_into;
 | |
| DEALLOCATE PREPARE drop_table;
 | |
| connection default;
 | |
| --enable_query_log
 |