mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 10:56:12 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			218 lines
		
	
	
	
		
			7.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
	
		
			7.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| # Test of Recovery of R-tree (table t1) and fulltext (table t2) indices
 | |
| 
 | |
| --source include/not_embedded.inc
 | |
| # Don't test this under valgrind, memory leaks will occur as we crash
 | |
| --source include/not_valgrind.inc
 | |
| # Binary must be compiled with debug for crash to occur
 | |
| --source include/have_debug.inc
 | |
| --source include/have_maria.inc
 | |
| --source include/long_test.inc
 | |
| 
 | |
| set global aria_log_file_size=4294959104;
 | |
| let $MARIA_LOG=.;
 | |
| 
 | |
| --disable_warnings
 | |
| drop database if exists mysqltest;
 | |
| --enable_warnings
 | |
| create database mysqltest;
 | |
| let $mms_tname=t;
 | |
| 
 | |
| # Include scripts can perform SQL. For it to not influence the main test
 | |
| # they use a separate connection. This way if they use a DDL it would
 | |
| # not autocommit in the main test.
 | |
| connect (admin, localhost, root,,mysqltest,,);
 | |
| --enable_reconnect
 | |
| 
 | |
| connection default;
 | |
| use mysqltest;
 | |
| --enable_reconnect
 | |
| 
 | |
| -- source include/maria_empty_logs.inc
 | |
| let $mms_tables=2;
 | |
| 
 | |
| CREATE TABLE t1 (
 | |
|   line POINT NOT NULL,
 | |
|   kind ENUM('po', 'pp', 'rr', 'dr', 'rd', 'ts', 'cl') NOT NULL DEFAULT 'po',
 | |
|   name VARCHAR(32)
 | |
|   ,SPATIAL key (line)
 | |
| ) transactional=1 row_format=page engine=aria;
 | |
| SHOW INDEX FROM t1;
 | |
| CREATE TABLE t2 (a VARCHAR(200), b TEXT, FULLTEXT (a,b)
 | |
| ) transactional=1 row_format=page engine=aria;
 | |
| SHOW INDEX FROM t2;
 | |
| 
 | |
| let $query1=   INSERT INTO t1 (name, kind, line) VALUES 
 | |
|   ("Aadaouane", "pp", GeomFromText("POINT(32.816667 35.983333)")),
 | |
|   ("Aadassiye", "pp", GeomFromText("POINT(35.816667 36.216667)")),
 | |
|   ("Aadbel", "pp", GeomFromText("POINT(34.533333 36.100000)")),
 | |
|   ("Aadchit", "pp", GeomFromText("POINT(33.347222 35.423611)")),
 | |
|   ("Aadchite", "pp", GeomFromText("POINT(33.347222 35.423611)")),
 | |
|   ("Aadchit el Qoussair", "pp", GeomFromText("POINT(33.283333 35.483333)")),
 | |
|   ("Aaddaye", "pp", GeomFromText("POINT(36.716667 40.833333)")),
 | |
|   ("'Aadeissa", "pp", GeomFromText("POINT(32.823889 35.698889)")),
 | |
|   ("Aaderup", "pp", GeomFromText("POINT(55.216667 11.766667)")),
 | |
|   ("Qalaat Aades", "pp", GeomFromText("POINT(33.503333 35.377500)")),
 | |
|   ("A ad'ino", "pp", GeomFromText("POINT(54.812222 38.209167)")),
 | |
|   ("Aadi Noia", "pp", GeomFromText("POINT(13.800000 39.833333)")),
 | |
|   ("Aad La Macta", "pp", GeomFromText("POINT(35.779444 -0.129167)")),
 | |
|   ("Aadland", "pp", GeomFromText("POINT(60.366667 5.483333)")),
 | |
|   ("Aadliye", "pp", GeomFromText("POINT(33.366667 36.333333)")),
 | |
|   ("Aadloun", "pp", GeomFromText("POINT(33.403889 35.273889)")),
 | |
