postgresql/contrib/findoidjoins/make_oidjoins_check

54 lines
1.2 KiB
Plaintext
Raw Normal View History

#! /bin/sh
# You first run findoidjoins on the template1 database, and send that
# output into this script to generate a list of SQL statements.
# NOTE: any field that findoidjoins thinks joins to more than one table
# will NOT be checked by the output of this script. You should be
# suspicious of multiple entries in findoidjoins' output.
# Caution: you may need to use GNU awk.
AWK=${AWK:-awk}
trap "rm -f /tmp/$$ /tmp/$$a /tmp/$$b" 0 1 2 3 15
# Read input
cat "$@" >/tmp/$$
# Look for fields with multiple references.
cat /tmp/$$ | cut -d' ' -f2 | sort | uniq -d >/tmp/$$a
if [ -s /tmp/$$a ] ; then
echo "Ignoring these fields that link to multiple tables:" 1>&2
cat /tmp/$$a 1>&2
fi
# Get the non-multiply-referenced fields.
cat /tmp/$$ | while read LINE
do
set -- $LINE
grep "$2" /tmp/$$a >/dev/null 2>&1 || echo $LINE
done >/tmp/$$b
# Generate the output.
cat /tmp/$$b |
$AWK -F'[ \.]' '\
BEGIN \
{
printf "\
--\n\
-- This is created by pgsql/contrib/findoidjoins/make_oidjoin_check\n\
--\n";
}
{
printf "\
SELECT ctid, %s.%s \n\
FROM %s \n\
WHERE %s.%s != 0 AND \n\
NOT EXISTS(SELECT * FROM %s AS t1 WHERE t1.oid = %s.%s);\n",
$2, $3, $2,
$2, $3,
$5, $2, $3;
}'
exit 0