#!/usr/bin/bash

for nr in 1000000 10000 10000000; do

	for nc in 1 5 10 20; do

		psql test -c "drop table if exists t";

		create_sql='CREATE TABLE t (id int primary key';
		insert_sql="INSERT INTO t (id";

		for c in `seq 1 $nc`; do
			create_sql="$create_sql, c$c text";
			insert_sql="$insert_sql, c$c";
		done

		create_sql="$create_sql)";
		insert_sql="$insert_sql) select i";

		for c in `seq 1 $nc`; do
			insert_sql="$insert_sql, md5(random()::text)";
		done

		insert_sql="$insert_sql FROM generate_series(1,$nr) s(i)"

		echo $create_sql
		echo $insert_sql

		psql test -c "$create_sql"
		psql test -c "$insert_sql"

		psql test -c 'vacuum (freeze,analyze) t'

		psql test -c 'checkpoint'

		for nw in 4 0 8 2 16; do

			for r in `seq 1 5`; do

				psql test > timing.log <<EOF
set parallel_setup_cost=0;
set parallel_tuple_cost=0;
set max_parallel_workers_per_gather=$nw;
set min_parallel_index_scan_size='1kB';
set min_parallel_table_scan_size='1kB';
EXPLAIN ANALYZE SELECT * FROM (SELECT * FROM t OFFSET 1000000000) foo;
\timing
SELECT * FROM (SELECT * FROM t OFFSET 1000000000) foo;
EOF

				t=`grep '^Time' timing.log | awk '{print $2}'`

				echo $nr $nc $nw $r $t >> results.csv

				echo "===== rows $nr columns $nc workers $nw run $r timing $t =====" >> explain.log 2>&1
				cat timing.log >> explain.log 2>&1

			done

		done

	done

done
