#!/bin/sh

#
# Usage:
# $ sh test_vacuum_skip_with_large_vm.sh <table_name>
#
# Note that this script requires pg_visibility.

if [ "$#" -ne 1 ]; then
    echo "Invalid argument."
    exit
fi

relname=$1

# Make a target relation and a visibility map page. The visibility map page
# is exactly one page and is filled with all_visible and all_frozen bit for all pages.
cat <<EOF | psql -d postgres -X
create extension if not exists pg_visibility;
create table $relname as select generate_series(1, 32672 * 226);
vacuum freeze $relname;
checkpoint;
select pg_visibility_map_summary('$relname'); -- both all-visible and all-frozen should be 32672.
EOF

# Get visibiltiy map file path and relfilenode.
vmfile_path=${PGDATA}/`psql -d postgres -X -Atqc "select pg_relation_filepath('$relname') || '_vm';"`
relfilenode=`psql -d postgres -X -Atqc "select relfilenode from pg_class where relname = '$relname'"`
echo $vmfile_path $relfilenode

# stop server
pg_ctl stop

# Make fake vm files on current directly.
for i in `seq 1 4109`; do cat ${vmfile_path} >> ./${relfilenode}_vm_1TB; done
for i in `seq 1 32865`; do cat ${vmfile_path} >> ./${relfilenode}_vm_8TB; done
for i in `seq 1 131072`; do cat ${vmfile_path} >> ./${relfilenode}_vm_32TB; done
for i in `seq 1 386`; do cat ${vmfile_path} >> ./${relfilenode}_vm_32TB.1; done

# test for 1TB
cp ./${relfilenode}_vm_1TB ${vmfile_path}
pg_ctl start -w 
cat <<EOF | psql -d postgres
set cheat_vacuum_table_size = 32; -- 32TB / 32 = 1TB
vacuum (freeze, verbose) $relname;
EOF
pg_ctl stop -w

# test for 8TB
cp ./${relfilenode}_vm_8TB ${vmfile_path}
pg_ctl start -w
cat <<EOF | psql -d postgres
set cheat_vacuum_table_size = 4; -- 32TB / 4 = 8TB
vacuum (freeze, verbose) $relname;
EOF
pg_ctl stop -w

# test for 32TB
cp ${relfilenode}_vm_32TB ${vmfile_path}
cp ${relfilenode}_vm_32TB.1 ${vmfile_path}.1
pg_ctl start -w
cat <<EOF | psql -d postgres
set cheat_vacuum_table_size = 1; -- 32TB / 1 = 32TB
vacuum (freeze, verbose) $relname;
EOF
