
export PGDATA=$HOME/DATA/repro
export PGPORT=5444
export PGDATABASE=postgres

initdb -D $PGDATA
rm -f logfile
pg_ctl -D $PGDATA -o "-c port=$PGPORT" -l logfile -w start

## create the table and insert large number of rows so that we hit the next
## segment
psql -c "CREATE TABLE testtab_toast (a text)"
psql -c "INSERT INTO testtab_toast SELECT (SELECT string_agg('', md5(random()::text)) FROM generate_series(1,1000)) FROM generate_series(1,50000);"
TOASTTABLE=$(psql -tA -c "SELECT 'pg_toast.pg_toast_' || oid FROM pg_class WHERE relname = 'testtab_toast'")
SEGFILE=$(psql -tA -c "SELECT pg_relation_filepath('$TOASTTABLE');")

## and now move the old segment to /tmp, while concurrently inserting more rows
psql -c "INSERT INTO testtab_toast SELECT (SELECT string_agg('', md5(random()::text)) FROM generate_series(1,1000)) FROM generate_series(1,50000);"&
sleep 5
mv $PGDATA/$SEGFILE /tmp
sleep 5

## check if connecting to the database (even non-existent) fails
psql postgres -c "SELECT 1"
psql testdb -c "SELECT 1"

## stop and restart the server
pg_ctl -D $PGDATA stop -w
pg_ctl -D $PGDATA -l logfile start -w

## fail?
psql -c "SELECT a FROM testtab_toast LIMIT 1"

# does REINDEX fix it?
psql -c "REINDEX TABLE $TOASTTABLE"
psql -c "SELECT a FROM testtab_toast LIMIT 1"

# does VACUUM FULL fix it?
psql -c "VACUUM FULL $TOASTTABLE"
psql -c "SELECT a FROM testtab_toast LIMIT 1"

pg_ctl -D $PGDATA stop -w