|   ("Aadma", "pp", GeomFromText("POINT(58.798333 22.663889)")),
 | |
|   ("Aadma Asundus", "pp", GeomFromText("POINT(58.798333 22.663889)")),
 | |
|   ("Aadmoun", "pp", GeomFromText("POINT(34.150000 35.650000)")),
 | |
|   ("Aadneram", "pp", GeomFromText("POINT(59.016667 6.933333)")),
 | |
|   ("Aadneskaar", "pp", GeomFromText("POINT(58.083333 6.983333)")),
 | |
|   ("Aadorf", "pp", GeomFromText("POINT(47.483333 8.900000)")),
 | |
|   ("Aadorp", "pp", GeomFromText("POINT(52.366667 6.633333)")),
 | |
|   ("Aadouane", "pp", GeomFromText("POINT(32.816667 35.983333)")),
 | |
|   ("Aadoui", "pp", GeomFromText("POINT(34.450000 35.983333)")),
 | |
|   ("Aadouiye", "pp", GeomFromText("POINT(34.583333 36.183333)")),
 | |
|   ("Aadouss", "pp", GeomFromText("POINT(33.512500 35.601389)")),
 | |
|   ("Aadra", "pp", GeomFromText("POINT(33.616667 36.500000)")),
 | |
|   ("Aadzi", "pp", GeomFromText("POINT(38.100000 64.850000)"));
 | |
| 
 | |
| let $query2= INSERT INTO t2 VALUES
 | |
|  ('MySQL has now support', 'for full-text search'),
 | |
|  ('Full-text indexes', 'are called collections'),
 | |
|  ('Only MyISAM tables','support collections'),
 | |
|  ('Function MATCH ... AGAINST()','is used to do a search'),
 | |
|  ('Full-text search in MySQL', 'implements vector space model'),
 | |
|  ('We want to see', 'if this is recoverable'),
 | |
|  ('Or rather leaves a bad corrupted table', 'after a crash'),
 | |
|  ('Test of REDOs', 'and then UNDOs'),
 | |
|  ('Recovery is interesting', 'but sometimes complicated'),
 | |
|  ('But what if it was simple', 'and boring?'),
 | |
|  ('I wish I knew more', 'about how fulltext works'),
 | |
|  ('Maybe I should read about it', 'on the Internet');
 | |
| 
 | |
| --echo * TEST of REDO: see if recovery can reconstruct if we give it an old table
 | |
| 
 | |
| -- source include/maria_make_snapshot_for_feeding_recovery.inc
 | |
| 
 | |
| --disable_query_log
 | |
| let $1=120; # 8 is smallest value to cause root split; 12 for child split
 | |
| while($1)
 | |
| {
 | |
|   eval $query1;
 | |
|   eval $query2;
 | |
|   dec $1;
 | |
| }
 | |
| let $1=120;
 | |
| while($1)
 | |
| {
 | |
|   delete from t1 limit 1;
 | |
|   delete from t1 limit 10;
 | |
|   delete from t1 limit 7;
 | |
|   delete from t1 limit 2;
 | |
|   delete from t2 limit 6;
 | |
|   dec $1;
 | |
| }
 | |
| --enable_query_log
 | |
| -- source include/maria_make_snapshot_for_comparison.inc
 | |
| # we want recovery to run on the first snapshot made above
 | |
| let $mvr_restore_old_snapshot=1;
 | |
| let $mms_compare_physically=0;
 | |
| let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash";
 | |
| let $mvr_crash_statement= set global aria_checkpoint_interval=1;
 | |
| # the script below will trigger recovery and compare checksums
 | |
| -- source include/maria_verify_recovery.inc
 | |
| 
 | |
| # Test of REDO + UNDO
 | |
| --echo * TEST of INSERT and DELETE's rollback
 | |
| 
 | |
| # different types of crash => a loop; here are loop control variables
 | |
