]> granicus.if.org Git - postgresql/blobdiff - src/test/regress/pg_regress.sh
copydir() and rmtree() need to use lstat, not stat, to behave as expected
[postgresql] / src / test / regress / pg_regress.sh
index 89eca9586657247eb75f9fdde5fb671cc2f55cd3..f56b737d0bcb5dd74f787e6ad413a0d82c745007 100644 (file)
@@ -1,5 +1,5 @@
 #! /bin/sh
-# $Header: /cvsroot/pgsql/src/test/regress/Attic/pg_regress.sh,v 1.35 2003/08/07 14:36:31 tgl Exp $
+# $PostgreSQL: pgsql/src/test/regress/pg_regress.sh,v 1.65 2006/07/18 00:32:41 tgl Exp $
 
 me=`basename $0`
 : ${TMPDIR=/tmp}
@@ -11,17 +11,24 @@ PostgreSQL regression test driver
 Usage: $me [options...] [extra tests...]
 
 Options:
+  --dbname=DB               use database DB (default \`regression')
   --debug                   turn on debug mode in programs that are run
   --inputdir=DIR            take input files from DIR (default \`.')
+  --load-language=lang      load the named language before running the
+                            tests; can appear multiple times
+  --max-connections=N       maximum number of concurrent connections
+                            (default is 0 meaning unlimited)
   --multibyte=ENCODING      use ENCODING as the multibyte encoding, and
                             also run a test by the same name
   --outputdir=DIR           place output files in DIR (default \`.')
   --schedule=FILE           use test ordering schedule from FILE
                             (may be used multiple times to concatenate)
   --temp-install[=DIR]      create a temporary installation (in DIR)
+  --no-locale               use C locale
 
 Options for \`temp-install' mode:
   --top-builddir=DIR        (relative) path to top level build directory
+  --temp-port=PORT          port number to start temp postmaster on
 
 Options for using an existing installation:
   --host=HOST               use postmaster running on HOST
@@ -48,6 +55,14 @@ message(){
 
 unset LC_COLLATE LC_CTYPE LC_MONETARY LC_MESSAGES LC_NUMERIC LC_TIME LC_ALL LANG LANGUAGE
 
+# On Windows the default locale may not be English, so force it
+case $host_platform in
+    *-*-cygwin*|*-*-mingw32*)
+       LANG=en
+       export LANG
+       ;;
+esac
+
 
 # ----------
 # Check for echo -n vs echo \c
@@ -70,7 +85,6 @@ fi
 : ${outputdir=.}
 
 libdir='@libdir@'
-pkglibdir='@pkglibdir@'
 bindir='@bindir@'
 datadir='@datadir@'
 host_platform='@host_tuple@'
@@ -86,12 +100,16 @@ fi
 unset mode
 unset schedule
 unset debug
+unset nolocale
 unset top_builddir
 unset temp_install
 unset multibyte
 
 dbname=regression
 hostname=localhost
+maxconnections=0
+temp_port=65432
+load_langs=""
 
 : ${GMAKE='@GMAKE@'}
 
@@ -109,21 +127,35 @@ do
         --version)
                 echo "pg_regress (PostgreSQL @VERSION@)"
                 exit 0;;
+        --dbname=*)
+                dbname=`expr "x$1" : "x--dbname=\(.*\)"`
+                shift;;
         --debug)
                 debug=yes
                 shift;;
         --inputdir=*)
                 inputdir=`expr "x$1" : "x--inputdir=\(.*\)"`
                 shift;;
+        --load-language=*)
+                lang=`expr "x$1" : "x--load-language=\(.*\)"`
+                load_langs="$load_langs $lang"
+                unset lang
+                shift;;
         --multibyte=*)
                 multibyte=`expr "x$1" : "x--multibyte=\(.*\)"`
                 shift;;
+        --no-locale)
+                nolocale=yes
+                shift;;
         --temp-install)
                 temp_install=./tmp_check
                 shift;;
         --temp-install=*)
                 temp_install=`expr "x$1" : "x--temp-install=\(.*\)"`
                 shift;;
+        --max-connections=*)
+                maxconnections=`expr "x$1" : "x--max-connections=\(.*\)"`
+                shift;;
         --outputdir=*)
                 outputdir=`expr "x$1" : "x--outputdir=\(.*\)"`
                 shift;;
@@ -134,6 +166,9 @@ do
         --top-builddir=*)
                 top_builddir=`expr "x$1" : "x--top-builddir=\(.*\)"`
                 shift;;
+        --temp-port=*)
+                temp_port=`expr "x$1" : "x--temp-port=\(.*\)"`
+                shift;;
         --host=*)
                 PGHOST=`expr "x$1" : "x--host=\(.*\)"`
                 export PGHOST
@@ -156,13 +191,32 @@ do
     esac
 done
 
-
 # ----------
-# When on QNX or BeOS, don't use Unix sockets.
+# warn of Cygwin likely failure if maxconnections = 0
+# and we are running parallel tests
 # ----------
 
 case $host_platform in
-    *-*-qnx* | *beos*)
+    *-*-cygwin*)
+       case "$schedule" in
+           *parallel_schedule*)
+               if [ $maxconnections -eq 0 ] ; then
+                   echo Using unlimited parallel connections is likely to fail or hang on Cygwin.
+                   echo Try \"$me --max-connections=n\" or \"gmake MAX_CONNECTIONS=n check\"
+                   echo with n = 5 or 10 if this happens.
+                   echo
+               fi
+               ;;
+       esac
+       ;;
+esac
+
+
+# ----------
+# On some platforms we can't use Unix sockets.
+# ----------
+case $host_platform in
+    *-*-cygwin* | *-*-mingw32*)
         unix_sockets=no;;
     *)
         unix_sockets=yes;;
@@ -174,7 +228,7 @@ esac
 # ----------
 
 case $host_platform in
-    *-*-qnx* | *-*-sco3.2v5*)
+    *-*-sco3.2v5*)
         DIFFFLAGS=-b;;
     *)
         DIFFFLAGS=-w;;
@@ -204,18 +258,20 @@ PGDATESTYLE='ISO, MDY'; export PGDATESTYLE
 # with the result of the last shell command before the `exit'.  Hence
 # we have to write `(exit x); exit' below this point.
 
-trap '
-    savestatus=$?
+exit_trap(){ 
+    savestatus=$1
     if [ -n "$postmaster_pid" ]; then
         kill -2 "$postmaster_pid"
         wait "$postmaster_pid"
         unset postmaster_pid
     fi
     rm -f "$TMPFILE" && exit $savestatus
-' 0
+}
 
-trap '
-    savestatus=$?
+trap 'exit_trap $?' 0
+
+sig_trap() {
+    savestatus=$1
     echo; echo "caught signal"
     if [ -n "$postmaster_pid" ]; then
         echo "signalling fast shutdown to postmaster with pid $postmaster_pid"
@@ -224,7 +280,9 @@ trap '
         unset postmaster_pid
     fi
     (exit $savestatus); exit
-' 1 2 13 15
+}
+
+trap 'sig_trap $?' 1 2 13 15
 
 
 
@@ -248,15 +306,15 @@ if [ -f "$inputdir/resultmap" ]
 then
     while read LINE
     do
-       HOSTPAT=`expr "$LINE" : '.*/\(.*\)='`
-       if [ `expr "$host_platform:$compiler" : "$HOSTPAT"` -ne 0 ]
-       then
-           # remove hostnamepattern from line so that there are no shell
-           # wildcards in SUBSTLIST; else later 'for' could expand them!
-           TESTNAME=`expr "$LINE" : '\(.*\)/'`
-           SUBST=`echo "$LINE" | sed 's/^.*=//'`
-           echo "$TESTNAME=$SUBST" >> $TMPFILE
-       fi
+        HOSTPAT=`expr "$LINE" : '.*/\(.*\)='`
+        if [ `expr "$host_platform:$compiler" : "$HOSTPAT"` -ne 0 ]
+        then
+            # remove hostnamepattern from line so that there are no shell
+            # wildcards in SUBSTLIST; else later 'for' could expand them!
+            TESTNAME=`expr "$LINE" : '\(.*\)/'`
+            SUBST=`echo "$LINE" | sed 's/^.*=//'`
+            echo "$TESTNAME=$SUBST" >> $TMPFILE
+        fi
     done <"$inputdir/resultmap"
 fi
 SUBSTLIST=`cat $TMPFILE`
@@ -273,7 +331,6 @@ then
 
     bindir=$temp_install/install/$bindir
     libdir=$temp_install/install/$libdir
-    pkglibdir=$temp_install/install/$pkglibdir
     datadir=$temp_install/install/$datadir
     PGDATA=$temp_install/data
 
@@ -285,7 +342,13 @@ then
         unset PGHOST
         unset PGHOSTADDR
     fi
-    PGPORT=65432
+
+    # since Makefile isn't very bright, check for out-of-range temp_port
+    if [ "$temp_port" -ge 1024 -a "$temp_port" -le 65535 ] ; then
+       PGPORT=$temp_port
+    else
+       PGPORT=65432
+    fi
     export PGPORT
 
     # Get rid of environment stuff that might cause psql to misbehave
@@ -294,8 +357,9 @@ then
 
     # ----------
     # Set up shared library paths, needed by psql and pg_encoding
-    # (if you run multibyte).  LD_LIBRARY_PATH covers many platforms,
-    # feel free to account for others as well.
+    # (if you run multibyte).  LD_LIBRARY_PATH covers many platforms.
+    # DYLD_LIBRARY_PATH works on Darwin, and maybe other Mach-based systems.
+    # Feel free to account for others as well.
     # ----------
 
     if [ -n "$LD_LIBRARY_PATH" ]; then
@@ -305,14 +369,22 @@ then
     fi
     export LD_LIBRARY_PATH
 
+    if [ -n "$DYLD_LIBRARY_PATH" ]; then
+        DYLD_LIBRARY_PATH="$libdir:$DYLD_LIBRARY_PATH"
+    else
+        DYLD_LIBRARY_PATH=$libdir
+    fi
+    export DYLD_LIBRARY_PATH
+
     # ----------
     # Windows needs shared libraries in PATH. (Only those linked into
     # executables, not dlopen'ed ones)
     # ----------
-    case $host_platform in *-*-cygwin*)
-        PATH=$libdir:$PATH
-        export PATH
-        ;;
+    case $host_platform in
+        *-*-cygwin*|*-*-mingw32*)
+            PATH=$libdir:$PATH
+            export PATH
+            ;;
     esac
 
     if [ -d "$temp_install" ]; then
