aboutsummaryrefslogtreecommitdiff
path: root/doc/src/sgml/regress.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/sgml/regress.sgml')
-rw-r--r--doc/src/sgml/regress.sgml448
1 files changed, 448 insertions, 0 deletions
diff --git a/doc/src/sgml/regress.sgml b/doc/src/sgml/regress.sgml
new file mode 100644
index 00000000000..f5a8d8a3d5f
--- /dev/null
+++ b/doc/src/sgml/regress.sgml
@@ -0,0 +1,448 @@
+<Chapter>
+<Title>Regression Test</Title>
+
+<Abstract>
+<Para>
+Regression test instructions and analysis.
+</Para>
+</Abstract>
+
+<Para>
+ The PostgreSQL regression tests are a comprehensive set of tests for the
+ SQL implementation embedded in PostgreSQL developed by Jolly Chen and
+ Andrew Yu. It tests standard SQL operations as well as the extended
+ capabilities of PostgreSQL.
+</Para>
+
+<Para>
+ These tests have recently been revised by Marc Fournier and Thomas Lockhart
+and are now packaged as
+ functional units which should make them easier to run and easier to interpret.
+From <ProductName>PostgreSQL</ProductName> v6.1 onward
+ the regression tests are current for every official release.
+</Para>
+
+<Para>
+ Some properly installed and fully functional PostgreSQL installations
+ can fail some of these regression tests due to artifacts of floating point
+ representation and time zone support. The current tests are evaluated
+ using a simple "diff" algorithm, and are sensitive to small system
+ differences. For apparently failed tests, examining the differences
+ may reveal that the differences are not significant.
+</Para>
+
+<Para>
+The regression testing notes below assume the following (except where noted):
+<ItemizedList Mark="bullet" Spacing="compact">
+<ListItem>
+<Para>
+Commands are Unix-compatible. See note below.
+</Para>
+</ListItem>
+<ListItem>
+<Para>
+Defaults are used except where noted.
+</Para>
+</ListItem>
+<ListItem>
+<Para>
+User postgres is the <ProductName>Postgres</ProductName> superuser.
+</Para>
+</ListItem>
+<ListItem>
+<Para>
+The source path is /usr/src/pgsql (other paths are possible).
+</Para>
+</ListItem>
+<ListItem>
+<Para>
+The runtime path is /usr/local/pgsql (other paths are possible).
+</Para>
+</ListItem>
+</ItemizedList>
+</Para>
+
+<Sect1>
+<Title>Regression Environment</Title>
+
+<Para>
+ The regression test is invoked by the <Command>make</Command> command which compiles
+ a <Acronym>C</Acronym> program into a shared library
+ in the current directory. Localized shell scripts are also created in
+ the current directory. The output file templates are massaged into the
+ <FileName>./expected/*.out</FileName> files. The localization replaces macros in the source
+ files with absolute pathnames and user names.
+</Para>
+
+<Para>
+ Normally, the regression test should be run as the pg_superuser since
+ the 'src/test/regress' directory and sub-directories are owned by the
+ pg_superuser. If you run the regression test as another user the
+ 'src/test/regress' directory tree should be writeable to that user.
+</Para>
+
+<Para>
+ The postmaster should be invoked with the system time zone set for
+ Berkeley, California. This is done automatically by the regression
+test script. However, it does require machine support for the PST8PDT
+time zone.
+</Para>
+
+<Para>
+To verify that your machine does have this support, type
+the following:
+<ProgramListing>
+ setenv TZ PST8PDT
+ date
+</ProgramListing>
+</Para>
+
+<Para>
+ The "date" command above should have returned the current system time
+ in the PST8PDT time zone. If the PST8PDT database is not available, then
+ your system may have returned the time in GMT. If the PST8PDT time zone
+ is not available, you can set the time zone rules explicitly:
+<ProgramListing>
+ setenv PGTZ PST8PDT7,M04.01.0,M10.05.03
+</ProgramListing>
+</Para>
+
+<Sect1>
+<Title>Directory Layout</Title>
+
+<Para>
+<Note>
+<Para>
+This should become a table in the previous section.
+</Para>
+</Note>
+</Para>
+
+<Para>
+<ProgramListing>
+ input/ .... .source files that are converted using 'make all' into
+ some of the .sql files in the 'sql' subdirectory
+
+ output/ ... .source files that are converted using 'make all' into
+ .out files in the 'expected' subdirectory
+
+ sql/ ...... .sql files used to perform the regression tests
+
+ expected/ . .out files that represent what we *expect* the results to
+ look like
+
+ results/ .. .out files that represent what the results *actually* look
+ like. Also used as temporary storage for table copy testing.
+</ProgramListing>
+</Para>
+
+</Sect1>
+
+<Sect1>
+<Title>Regression Test Procedure</Title>
+
+<Para>
+Commands were tested on RedHat Linux version 4.2 using the bash shell.
+Except where noted, they will probably work on most systems. Commands
+like <FileName>ps</FileName> and <FileName>tar</FileName> vary wildly on what options you should use on each
+platform. <Emphasis>Use common sense</Emphasis> before typing in these commands.
+</Para>
+
+<Para>
+<Procedure>
+<Title><ProductName>Postgres</ProductName> Regression Configuration</Title>
+
+<Para>
+For a fresh install or upgrading from previous releases of
+<ProductName>Postgres</ProductName>:
+</Para>
+
+<Step Performance="required">
+<Para>
+Build the regression test. Type
+<ProgramListing>
+ cd /usr/src/pgsql/src/test/regress
+ gmake all
+</ProgramListing>
+</Para>
+</Step>
+
+<Step Performance="optional">
+<Para>
+ If you have prevously invoked the regression test, clean up the
+ working directory with:
+
+<ProgramListing>
+ cd /usr/src/pgsql/src/test/regress
+ make clean
+</ProgramListing>
+
+<Step Performance="required">
+<Para>
+ The file /usr/src/pgsql/src/test/regress/README has detailed
+ instructions for running and interpreting the regression tests.
+ A short version follows here:
+</Para>
+
+<Para>
+If the postmaster is not already running, start the postmaster on an
+available window by typing
+<ProgramListing>
+ postmaster
+</ProgramListing>
+
+or start the postmaster daemon running in the background by typing
+<ProgramListing>
+ cd
+ nohup postmaster > regress.log 2>&1 &
+</ProgramListing>
+</Para>
+
+<Para>
+ Run postmaster from your <ProductName>Postgres</ProductName> super user account (typically
+ account postgres).
+
+<Note>
+<Para>
+Do not run <FileName>postmaster</FileName> from the root account.
+</Para>
+</Note>
+</Para>
+</Step>
+
+<Step Performance="required">
+<Para>
+ Run the regression tests. Type
+
+<ProgramListing>
+ cd /usr/src/pgsql/src/test/regress
+ gmake runtest
+</ProgramListing>
+</Para>
+
+<Para>
+
+ You do not need to type "gmake clean" if this is the first time you
+ are running the tests.
+</Para>
+</Step>
+
+<Step Performance="required">
+<Para>
+
+ You should get on the screen (and also written to file ./regress.out)
+ a series of statements stating which tests passed and which tests
+ failed. Please note that it can be normal for some of the tests to
+ "fail". For the failed tests, use diff to compare the files in
+ directories ./results and ./expected. If float8 failed, type
+ something like:
+<ProgramListing>
+ cd /usr/src/pgsql/src/test/regress
+ diff -w expected/float8.out results
+</ProgramListing>
+</Para>
+</Step>
+
+<Step Performance="required">
+<Para>
+ After running the tests, type
+<ProgramListing>
+ destroydb regression
+ cd /usr/src/pgsql/src/test/regress
+ gmake clean
+</ProgramListing>
+</Para>
+</Step>
+
+</Procedure>
+
+</Sect1>
+
+<Sect1>
+<Title>Regression Analysis</Title>
+
+<Para>
+ <Quote>Failed</Quote> tests may have failed due to slightly different error messages,
+ math libraries, or output formatting.
+ "Failures" of this type do not indicate a problem with
+ <ProductName>Postgres</ProductName>.
+</Para>
+
+<Para>
+ For a i686/Linux-ELF platform, no tests failed since this is the
+ v6.2.1 regression testing reference platform.
+</Para>
+
+<Para>
+ For the SPARC/Linux-ELF platform, using the 970525 beta version of
+ <ProductName>Postgres</ProductName> v6.2 the following tests "failed":
+ float8 and geometry "failed" due to minor precision differences in
+ floating point numbers. select_views produces massively different output,
+ but the differences are due to minor floating point differences.
+</Para>
+
+<Para>
+ Conclusion? If you do see failures, try to understand the nature of
+ the differences and then decide if those differences will affect your
+ intended use of <ProductName>Postgres</ProductName>. However, keep in mind that this is likely
+ to be the most solid release of <ProductName>Postgres</ProductName> to date, incorporating many
+ bug fixes from v6.1, and that previous versions of <ProductName>Postgres</ProductName> have been
+ in use successfully for some time now.
+</Para>
+
+<Sect2>
+<Title>Comparing expected/actual output</Title>
+
+<Para>
+ The results are in files in the ./results directory. These results
+ can be compared with results in the ./expected directory using 'diff'.
+ The files might not compare exactly. The following paragraphs attempt
+ to explain the differences.
+</Para>
+
+</Sect2>
+
+<Sect2>
+<Title>Error message differences</Title>
+
+<Para>
+ Some of the regression tests involve intentional invalid input values.
+ Error messages can come from either the Postgres code or from the host
+ platform system routines. In the latter case, the messages may vary
+ between platforms, but should reflect similar information. These
+ differences in messages will result in a "failed" regression test which
+ can be validated by inspection.
+</Para>
+
+</Sect2>
+
+<Sect2>
+<Title>OID differences</Title>
+
+<Para>
+ There are several places where PostgreSQL OID (object identifiers) appear
+ in 'regress.out'. OID's are unique 32-bit integers which are generated
+ by the PostgreSQL backend whenever a table row is inserted or updated.
+ If you run the regression test on a non-virgin database or run it multiple
+ times, the OID's reported will have different values.
+
+ The following SQL statements in 'misc.out' have shown this behavior:
+
+ QUERY: SELECT user_relns() AS user_relns ORDER BY user_relns;
+
+ The 'a,523676' row is composed from an OID.
+</Para>
+
+</Sect2>
+
+<Sect2>
+<Title>Date and time differences</Title>
+
+<Para>
+ On many supported platforms, you can force PostgreSQL to believe that it
+ is running in the same time zone as Berkeley, California. See details in
+ the section on how to run the regression tests.
+
+ If you do not explicitly set your time zone environment to PST8PDT, then
+ most of the date and time results will reflect your local time zone and
+ will fail the regression testing.
+
+ There appears to be some systems which do not accept the recommended syntax
+ for explicitly setting the local time zone rules. Some systems using the
+ public domain time zone package exhibit minor problems with pre-1970 PDT
+ times, representing them in PST instead.
+</Para>
+
+</Sect2>
+
+<Sect2>
+<Title>Floating point differences</Title>
+
+<Para>
+ Some of the tests involve computing 64-bit (<Type>float8</Type>) number from table
+ columns. Differences in results involving mathematical functions of
+ <Type>float8</Type> columns have been observed. These differences occur where
+ different operating systems are used on the same platform ie:
+ BSDI and SOLARIS on Intel/86, and where the same operating system is
+ used used on different platforms, ie: SOLARIS on SPARC and Intel/86.
+
+ Human eyeball comparison is needed to determine the real significance
+ of these differences which are usually 10 places to the right of
+ the decimal point.
+
+ Some systems signal errors from pow() and exp() differently from
+ the mechanism expected by the current Postgres code.
+</Para>
+
+</Sect2>
+
+<Sect2>
+<Title>Polygon differences</Title>
+
+<Para>
+ Several of the tests involve operations on geographic date about the
+ Oakland/Berkley CA street map. The map data is expressed as polygons
+ whose vertices are represented as pairs of <Type>float8</Type> numbers (decimal
+ latitude and longitude). Initially, some tables are created and
+ loaded with geographic data, then some views are created which join
+ two tables using the polygon intersection operator (##), then a select
+ is done on the view.
+
+ When comparing the results from different platforms, differences occur
+ in the 2nd or 3rd place to the right of the decimal point. The SQL
+ statements where these problems occur are the folowing:
+
+<ProgramListing>
+ QUERY: SELECT * from street;
+ QUERY: SELECT * from iexit;
+</ProgramListing>
+</Para>
+
+</Sect2>
+
+<Sect2>
+<Title>Random differences</Title>
+
+<Para>
+ There is at least one test case in random.out which is intended to produce
+ random results. This causes random to fail the regression testing.
+ Typing
+<ProgramListing>
+ diff results/random.out expected/random.out
+</ProgramListing>
+
+ should produce only
+ one or a few lines of differences for this reason, but other floating
+ point differences on dissimilar architectures might cause many more
+ differences. See the release notes below.
+</Para>
+
+</Sect2>
+
+<Sect2>
+<Title>The <Quote>expected</Quote> files</Title>
+
+<Para>
+ The <FileName>./expected/*.out</FileName> files were adapted from the original monolithic
+ <FileName>expected.input</FileName> file provided by Jolly Chen et al. Newer versions of these
+ files generated on various development machines have been substituted after
+ careful (?) inspection. Many of the development machines are running a
+ Unix OS variant (FreeBSD, Linux, etc) on Ix86 hardware.
+
+ The original <FileName>expected.input</FileName> file was created on a SPARC Solaris 2.4
+ system using the <FileName>postgres5-1.02a5.tar.gz</FileName> source tree. It was compared
+ with a file created on an I386 Solaris 2.4 system and the differences
+ were only in the floating point polygons in the 3rd digit to the right
+ of the decimal point. (see below)
+
+ The original <FileName>sample.regress.out</FileName> file was from the postgres-1.01 release
+ constructed by Jolly Chen and is included here for reference. It may
+ have been created on a DEC ALPHA machine as the <FileName>Makefile.global</FileName>
+ in the postgres-1.01 release has PORTNAME=alpha.
+</Para>
+
+</Sect2>
+
+</Sect1>
+
+</Chapter>