test_sweight_formulas.sh
text/x-sh
Filename: test_sweight_formulas.sh
Type: text/x-sh
Part: 4
#!/bin/sh
current_dir=$(pwd)
export PGDATA="$current_dir/pgtemp-data"
export PGPORT=54321
export PATH="$current_dir/pgtemp/bin:$PATH"
if [ ! -d "postgresql" ]; then
git clone https://git.postgresql.org/git/postgresql.git
mv postgresql-foo postgresql
(
cd postgresql && \
git reset --hard && \
./configure --prefix="$current_dir/pgtemp" && \
make -j4 && \
make install
) && \
initdb && \
pg_ctl -l "$current_dir/pg.log" start && \
createdb "$USER" || \
exit 1
cat <<-"EOF" | psql -X || exit
CREATE OR REPLACE FUNCTION sig_figs(numeric) RETURNS int LANGUAGE sql AS $$
SELECT 1+coalesce(floor(log(abs(nullif($1,0))))::int,0)+scale($1)
$$;
CREATE TABLE test_results
(
"DEC_DIGITS" int,
pg_version text,
n_double double precision, -- used for sorting, can't use numeric since that's what we are testing
n_text text,
sqrt text,
sqrt_text text,
sqrt_sig_figs int
);
EOF
else
pg_ctl -l "$current_dir/pg.log" start || exit
cat <<-"EOF" | psql || exit
TRUNCATE TABLE test_results;
EOF
fi
for pg_version in "HEAD" "fix-sweight-v2"; do
for DEC_DIGITS in 4 2 1; do
(
cd postgresql && \
git reset --hard && \
git apply "$current_dir/fix-pow10-assert.patch"
) || exit
if [ "$pg_version" != "HEAD" ]
then
(cd postgresql && \
git apply "$current_dir/$pg_version.patch") || exit
fi
if [ $DEC_DIGITS != 4 ]
then
(cd postgresql && \
git apply "$current_dir/DEC_DIGITS_$DEC_DIGITS.patch") || exit
fi
(cd postgresql && make install && pg_ctl restart) || exit
cat <<-EOF | psql -X || exit
WITH nums AS
(
SELECT
exp,
trim_scale(2::numeric*10::numeric^exp) n
FROM generate_series(-40,40) exp
)
INSERT INTO test_results
("DEC_DIGITS", pg_version, n_double, n_text, sqrt, sqrt_sig_figs)
SELECT
'$DEC_DIGITS',
'$pg_version',
n::double precision,
CASE WHEN abs(exp) > 10 THEN
format('2e%s%s',CASE WHEN exp > 0 THEN '+' END,exp)
ELSE
n::text
END,
sqrt(n),
sig_figs(sqrt(n))
FROM nums;
EOF
done
done
for DEC_DIGITS in 4 2 1; do
echo "--"
echo "-- Comparison of sig_figs(sqrt(n)) for HEAD vs fix-sweight-v2"
echo "-- when DEC_DIGITS == $DEC_DIGITS"
echo "--"
cat <<-EOF | psql -X || exit
SELECT
a."DEC_DIGITS",
a.n_text AS n,
a.sqrt_sig_figs AS "HEAD",
b.sqrt_sig_figs AS "fix-sweight-v2",
b.sqrt_sig_figs - a.sqrt_sig_figs AS diff
FROM test_results a
JOIN test_results b USING ("DEC_DIGITS",n_text)
WHERE a.pg_version = 'HEAD'
AND b.pg_version = 'fix-sweight-v2'
AND a."DEC_DIGITS" = $DEC_DIGITS
ORDER BY a.n_double
EOF
done
pg_ctl stop