mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-30 18:36:12 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			158 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			SQL
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			SQL
		
	
	
	
	
	
| # 
 | |
| # REPAIR TABLE statements
 | |
| #
 | |
| # Note: the output is likely to be different for the engine under test,
 | |
| # in which case rdiff will be needed. Or, the output might say that
 | |
| # the storage engine does not support REPAIR.
 | |
| #
 | |
| 
 | |
| --disable_warnings
 | |
| DROP TABLE IF EXISTS t1,t2;
 | |
| --enable_warnings
 | |
| 
 | |
| --source create_table.inc
 | |
| INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b');
 | |
| --let $table_name = t2
 | |
| --source create_table.inc
 | |
| 
 | |
| REPAIR TABLE t1;
 | |
| if ($mysql_errname)
 | |
| {
 | |
|   --source unexpected_result.inc
 | |
| }
 | |
| INSERT INTO t1 (a,b) VALUES (3,'c');
 | |
| INSERT INTO t2 (a,b) VALUES (4,'d');
 | |
| REPAIR NO_WRITE_TO_BINLOG TABLE t1, t2;
 | |
| INSERT INTO t2 (a,b) VALUES (5,'e'),(6,'f');
 | |
| REPAIR LOCAL TABLE t2;
 | |
| INSERT INTO t1 (a,b) VALUES (7,'g'),(8,'h');
 | |
| INSERT INTO t2 (a,b) VALUES (9,'i');
 | |
| REPAIR LOCAL TABLE t2, t1 EXTENDED;
 | |
| INSERT INTO t1 (a,b) VALUES (10,'j');
 | |
| INSERT INTO t2 (a,b) VALUES (11,'k');
 | |
| REPAIR TABLE t1, t2 QUICK USE_FRM;
 | |
| INSERT INTO t1 (a,b) VALUES (12,'l');
 | |
| INSERT INTO t2 (a,b) VALUES (13,'m');
 | |
| REPAIR NO_WRITE_TO_BINLOG TABLE t1, t2 QUICK EXTENDED USE_FRM;
 | |
| FLUSH TABLE t1;
 | |
| 
 | |
| let my_datadir = `SELECT @@datadir`;
 | |
| 
 | |
| # Now we'll override all table files except for frm.
 | |
| # Some engines are more enduring to table files corruption
 | |
| # than others, so the result of the following INSERT and REPAIR
 | |
| # will be different for different engines
 | |
| 
 | |
| --perl
 | |
| @files = glob "$ENV{my_datadir}/test/t1.*";
 | |
| foreach (@files)
 | |
| {
 | |
|   next if /.frm$/;
 | |
|   rename($_,"$_.save");
 | |
|   open(FILE,">$_") || print "Could not open $_\n" && exit;
 | |
|   print FILE "";
 | |
|   close(FILE);
 | |
| }
 | |
| EOF
 | |
| 
 | |
| # We don't worry so much about the INSERT or SELECT result,
 | |
| # it's REPAIR that we are after. 
 | |
| # The preceding INSERT, however, helps to trigger 
 | |
| # a bit more internals
 | |
| --let $error_codes = 0,130,ER_FAILED_READ_FROM_PAR_FILE,ER_OPEN_AS_READONLY
 | |
| INSERT INTO t1 (a,b) VALUES (14,'n');
 | |
| --source check_errors.inc
 | |
| CHECK TABLE t1;
 | |
| --let $error_codes = 0,130,ER_FAILED_READ_FROM_PAR_FILE,ER_OPEN_AS_READONLY
 | |
| SELECT a,b FROM t1;
 | |
| --source check_errors.inc
 | |
| --enable_warnings
 | |
| REPAIR TABLE t1;
 | |
| 
 | |
| --perl
 | |
| @files = glob "$ENV{my_datadir}/test/t1.*.save";
 | |
| foreach (@files)
 | |
| {
 | |
|   $nm = $_;
 | |
|   $nm =~ s/\.save$//;
 | |
|   rename($_,$nm);
 | |
| }
 | |
| EOF
 | |
| 
 | |
| DROP TABLE t1, t2;
 | |
| 
 | |
| --let $continue = 1
 | |
| --source have_default_index.inc
 | |
| 
 | |
| if ($have_default_index)
 | |
| {
 | |
|   call mtr.add_suppression("Got an error from thread_id=.*");
 | |
|   call mtr.add_suppression("MariaDB thread id .*, query id .* localhost.*root Checking table");
 | |
|   call mtr.add_suppression(" '\..test.t1'");
 | |
|   call mtr.add_suppression("Couldn't repair table: test.t1");
 | |
| 
 | |
|   # In 10.2 with log_warnings=2 the error message is printed to the error log
 | |
|   call mtr.add_suppression("Table 't1' is marked as crashed.*");
 | |
| 
 | |
|   --let $create_definition = a $int_indexed_col, b $char_col, $default_index (a)
 | |
|   --source create_table.inc
 | |
|   REPAIR TABLE t1;
 | |
|   INSERT INTO t1 (a,b) VALUES (7,'g'),(8,'h');
 | |
|   REPAIR TABLE t1 EXTENDED;
 | |
|   INSERT INTO t1 (a,b) VALUES (10,'j');
 | |
|   REPAIR TABLE t1 USE_FRM;
 | |
| 
 | |
|   # We will take files one by one (except for frm file),
 | |
|   # save the file, update the table, then restore the file
 | |
|   # and check the table.
 | |
|   # Results here can be very different depending on the engine.
 | |
| 
 | |
|   let $my_errno = 0;
 | |
| 
 | |
|   --list_files $my_datadir/test
 | |
| 
 | |
|   while (!$my_errno)
 | |
|   {
 | |
|     --error 0,2
 | |
|     --perl 
 | |
|     use File::Copy;
 | |
|     @files = glob "$ENV{my_datadir}/test/t1*";
 | |
|     foreach (@files)
 | |
|     {
 | |
|       next if /.(?:frm|save|done)$/;
 | |
|       next if -e "$_.done";
 | |
|       copy($_,"$_.save");
 | |
|       exit 0;
 | |
|     }
 | |
|     # No more files
 | |
|     exit 2;
 | |
|   EOF
 | |
|     let $my_errno = $errno;
 | |
|     if (!$my_errno)
 | |
|     {
 | |
|       --let $error_codes = 0,144
 | |
|       INSERT INTO t1 (a,b) VALUES (14,'n'),(15,'o');
 | |
|       --source check_errors.inc
 | |
|       FLUSH TABLE t1;
 | |
|       --replace_result $my_datadir <DATADIR>
 | |
|       --perl
 | |
|       use File::Copy;
 | |
|       @files = glob "$ENV{my_datadir}/test/t1*.save";
 | |
|       $nm = $files[0]; 
 | |
|       $nm =~ s/\.save$//;
 | |
|       print "Restoring $nm\n";
 | |
|       copy($files[0],"$nm.done");
 | |
|       rename($files[0],$nm);
 | |
|   EOF
 | |
|       CHECK TABLE t1;
 | |
|       --let $error_codes = 0,ER_NOT_KEYFILE,144
 | |
|       SELECT a,b FROM t1;
 | |
|       --source check_errors.inc
 | |
|     }
 | |
|   }
 | |
|   DROP TABLE t1;
 | |
| }
 | |
| 
 | |
| --remove_files_wildcard $my_datadir/test t1*
 | |
| 
 | |
| 
 | 