@@ -335,15 +407,9 @@ then
         (exit 2); exit
     fi
 
-    # fix conversion shared objs path
-    conv=$datadir/conversion_create.sql
-    backup=$conv.bak
-    mv $conv $backup
-    sed -e "s@\$libdir@$pkglibdir@g" $backup > $conv
-    rm $backup
-
     message "initializing database system"
-    [ "$debug" = yes ] && initdb_options='--debug'
+    [ "$debug" = yes ] && initdb_options="--debug"
+    [ "$nolocale" = yes ] && initdb_options="$initdb_options --no-locale"
     "$bindir/initdb" -D "$PGDATA" -L "$datadir" --noclean $initdb_options >"$LOGDIR/initdb.log" 2>&1
 
     if [ $? -ne 0 ]
@@ -362,7 +428,11 @@ then
 
     message "starting postmaster"
     [ "$debug" = yes ] && postmaster_options="$postmaster_options -d 5"
-    [ "$unix_sockets" = no ] && postmaster_options="$postmaster_options -i"
+    if [ "$unix_sockets" = no ]; then
+        postmaster_options="$postmaster_options -c listen_addresses=$hostname"
+    else
+        postmaster_options="$postmaster_options -c listen_addresses="
+    fi
     "$bindir/postmaster" -D "$PGDATA" -F $postmaster_options >"$LOGDIR/postmaster.log" 2>&1 &
     postmaster_pid=$!
 
