-- source include/have_innodb.inc
-- source include/not_embedded.inc

let $MYSQLD_DATADIR=`select @@datadir`;
let INNODB_PAGE_SIZE= `select @@innodb_page_size`;

create table snapshot_status engine = myisam
select * from performance_schema.global_status
where variable_name like 'innodb_scrub_background%';

let $rowcount=500;
let $maxformatno= 4;
let $formatno= $maxformatno;

--echo # FIXME: Add index(b) to each table; ensure that undo logs are scrubbed.
--echo # see MDEV-8139 for details
let $tableformat= (
  a int auto_increment primary key,
  b varchar(256),
  c text) engine = innodb row_format;

while ($formatno)
{
dec $formatno;
let $format = `select case $formatno
               when 0 then 'dynamic'
               when 1 then 'redundant'
               when 2 then 'compact'
	       when 3 then 'compressed'
               end`;

let $t= delete_$formatno;
eval create table $t $tableformat=$format;

let $numinserts = $rowcount;
--disable_query_log
begin;
while ($numinserts)
{
  dec $numinserts;
  eval insert into $t(b,c) values ('repairman', repeat('unicycle', 1000));
}
commit;
--enable_query_log

eval delete from $t;

let $t= delete_rollback_delete_$formatno;
eval create table $t $tableformat=$format;

let $numinserts = $rowcount;
--disable_query_log
begin;
while ($numinserts)
{
  dec $numinserts;
  eval insert into $t(b,c) values ('breakhuman', repeat('bicycle', 1000));
}
commit;
--enable_query_log

begin;
eval delete from $t;
rollback;
eval delete from $t;

let $t= insert_rollback_$formatno;

eval create table $t $tableformat=$format;

let $numinserts = $rowcount;
begin;
--disable_query_log
while ($numinserts)
{
  dec $numinserts;
  eval insert into $t(b,c) values ('wonderwoman', repeat('tricycle', 1000));
}
--enable_query_log

rollback;
}

SET GLOBAL innodb_fast_shutdown=0;
-- source include/shutdown_mysqld.inc

let ABORT_ON=FOUND;
let SEARCH_PATTERN= (un|b|tr)icycle|(repair|breakhu|wonderwo)man;
let SEARCH_RANGE= 12582912;
let SEARCH_FILE= $MYSQLD_DATADIR/ibdata1;

# We may randomly find copies of unscrubbed pages in the doublewrite buffer.
# Let us scrub the doublewrite buffer ourselves.
perl;
use Fcntl 'SEEK_SET';
my $page_size = $ENV{INNODB_PAGE_SIZE};
open(FILE, "+<", "$ENV{SEARCH_FILE}") or die "cannot open: $!\n";
seek(FILE, $page_size * 64, SEEK_SET) or die "cannot seek: $!\n";
print(FILE chr(0) x ($page_size * 128)) or die "cannot write: $!\n";
close FILE or die "cannot close: $!\n";;
EOF

-- source include/search_pattern_in_file.inc

let $formatno= $maxformatno;
while ($formatno)
{
dec $formatno;

let $t= delete_$formatno.ibd;
let SEARCH_FILE= $MYSQLD_DATADIR/test/$t;
-- echo # $t
-- source include/search_pattern_in_file.inc
let $t= delete_rollback_delete_$formatno.ibd;
let SEARCH_FILE= $MYSQLD_DATADIR/test/$t;
-- echo # $t
-- source include/search_pattern_in_file.inc
let $t= insert_rollback_$formatno.ibd;
let SEARCH_FILE= $MYSQLD_DATADIR/test/$t;
-- echo # $t
-- source include/search_pattern_in_file.inc
}

-- source include/start_mysqld.inc

let $formatno= $maxformatno;
while ($formatno)
{
dec $formatno;

let $t= delete_$formatno, delete_rollback_delete_$formatno, insert_rollback_$formatno;

eval check table $t;
eval drop table $t;
}

show variables like 'innodb_%scrub_data%';

--echo # verify that this test have not caused any background scrubbing
--sorted_result
select ss.variable_name, gs.variable_value - ss.variable_value as variable_value
from snapshot_status ss,
     information_schema.global_status gs
where ss.variable_name = gs.variable_name;

drop table snapshot_status;
