#!/bin/bash

INSTALL=~/install/postgres
PGDATA=~/junk/pgdata

rm -fr $PGDATA

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

# Wrangle our next multixact all the way back to FirstMultiXactId (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).

oldest_multixact=$($INSTALL/bin/pg_controldata $PGDATA | grep oldestMultiXid | sed 's/^[^0-9]*//')
$INSTALL/bin/pg_resetxlog -m $oldest_multixact,$((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

oldest_multixact=$($INSTALL/bin/pg_controldata $PGDATA | grep oldestMultiXid | sed 's/^[^0-9]*//')
$INSTALL/bin/pg_resetxlog -m $oldest_multixact,$((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

oldest_multixact=$($INSTALL/bin/pg_controldata $PGDATA | grep oldestMultiXid | sed 's/^[^0-9]*//')
$INSTALL/bin/pg_resetxlog -m $oldest_multixact,$((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

oldest_multixact=$($INSTALL/bin/pg_controldata $PGDATA | grep oldestMultiXid | sed 's/^[^0-9]*//')
$INSTALL/bin/pg_resetxlog -m $oldest_multixact,$((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 < 2 ** 16 - 1; i++)) ; do echo "SELECT * FROM foo FOR SHARE;" ; done ) | $INSTALL/bin/psql postgres > /dev/null
$INSTALL/bin/psql postgres << EOF
  COMMIT PREPARED 'tx1';
EOF
$INSTALL/bin/vacuumdb --freeze --all
$INSTALL/bin/psql postgres -c 'CHECKPOINT'

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