@@ -371,7 +441,7 @@ then
     # wait forever, however.
     i=0
     max=60
-    until "$bindir/psql" $psql_options template1 </dev/null 2>/dev/null
+    until "$bindir/psql" -X $psql_options postgres </dev/null 2>/dev/null
     do
         i=`expr $i + 1`
         if [ $i -ge $max ]
@@ -400,12 +470,16 @@ then
 
 else # not temp-install
 
-    # If Unix sockets are not available, use the local host by default.
-    if [ "$unix_sockets" = no ]; then
-        PGHOST=$hostname
-        export PGHOST
-        unset PGHOSTADDR
-    fi
+    # ----------
+    # Windows needs shared libraries in PATH. (Only those linked into
+    # executables, not dlopen'ed ones)
+    # ----------
+    case $host_platform in
+        *-*-cygwin*|*-*-mingw32*)
+            PATH=$libdir:$PATH
+            export PATH
+            ;;
+    esac
 
     if [ -n "$PGPORT" ]; then
         port_info="port $PGPORT"
@@ -416,8 +490,13 @@ else # not temp-install
     if [ -n "$PGHOST" ]; then
         echo "(using postmaster on $PGHOST, $port_info)"
     else
-        echo "(using postmaster on Unix socket, $port_info)"
+        if [ "$unix_sockets" = no ]; then
+            echo "(using postmaster on localhost, $port_info)"
+        else
+            echo "(using postmaster on Unix socket, $port_info)"
+        fi
     fi
+
     message "dropping database \"$dbname\""
     "$bindir/dropdb" $psql_options "$dbname"
     # errors can be ignored
@@ -428,7 +507,7 @@ fi
 # Set up SQL shell for the test.
 # ----------
 
