#!/bin/bash

INSTALL=.
PGDATA=./pgdata

set -e

rm -fr $PGDATA

$INSTALL/bin/initdb -D $PGDATA
cat << EOF >> $PGDATA/postgresql.conf
  max_prepared_transactions = 2
EOF

# Wrangle our next multixid offset all the way back to 0 (actually it 
# starts out that way, but initdb creates a 0000 file; if you 
# wrap all the way around to FirstMultiXactId and vacuum there is no 0000 file, 
# which is the state we want to break stuff).

$INSTALL/bin/pg_resetxlog -O $((2 ** 30)) $PGDATA
$INSTALL/bin/pg_ctl -D $PGDATA -w start
$INSTALL/bin/psql postgres -c 'UPDATE pg_database SET datallowconn = true'
$INSTALL/bin/vacuumdb --freeze --all
$INSTALL/bin/pg_ctl -D $PGDATA -w stop

$INSTALL/bin/pg_resetxlog -O $((2 ** 30 * 2)) $PGDATA
$INSTALL/bin/pg_ctl -D $PGDATA -w start
$INSTALL/bin/vacuumdb --freeze --all
$INSTALL/bin/pg_ctl -D $PGDATA -w stop

$INSTALL/bin/pg_resetxlog -O $((2 ** 30 * 3)) $PGDATA
$INSTALL/bin/pg_ctl -D $PGDATA -w start
$INSTALL/bin/vacuumdb --freeze --all
$INSTALL/bin/pg_ctl -D $PGDATA -w stop

$INSTALL/bin/pg_resetxlog -O $((2 ** 32 - 2 ** 16)) $PGDATA
$INSTALL/bin/pg_ctl -D $PGDATA -w start
$INSTALL/bin/vacuumdb --freeze --all
$INSTALL/bin/pg_ctl -D $PGDATA -w stop

$INSTALL/bin/pg_ctl -D $PGDATA -w start
$INSTALL/bin/psql postgres << EOF
  CREATE TABLE foo AS SELECT 42 AS id;
  BEGIN;
  SELECT * FROM foo FOR SHARE;
  PREPARE TRANSACTION 'tx1';
EOF

( for ((i = 0; i < 32767; i++)) ; do echo "SELECT * FROM foo FOR SHARE;" ; done ) | $INSTALL/bin/psql postgres > /dev/null
#$INSTALL/bin/psql postgres -c "BEGIN; SELECT * FROM foo FOR SHARE; PREPARE TRANSACTION 'tx2';"
$INSTALL/bin/psql postgres -c "SELECT * FROM foo FOR SHARE"
$INSTALL/bin/psql postgres -c "COMMIT PREPARED 'tx1'"
#$INSTALL/bin/psql postgres -c "COMMIT PREPARED 'tx2'"

$INSTALL/bin/vacuumdb --freeze --all
$INSTALL/bin/psql postgres -c 'CHECKPOINT'

$INSTALL/bin/pg_ctl -D $PGDATA -w stop

