#!/bin/bash
# Run against a PostgreSQL server with pgcel installed and preloaded.
set -euo pipefail

psql_args=(-X -qAt -v ON_ERROR_STOP=1)
baseline=$(psql "${psql_args[@]}" -c "SELECT current_setting('pgcel.program_cache_size')")
if [ "$baseline" = 1 ]; then
    session_size=2
else
    session_size=1
fi

first=$(psql "${psql_args[@]}" -c "SET pgcel.program_cache_size = $session_size; SELECT pg_backend_pid(), current_setting('pgcel.program_cache_size'), cel_compile('ctx.value > 10')::text, cel_eval('ctx.value > 10'::celprogram, '{\"value\": 42}'::jsonb)")
second=$(psql "${psql_args[@]}" -c "SELECT pg_backend_pid(), current_setting('pgcel.program_cache_size'), cel_compile('ctx.value > 10')::text, cel_eval('ctx.value > 10'::celprogram, '{\"value\": 42}'::jsonb)")
IFS='|' read -r first_pid first_size first_source first_result <<< "$first"
IFS='|' read -r second_pid second_size second_source second_result <<< "$second"

[ "$first_pid" != "$second_pid" ]
[ "$first_size" = "$session_size" ]
[ "$second_size" = "$baseline" ]
[ "$first_source" = 'ctx.value > 10' ]
[ "$second_source" = "$first_source" ]
[ "$first_result" = t ]
[ "$second_result" = t ]
if psql "${psql_args[@]}" -c "SELECT cel_compile('(')" >/dev/null 2>&1; then
    echo 'Invalid CEL source unexpectedly compiled' >&2
    exit 1
fi
printf 'SQL serialization, GUC isolation, invalid source, and separate backends passed\n'
