# 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

set global maria_log_file_size=4294967295;
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 LINESTRING 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=maria;
SHOW INDEX FROM t1;
CREATE TABLE t2 (a VARCHAR(200), b TEXT, FULLTEXT (a,b)
) transactional=1 row_format=page engine=maria;
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 maria_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 maria_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;
