set -e

	sleep="sleep 5"
#	sleep= #XXX

$PSQL "alter system set max_parallel_workers_per_gather TO 0;"
$PSQL "alter system set work_mem TO '1GB';"
$PSQL "alter system set trace_sort TO 'on';"
$PSQL "select pg_reload_conf();"

offset="offset 1_000_000_000"
xacts=30

for records in 1000000
do

#		for pattern in sawtooth rand stagger
#		for pattern in sawtooth_31k stagger_3 stagger_32
		for pattern in stagger_3
#		for pattern in rand zipf s95 p5 asc desc organ
		do
			for mod in $((records+1))
#			for mod in 2 3 10 32 100 316 1000 3162 10000 31622 100000 316228 $((records/2)) $((records+1)) # last one keeps the original number
			do
				echo "Records: $records" >> results.txt
				echo "  Pattern: $pattern" >> results.txt
				echo "    Mod: $mod" >> results.txt

				$sleep
				$PSQL "drop table if exists tsort; create unlogged table tsort (x bigint);"
				case $pattern in
					rand     ) $PSQL "select setseed(0.935349); insert into tsort select random(0, 100_000_000) % $mod from generate_series(1,$records) i" ;;
					sawtooth_31k ) $PSQL "insert into tsort select i % 31622 from generate_series(1,$records) i" ;;
					stagger_3  ) $PSQL "insert into tsort select (i::numeric * 3 + i) % $records from generate_series(1,$records) i" ;;
					stagger_32  ) $PSQL "insert into tsort select (i::numeric * 32 + i) % $records from generate_series(1,$records) i" ;;
					zipf     ) $PSQL "insert into tsort select z from zipf limit $records" ;;
					s95      ) $PSQL "insert into tsort select i from generate_series(1,$records / 20 * 19) i; select setseed(0.935349); insert into tsort select random(1, $records) from generate_series(1,$records / 20) i" ;;
					p5       ) $PSQL "select setseed(0.935349); with r (rand, i) as (select random(-1000, 1000), i from generate_series(1,$records,1) i ) insert into tsort select case when r.rand < -950 or r.rand > 950 then r.rand else 0 end from r;" ;;
					asc      ) $PSQL "insert into tsort select i from generate_series(1,$records) i" ;;
					desc     ) $PSQL "insert into tsort select i from generate_series($records, 1, -1) i" ;;
					organ    ) $PSQL "insert into tsort select i from generate_series(1,$records / 2) i; insert into tsort select i from generate_series($records / 2, 1, -1) i;" ;;
					* ) echo "Error: unknown pattern"; exit 2;;
				esac

#				$PSQL "select * from tsort" >> results.txt #XXX
				sql="select x from tsort order by x offset 1_000_000_000;"
#				$PSQL "explain (analyze, timing off) $sql;" | grep -E "Memory|Disk" #XXX
#				continue # XXX

				$PSQL "vacuum freeze tsort"
				$PSQL "select pg_prewarm('tsort')"

				echo $sql > bench.sql

				echo "standard" >> results.txt
				$sleep
				$PSQL "alter system set debug_branchless_sort = 'off';"
				$PSQL "select pg_reload_conf();"
				for i in {1..3}
				do
					pgbench -n -t $xacts -f bench.sql | grep latency >> results.txt
				done

				echo "patch" >> results.txt
				$sleep
				$PSQL "alter system set debug_branchless_sort = 'on';"
				$PSQL "select pg_reload_conf();"
				for i in {1..3}
				do
					pgbench -n -t $xacts -f bench.sql | grep latency >> results.txt
				done
			done
		done
done
