mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#! /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}
 | 
						|
 | 
						|
INPUTFILE="tmp$$a"
 | 
						|
DUPSFILE="tmp$$b"
 | 
						|
NONDUPSFILE="tmp$$c"
 | 
						|
rm -f $INPUTFILE $DUPSFILE $NONDUPSFILE
 | 
						|
 | 
						|
trap "rm -f $INPUTFILE $DUPSFILE $NONDUPSFILE" 0 1 2 3 15
 | 
						|
 | 
						|
# Read input
 | 
						|
cat "$@" >$INPUTFILE
 | 
						|
 | 
						|
# Look for fields with multiple references.
 | 
						|
cat $INPUTFILE | cut -d' ' -f2 | sort | uniq -d >$DUPSFILE
 | 
						|
if [ -s $DUPSFILE ] ; then
 | 
						|
	echo "Ignoring these fields that link to multiple tables:" 1>&2
 | 
						|
	cat $DUPSFILE 1>&2
 | 
						|
fi
 | 
						|
 | 
						|
# Get the non-multiply-referenced fields.
 | 
						|
cat $INPUTFILE | while read LINE
 | 
						|
do
 | 
						|
	set -- $LINE
 | 
						|
	grep "^$2\$" $DUPSFILE >/dev/null 2>&1 || echo $LINE
 | 
						|
done >$NONDUPSFILE
 | 
						|
 | 
						|
# Generate the output.
 | 
						|
cat $NONDUPSFILE |
 | 
						|
$AWK -F'[ \.]' '\
 | 
						|
	BEGIN \
 | 
						|
	{
 | 
						|
		printf "\
 | 
						|
--\n\
 | 
						|
-- This is created by pgsql/contrib/findoidjoins/make_oidjoin_check\n\
 | 
						|
--\n";
 | 
						|
	}
 | 
						|
	{
 | 
						|
		printf "\
 | 
						|
SELECT	ctid, %s \n\
 | 
						|
FROM	%s.%s fk \n\
 | 
						|
WHERE	%s != 0 AND \n\
 | 
						|
	NOT EXISTS(SELECT 1 FROM %s.%s pk WHERE pk.oid = fk.%s);\n",
 | 
						|
	$4, $2, $3, $4,
 | 
						|
	$6, $7, $4;
 | 
						|
	}'
 | 
						|
 | 
						|
exit 0
 |