| let $crash_no_flush=1;
 | |
| let $crash_flush_whole_page_cache=0;
 | |
| let $crash_flush_states=0;
 | |
| let $crash_flush_whole_log=0;
 | |
| let $crash_loop=1;
 | |
| 
 | |
| # we want recovery to use the tables as they were at time of crash
 | |
| let $mvr_restore_old_snapshot=0;
 | |
| # UNDO phase prevents physical comparison, normally,
 | |
| # so we'll only use checksums to compare.
 | |
| let $mms_compare_physically=0;
 | |
| let $mvr_crash_statement= set global aria_checkpoint_interval=1;
 | |
| 
 | |
| # Note that we don't remove logs between iterations. Test is
 | |
| # cumulative (each new recovery processes more log records than the previous).
 | |
| 
 | |
| while ($crash_loop)
 | |
| {
 | |
|   if ($crash_flush_whole_log)
 | |
|   {
 | |
|      let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash";
 | |
|      # set up what next iteration should do:
 | |
|      let $crash_flush_whole_log=0;
 | |
|      let $crash_loop=0;
 | |
|   }
 | |
|   if ($crash_flush_states)
 | |
|   {
 | |
|      let $mvr_debug_option="+d,maria_flush_states,maria_flush_whole_log,maria_crash";
 | |
|      let $crash_flush_states=0;
 | |
|      let $crash_flush_whole_log=1;
 | |
|   }
 | |
|   if ($crash_flush_whole_page_cache)
 | |
|   {
 | |
|      let $mvr_debug_option="+d,maria_flush_whole_page_cache,maria_crash";
 | |
|      let $crash_flush_whole_page_cache=0;
 | |
|      let $crash_flush_states=1;
 | |
|   }
 | |
|   if ($crash_no_flush)
 | |
|   {
 | |
|      let $mvr_debug_option="+d,maria_crash";
 | |
|      let $crash_no_flush=0;
 | |
|      let $crash_flush_whole_page_cache=1;
 | |
|   }
 | |
|   # Your committed statements here
 | |
|   -- source include/maria_make_snapshot_for_comparison.inc
 | |
|   # Your statements which we expect to be rolled back
 | |
|   lock tables t1 write, t2 write;
 | |
| 
 | |
|   --disable_query_log
 | |
|   let $1=120;
 | |
|   while($1)
 | |
|   {
 | |
|     eval $query1;
 | |
|     eval $query2;
 | |
|     dec $1;
 | |
|   }
 | |
|   let $1=120;
 | |
|   while($1)
 | |
|   {
 | |
|     delete from t1 limit 1;
 | |
|     delete from t1 limit 10;
 | |
|     delete from t1 limit 7;
 | |
|     delete from t1 limit 2;
 | |
|     delete from t2 limit 6;
 | |
|     dec $1;
 | |
|   }
 | |
|   --enable_query_log
 | |
| 
 | |
|   -- source include/maria_verify_recovery.inc
 | |
| }
 | |
| 
 | |
| # Finally check when we make the table empty
 | |
| # This is currently hitting BUG#36319 so is disabled
 | |
| 
 | |
| if (0)
 | |
| {
 | |
| -- source include/maria_make_snapshot_for_comparison.inc
 | |
| lock tables t1 write, t2 write;
 | |
| select count(*) from t1;
 | |
| delete from t1;
 | |
| select count(*) from t1;
 | |
| select count(*) from t2;
 | |
| delete from t2;
 | |
| select count(*) from t2;
 | |
| }
 | |
| 
 | |
| -- source include/maria_verify_recovery.inc
 | |
| 
 | |
| # clean up everything
 | |
| let $mms_purpose=feeding_recovery;
 | |
| eval drop database mysqltest_for_$mms_purpose;
 | |
| let $mms_purpose=comparison;
 | |
| eval drop database mysqltest_for_$mms_purpose;
 | |
| drop database mysqltest;
 | 