-PSQL="$bindir/psql -a -q -X $psql_options"
+psql_test_options="-a -q -X $psql_options"
 
 
 # ----------
@@ -465,11 +544,11 @@ if [ $? -ne 0 ]; then
     (exit 2); exit
 fi
 
-"$bindir/psql" $psql_options -c "\
+"$bindir/psql" -q -X $psql_options -c "\
 alter database \"$dbname\" set lc_messages to 'C';
 alter database \"$dbname\" set lc_monetary to 'C';
 alter database \"$dbname\" set lc_numeric to 'C';
-alter database \"$dbname\" set lc_time to 'C';" "$dbname" 2>/dev/null
+alter database \"$dbname\" set lc_time to 'C';" "$dbname"
 if [ $? -ne 0 ]; then
     echo "$me: could not set database default locales"
     (exit 2); exit
@@ -477,28 +556,20 @@ fi
 
 
 # ----------
-# Remove regressuser* and regressgroup* user accounts.
-# ----------
-
-message "dropping regression test user accounts"
-"$bindir/psql" $psql_options -c 'DROP GROUP regressgroup1; DROP GROUP regressgroup2; DROP USER regressuser1, regressuser2, regressuser3, regressuser4;' $dbname 2>/dev/null
-if [ $? -eq 2 ]; then
-    echo "$me: could not drop user accounts"
-    (exit 2); exit
-fi
-
-
-# ----------
-# Install the PL/pgSQL language in it
+# Install any requested PL languages
 # ----------
 
 if [ "$enable_shared" = yes ]; then
-        message "installing PL/pgSQL"
-        "$bindir/createlang" -L "$pkglibdir" $psql_options plpgsql $dbname
-        if [ $? -ne 0 ] && [ $? -ne 2 ]; then
-            echo "$me: createlang failed"
-            (exit 2); exit
+    for lang in xyzzy $load_langs ; do    
+        if [ "$lang" != "xyzzy" ]; then
+            message "installing $lang"
+            "$bindir/createlang" $psql_options $lang $dbname
+            if [ $? -ne 0 ] && [ $? -ne 2 ]; then
+                echo "$me: createlang $lang failed"
+                (exit 2); exit
+            fi
         fi
+    done
 fi
 
 
@@ -552,15 +623,24 @@ do
         # Run a single test
         formatted=`echo $1 | awk '{printf "%-20.20s", $1;}'`
         $ECHO_N "test $formatted ... $ECHO_C"
-        $PSQL -d "$dbname" <"$inputdir/sql/$1.sql" >"$outputdir/results/$1.out" 2>&1
+        ( "$bindir/psql" $psql_test_options -d "$dbname" <"$inputdir/sql/$1.sql" >"$outputdir/results/$1.out" 2>&1 )&
+        wait
     else
         # Start a parallel group
         $ECHO_N "parallel group ($# tests): $ECHO_C"
+        if [ $maxconnections -gt 0 ] ; then
+            connnum=0
+            test $# -gt $maxconnections && $ECHO_N "(in groups of $maxconnections) $ECHO_C"
+        fi
         for name do
             ( 
-             $PSQL -d "$dbname" <"$inputdir/sql/$name.sql" >"$outputdir/results/$name.out" 2>&1
+              "$bindir/psql" $psql_test_options -d "$dbname" <"$inputdir/sql/$name.sql" >"$outputdir/results/$name.out" 2>&1
               $ECHO_N " $name$ECHO_C"
             ) &
+            if [ $maxconnections -gt 0 ] ; then
+                connnum=`expr \( $connnum + 1 \) % $maxconnections`
+                test $connnum -eq 0 && wait
+            fi
         done
         wait
         echo
@@ -593,8 +673,8 @@ do
             fi
         done
 
-        # If there are multiple equally valid result file, loop to get the right one.
-        # If none match, diff against the closet one.
+        # If there are multiple equally valid result files, loop to get the right one.
+        # If none match, diff against the closest one.
 
         bestfile=
         bestdiff=
@@ -631,7 +711,7 @@ do
                 fi
                 ;;
             2)
-                # desaster struck
+                # disaster struck
                 echo "trouble" 1>&2
                 (exit 2); exit;;
         esac
@@ -646,7 +726,7 @@ done | tee "$result_summary_file" 2>&1
 
 if [ -n "$postmaster_pid" ]; then
     message "shutting down postmaster"
-    kill -15 "$postmaster_pid"
+    "$bindir/pg_ctl" -s -D "$PGDATA" stop
     wait "$postmaster_pid"
     unset postmaster_pid
 fi