--- /dev/null
+#!/usr/local/bin/perl
+#
+# Accepts one argument - DBMS name (pgsql, ...) and initializes
+# global variable $TestDBMS with this name.
+#
+
+# Where to run tests
+$DBNAME = 'perftest';
+
+# This describtion for all DBMS supported by test
+# DBMS_name => [FrontEnd, DestroyDB command, CreateDB command]
+
+%DBMS = (
+'pgsql' => ["psql -q -d $DBNAME", "destroydb $DBNAME", "createdb $DBNAME"]
+);
+
+# Tests to run: test' script, test' description, ...
+# Test' script is in form
+#
+# script_name[.ntm][ T]
+#
+# script_name is name of file in ./sqls
+# .ntm means that script will be used for some initialization
+# and should not be timed: runtests.pl opens /dev/null as STDERR
+# in this case and restore STDERR to result file after script done.
+# Script shouldn't notice either he is running for test or for
+# initialization purposes.
+# T means that all queries in this test (initialization ?) are to be
+# executed in SINGLE transaction. In this case global variable $XACTBLOCK
+# is not empty string. Otherwise, each query in test is to be executed
+# in own transaction ($XACTBLOCK is empty string). In accordance with
+# $XACTBLOCK, script is to do DBMS specific preparation before execution
+# of queries. (Look at example in sqls/inssimple for MySQL - it gives
+# an idea of what can be done for features unsupported by an DBMS.)
+#
+@perftests = (
+# It speed up things
+'connection.ntm', 'DB connection startup (no timing)',
+# Just connection startup time (echo "" | psql ... - for PgSQL)
+'connection', 'DB connection startup',
+'crtsimple.ntm', 'Create SIMPLE table (no timing)',
+# 8192 inserts in single xaction
+'inssimple T', '8192 INSERTs INTO SIMPLE (1 xact)',
+'drpsimple.ntm', 'Drop SIMPLE table (no timing)',
+'crtsimple.ntm', 'Create SIMPLE table (no timing)',
+# 8192 inserts in 8192 xactions
+'inssimple', '8192 INSERTs INTO SIMPLE (8192 xacts)',
+'vacuum.ntm', 'Vacuum (no timing)',
+# Fast (after table filled with data) index creation test
+'crtsimpleidx', 'Create INDEX on SIMPLE',
+'drpsimple.ntm', 'Drop SIMPLE table (no timing)',
+'crtsimple.ntm', 'Create SIMPLE table (no timing)',
+'crtsimpleidx.ntm', 'Create INDEX on SIMPLE (no timing)',
+# 8192 inserts in single xaction into table with index
+'inssimple T', '8192 INSERTs INTO SIMPLE with INDEX (1 xact)',
+# 8192 SELECT * FROM simple WHERE justint = <random_key> in single xaction
+'slcsimple T', '8192 random INDEX scans on SIMPLE (1 xact)',
+# SELECT * FROM simple ORDER BY justint
+'orbsimple', 'ORDER BY SIMPLE',
+);
+
+#
+# It seems that nothing below need to be changed
+#
+
+$TestDBMS = $ARGV[0];
+die "Unsupported DBMS $TestDBMS\n" if !exists $DBMS{$TestDBMS};
+
+$FrontEnd = $DBMS{$TestDBMS}[0];
+$DestroyDB = $DBMS{$TestDBMS}[1];
+$CreateDB = $DBMS{$TestDBMS}[2];
+
+print "(Re)create DataBase $DBNAME\n";
+
+`$DestroyDB`; # Destroy DB
+`$CreateDB`; # Create DB
+
+$ResFile = "Results.$TestDBMS";
+$TmpFile = "Tmp.$TestDBMS";
+
+open (SAVEOUT, ">&STDOUT");
+open (STDOUT, ">/dev/null") or die;
+open (SAVEERR, ">&STDERR");
+open (STDERR, ">$TmpFile") or die;
+select (STDERR); $| = 1;
+
+for ($i = 0; $i <= $#perftests; $i++)
+{
+ $test = $perftests[$i];
+ ($test, $XACTBLOCK) = split (/ /, $test);
+ $runtest = $test;
+ if ( $test =~ /\.ntm/ )
+ {
+ #
+ # No timing for this queries
+ #
+ close (STDERR); # close $TmpFile
+ open (STDERR, ">/dev/null") or die;
+ $runtest =~ s/\.ntm//;
+ }
+ else
+ {
+ close (STDOUT);
+ open(STDOUT, ">&SAVEOUT");
+ print STDOUT "\nRunning: $perftests[$i+1] ...";
+ close (STDOUT);
+ open (STDOUT, ">/dev/null") or die;
+ select (STDERR); $| = 1;
+ printf "$perftests[$i+1]: ";
+ }
+
+ do "sqls/$runtest";
+
+ # Restore STDERR to $TmpFile
+ if ( $test =~ /\.ntm/ )
+ {
+ close (STDERR);
+ open (STDERR, ">>$TmpFile") or die;
+ }
+
+ select (STDERR); $| = 1;
+ $i++;
+}
+
+close (STDERR);
+open(STDERR, ">&SAVEERR");
+
+open (TMPF, "<$TmpFile") or die;
+open (RESF, ">$ResFile") or die;
+
+while (<TMPF>)
+{
+ $str = $_;
+ ($test, $rtime) = split (/:/, $str);
+ ($tmp, $rtime, $rest) = split (/[ ]+/, $rtime);
+ print RESF "$test: $rtime\n";
+}
+