#!/bin/bash

set -e

psql -c "show huge_pages;" postgres
psql -c "show shared_buffers;" postgres
psql -c "create extension if not exists pg_prewarm" postgres

psql -c "alter system set max_parallel_workers = 0;" postgres > /dev/null
psql -c "alter system set work_mem = '4GB';" postgres > /dev/null

psql -c "select pg_reload_conf();" postgres > /dev/null

psql -c "create table if not exists ab (a int, b int);" postgres

#for rows in 1000000 10000000
for rows in 1000000
do
	mod=32
	for work_mem in 16MB 32MB 64MB 128MB 256MB 512MB 1GB 2GB 4GB
	do
		psql -c "alter system set work_mem = '$work_mem';" postgres > /dev/null
		psql -c "select pg_reload_conf();" postgres > /dev/null
#		for dist in unsorted presorted random
		for dist in random
		do
			psql -c "truncate table ab;" postgres > /dev/null
			case $dist in
				unsorted ) selectrows="select x%$mod,x from generate_Series(1,$rows) x;" ;;
				presorted ) selectrows="select x / ($rows / $mod) ,x from generate_Series(1,$rows) x;" ;;
				random ) selectrows="select x % $mod * random(),x from generate_Series(1,$rows) x;" ;;
			esac
			psql -c "insert into ab $selectrows" postgres > /dev/null
			psql -c "vacuum freeze ab;" postgres > /dev/null
			psql -c "select pg_prewarm('ab');" postgres > /dev/null
			echo "select a,b,row_number() over (order by a) from ab order by a,b" > bench.sql
			
			for pushdown in off on
			do
				psql -c "alter system set enable_sort_pushdown = $pushdown;" postgres > /dev/null
				psql -c "select pg_reload_conf();" postgres > /dev/null
				echo -n "$rows $dist $mod $work_mem $pushdown "
				pgbench -n -f bench.sql -T 10 -M prepared postgres | grep latency
			done
		done
	done
done
