> BTW, clusterdb is not schema-aware and will surely fail in any database

> where more than one schema is in use, because it doesn't trouble to
> schema-qualify table names.

Ok, the following patch should solve this concern.  It also tries to
connect as little times as possible (the previous one would connect one
time per table plus one per database; this one connects two times per
database).

Alvaro Herrera
This commit is contained in:
Bruce Momjian 2002-09-12 00:18:14 +00:00
parent 5dd74c0f21
commit b2711a0aee
1 changed files with 24 additions and 14 deletions

View File

@ -11,7 +11,7 @@
# #
# #
# IDENTIFICATION # IDENTIFICATION
# $Header: /cvsroot/pgsql/src/bin/scripts/Attic/clusterdb,v 1.2 2002/09/07 16:12:27 petere Exp $ # $Header: /cvsroot/pgsql/src/bin/scripts/Attic/clusterdb,v 1.3 2002/09/12 00:18:14 momjian Exp $
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -121,7 +121,7 @@ if [ "$usage" ]; then
echo " -W, --password Prompt for password" echo " -W, --password Prompt for password"
echo " -d, --dbname=DBNAME Database to cluster" echo " -d, --dbname=DBNAME Database to cluster"
echo " -a, --all Cluster all databases" echo " -a, --all Cluster all databases"
echo " -t, --table='TABLE[(columns)]' Cluster specific table only" echo " -t, --table='TABLE' Cluster specific table only"
echo " -v, --verbose Write a lot of output" echo " -v, --verbose Write a lot of output"
echo " -e, --echo Show the command being sent to the backend" echo " -e, --echo Show the command being sent to the backend"
echo " -q, --quiet Don't write any output" echo " -q, --quiet Don't write any output"
@ -152,25 +152,35 @@ fi
for db in $dbname for db in $dbname
do do
[ "$alldb" -a "$quiet" -ne 1 ] && echo "Clustering $db" [ "$alldb" ] && echo "Clustering $db"
query="SELECT pg_class.relname, pg_class_2.relname FROM pg_class, \ query="SELECT nspname, pg_class.relname, pg_class_2.relname FROM pg_class, pg_class AS pg_class_2 JOIN pg_namespace ON (pg_namespace.oid=relnamespace), pg_index WHERE pg_class.oid=pg_index.indrelid AND pg_class_2.oid=pg_index.indexrelid AND pg_index.indisclustered"
pg_class AS pg_class_2, pg_index WHERE pg_class.oid=pg_index.indrelid\
AND pg_class_2.oid=pg_index.indexrelid AND pg_index.indisclustered"
if [ -z "$table" ]; then if [ -z "$table" ]; then
tables=`${PATHNAME}psql $db $PSQLOPT -F: -P format=unaligned -t -c "$query"` tables=`${PATHNAME}psql $db $PSQLOPT -F: -P format=unaligned -t -c "$query"`
else else
tables=`${PATHNAME}psql $db $PSQLOPT -F: -P format=unaligned -t -c \ # if tablename has a dot, use it as namespace separator
"$query AND pg_class.relname='$table'"` if echo $table | grep -s '\.' 2>&1 >/dev/null
then
tbl=`echo $table | cut -d. -f2`
nspc=`echo $table | cut -d. -f1`
tables=`${PATHNAME}psql $db $PSQLOPT -F: -P format=unaligned -t -c "$query AND pg_class.relname='$tbl' AND nspname='$nspc'"`
echo $tables
else
tables=`${PATHNAME}psql $db $PSQLOPT -F: -P format=unaligned -t -c "$query AND pg_class.relname='$table'"`
fi
fi fi
query=
for tabs in $tables for tabs in $tables
do do
tab=`echo $tabs | cut -d: -f1` nspc=`echo $tabs | cut -d: -f1`
idx=`echo $tabs | cut -d: -f2` tab=`echo $tabs | cut -d: -f2`
${PATHNAME}psql $PSQLOPT $ECHOOPT -c "CLUSTER $idx on $tab" -d $db idx=`echo $tabs | cut -d: -f3`
if [ "$?" -ne 0 ]; then query="$query CLUSTER $idx ON $nspc.$tab;"
echo "$CMDNAME: cluster $table $db failed" 1>&2
fi
done done
${PATHNAME}psql $PSQLOPT $ECHOOPT -c "$query" -d $db
if [ "$?" -ne 0 ]
then
echo "$CMDNAME: While clustering $db, the following failed: $query" 1>&2
fi
done done
exit 0 exit 0