diff --git a/INSTALL b/INSTALL index d5bb9a4bf1f01e39a7cc83606ca8f71894f5c4c6..70cbecacc974322760efb1de7e1217f36696b3d9 100644 --- a/INSTALL +++ b/INSTALL @@ -1,361 +1,1645 @@ - Installation instructions for PostgreSQL 7.0. -If you haven't gotten the PostgreSQL distribution, get it from -ftp.postgresql.org, then unpack it: - -gunzip postgresql-7.0.tar.gz -tar -xf postgresql-7.0.tar -mv postgresql-7.0 /usr/src + PostgreSQL Installation Guide + The PostgreSQL Development Team + + Edited by + Thomas Lockhart + +PostgreSQL is Copyright © 1996-2000 by PostgreSQL Inc. + +Table of Contents + + Summary + 1. Introduction + 2. Ports + Currently Supported Platforms + Unsupported Platforms + 3. Installation + Before you start + Installation Procedure + 4. Configuration Options + 5. Release Notes + Release 7.0 + Migration to v7.0 + Detailed Change List + 6. Regression Test + +Summary + + + Postgres, developed originally in the UC Berkeley Computer + Science Department, pioneered many of the object-relational + concepts now becoming available in some commercial databases. + It provides SQL92/SQL3 language support, transaction integrity, + and type extensibility. PostgreSQL is an open-source descendant + of this original Berkeley code. + +Chapter 1. Introduction + + + This installation procedure makes some assumptions about the + desired configuration and runtime environment for your system. + This may be adequate for many installations, and is almost + certainly adequate for a first installation. But you may want + to do an initial installation up to the point of unpacking the + source tree and installing documentation, and then print or + browse the Administrator's Guide. + +Chapter 2. Ports + + + This manual describes version 7.0 of Postgres. The Postgres + developer community has compiled and tested Postgres on a + number of platforms. Check the web site + (http://www.postgresql.org/docs/admin/ports.htm) for the latest + information. + +Currently Supported Platforms + + + At the time of publication, the following platforms have been + tested: + + Table 2-1. Supported Platforms + OS Processor Version Reported Remarks + AIX RS6000 v7.0 2000-04-05 Andreas Zeugswetter + 4.3.2 (Andreas.Zeugswetter@telecom.at) + BSDI x86 v7.0 2000-04-04 Bruce Momjian + 4.01 (maillist@candle.pha.pa.us) + Compaq Alpha v7.0 2000-04-11 Andrew McMurry + Tru64 (andrew.mcmurry@astro.uio.no) + FreeBSD x86 v7.0 2000-04-04 Marc Fournier + 4.0 (scrappy@hub.org) + HPUX PA-RISC v7.0 2000-04-12 Both 9.0x and 10.20. Tom Lane + (tgl@sss.pgh.pa.us) + IRIX MIPS v6.5.3 2000-02-18 MIPSPro 7.3.1.1m N32 build. Kevin + 6.5.6f Wheatley (hxpro@cinesite.co.uk) + Linux Alpha v7.0 2000-04-05 With published patches. + 2.0.x Ryan Kirkpatrick + (pgsql@rkirkpat.net) + Linux armv4l v7.0 2000-04-17 Regression test needs work. + 2.2.x Mark Knox + (segfault@hardline.org) + Linux x86 v7.0 2000-03-26 Lamar Owens + 2.2.x (lamar.owen@wgcr.org) + Linux MIPS v7.0 2000-04-13 Cobalt Qube. Tatsuo Ishii + 2.0.x (t-ishii@sra.co.jp) + Linux Sparc v7.0 2000-04-02 Tom Szybist + 2.2.5 (szybist@boxhill.com) + Linux PPC603e v7.0 2000-04-13 Tatsuo Ishii + PPC R4 (t-ishii@sra.co.jp) + mklinux PPC750 v7.0 2000-04-13 Tatsuo Ishii + (t-ishii@sra.co.jp) + NetBSD arm32 v7.0 2000-04-08 Patrick Welche + 1.4 (prlw1@newn.cam.ac.uk) + NetBSD x86 v7.0 2000-03-26 Patrick Welche + 1.4U (prlw1@newn.cam.ac.uk) + NetBSD m68k v7.0 2000-04-10 Mac 8xx. Henry B. Hotz + (hotz@jpl.nasa.gov) + NetBSD- Sparc v7.0 2000-04-13 Tom I Helbekkmo + /sparc (tih@kpnQwest.no) + QNX x86 v7.0 2000-04-01 Dr. Andreas Kardos + 4.25 (kardos@repas-aeg.de) + SCO Open x86 v6.5 1999-05-25 Andrew Merrill + Server 5 (andrew@compclass.com) + SCO UW7 x86 v7.0 2000-04-18 See FAQ. Billy G. Allie + (Bill.Allie@mug.org) + Solaris x86 v7.0 2000-04-12 Marc Fournier + (scrappy@hub.org) + Solaris Sparc v7.0 2000-04-12 Peter Eisentraut + 2.5-.7 (peter_e@gmx.net) + SunOS Sparc v7.0 2000-04-13 Tatsuo Ishii + 4.1.4 (t-ishii@sra.co.jp) + Windows x86 v7.0 2000-04-02 No server-side. Magnus Hagander + Win32 (mha@sollentuna.net) + WinNT x86 v7.0 2000-03-30 Uses Cygwin library. Daniel Horak + Cygwin (horak@sit.plzen-city.cz) + + + + + Note: For Windows NT, the server-side port of Postgres uses + the RedHat/Cygnus Cygwin library and toolset. For Windows + 9x, no server-side port is available due to OS limitations. + +Unsupported Platforms + + + Platforms listed for v6.3.x-v6.5.x should also work with v7.0, + but we did not receive explicit confirmation of such at the + time this list was compiled. We include these here to let you + know that these platforms could be supported if given some + attention. + At the time of publication, the following platforms have not + been tested for v7.0 or v6.5.x: + + Table 2-2. Unsupported Platforms + OS Processor Version Reported Remarks + BeOS x86 v7.0 2000-05-01 Client-side coming soon? + Adam Haberlach + (adam@newsnipple.com) + DGUX m88k v6.3 1998-03-01 v6.4 probably OK. Needs new + 5.4R4.11 maintainer. Brian E Gallew + (geek+@cmu.edu) + NetBSD NS32532 v6.4 1998-10-27 Date/time math annoyances. + current Jon Buller (jonb@metronet.com) + NetBSD VAX v6.3 1998-03-01 v7.0 should work. Tom I Helbekkmo + 1.3 (tih@kpnQwest.no) + SVR4 4.4 m88k v6.2.1 1998-03-01 v6.4.x will need TAS spinlock + code. Doug Winterburn + (dlw@seavme.xroads.com) + SVR4 MIPS v6.4 1998-10-28 No 64-bit int. Frank Ridderbusch + (ridderbusch.pad@sni.de) + Ultrix MIPS, VAX v6.x 1998-03-01 No recent reports; obsolete? + + + + There are a few platforms which have been attempted and which + have been reported to not work with the standard distribution. + Others listed here do not provide sufficient library support + for an attempt. + + Table 2-3. Incompatible Platforms + OS Processor Version Reported Remarks + MacOS all v6.x 1998-03-01 Not library compatible; use + ODBC/JDBC + NextStep x86 v6.x 1998-03-01 Client-only support; v1.0.9 + worked with patches David + Wetzel + (dave@turbocat.de) + + + +Chapter 3. Installation + + + Installation instructions for PostgreSQL 7.0. + + If you haven't gotten the PostgreSQL distribution, get it from + ftp.postgresql.org (ftp://ftp.postgresql.org), then unpack it: + + > gunzip postgresql-7.0.tar.gz + > tar -xf postgresql-7.0.tar + > mv postgresql-7.0 /usr/src + + + Before you start -Building PostgreSQL requires GNU make. It will not work with other make -programs. On GNU/Linux systems GNU make is the default tool, on other -systems you may find that GNU make is installed under the name "gmake". We -will use that name from now on to indicate GNU make, no matter what name it -has on your system. To test for GNU make enter - -gmake --version - -If you need to get GNU make, you can find it at ftp://ftp.gnu.org. - -Up to date information on supported platforms is at -http://www.postgresql.org/docs/admin/ports.htm. In general, most -Unix-compatible platforms with modern libraries should be able to run -PostgreSQL. In the doc subdirectory of the distribution are several -platform-specific FAQ and README documents you might wish to consult if you -are having trouble. - -Although the minimum required memory for running PostgreSQL can be as little -as 8MB, there are noticable speed improvements when expanding memory up to -96MB or beyond. The rule is you can never have too much memory. - -Check that you have sufficient disk space. You will need about 30 Mbytes for -the source tree during compilation and about 5 Mbytes for the installation -directory. An empty database takes about 1 Mbyte, otherwise they take about -five times the amount of space that a flat text file with the same data -would take. If you run the regression tests you will temporarily need an -extra 20MB. - -To check for disk space, use - -df -k - -Considering today's prices for hard disks, getting a large and fast hard -disk should probably be in your plans before putting a database into -production use. + Building PostgreSQL requires GNU make. It will not work with + other make programs. On GNU/Linux systems GNU make is the + default tool, on other systems you may find that GNU make is + installed under the name gmake. We will use that name from now + on to indicate GNU make, no matter what name it has on your + system. To test for GNU make enter + + > gmake --version + + + If you need to get GNU make, you can find it at + ftp://ftp.gnu.org. + Up to date information on supported platforms is at + http://www.postgresql.org/docs/admin/ports.htm + (http://www.postgresql.org/docs/admin/ports.htm). In general, + most Unix-compatible platforms with modern libraries should be + able to run PostgreSQL. In the doc subdirectory of the + distribution are several platform-specific FAQ and README + documents you might wish to consult if you are having trouble. + Although the minimum required memory for running PostgreSQL + can be as little as 8MB, there are noticeable speed + improvements when expanding memory up to 96MB or beyond. The + rule is you can never have too much memory. + Check that you have sufficient disk space. You will need about + 30 Mbytes for the source tree during compilation and about 5 + Mbytes for the installation directory. An empty database takes + about 1 Mbyte, otherwise they take about five times the amount + of space that a flat text file with the same data would take. + If you run the regression tests you will temporarily need an + extra 20MB. + To check for disk space, use + + > df -k + + + Considering today's prices for hard disks, getting a large and + fast hard disk should probably be in your plans before putting + a database into production use. Installation Procedure -PostgreSQL Installation - -For a fresh install or upgrading from previous releases of PostgreSQL: - - 1. Create the PostgreSQL superuser account. This is the user the server - will run as. For production use you should create a separate, - unprivileged account (postgres is commonly used). If you do not have - root access or just want to play around, your own user account is - enough. - - Running PostgreSQL as root, bin, or any other account with special - access rights is a security risk and therefore won't be allowed. - - You need not do the building and installation itself under this account - (although you can). You will be told when you need to login as the - database superuser. - - 2. If you are not upgrading an existing system then skip to step 4. - - You now need to back up your existing database. To dump your fairly - recent post-6.0 database installation, type - - pg_dumpall > db.out - - If you wish to preserve object id's (oids), then use the -o option when - running pg_dumpall. However, unless you have a special reason for doing - this (such as using OIDs as keys in tables), don't do it. - - Make sure to use the pg_dumpall command from the version you are - currently running. However, do not use the pg_dumpall script from 6.0 - or everything will be owned by the PostgreSQL super user. In that case - you should grab pg_dumpall from a later 6.x.x release. 7.0's pg_dumpall - will not work on older databases. If you are upgrading from a version - prior to Postgres95 v1.09 then you must back up your database, install - Postgres95 v1.09, restore your database, then back it up again. - - Caution - You must make sure that your database is not updated in the middle of your - backup. If necessary, bring down postmaster, edit the permissions in file - /usr/local/pgsql/data/pg_hba.conf to allow only you on, then bring - postmaster back up. - 3. If you are upgrading an existing system then kill the database server - now. Type - - ps ax | grep postmaster - - or - - ps -e | grep postmaster - - (It depends on your system which one of these two works. No harm can be - done by typing the wrong one.) This should list the process numbers for - a number of processes, similar to this: - - 263 ? SW 0:00 (postmaster) - 777 p1 S 0:00 grep postmaster - - Type the following line, with pid replaced by the process id for - process postmaster (263 in the above case). (Do not use the id for the - process "grep postmaster".) - - kill pid - - Tip: On systems which have PostgreSQL started at boot time, - there is probably a startup file which will accomplish the - same thing. For example, on a Redhat Linux system one might - find that - - /etc/rc.d/init.d/postgres.init stop - - works. - - Also move the old directories out of the way. Type the following: - - mv /usr/local/pgsql /usr/local/pgsql.old - - or replace your particular paths. - - 4. Configure the source code for your system. It is this step at which you - can specify your actual installation path for the build process and - make choices about what gets installed. Change into the src - subdirectory and type: - - ./configure - - followed by any options you might want to give it. For a first - installation you should be able to do fine without any. For a complete - list of options, type: - - ./configure --help - - Some of the more commonly used ones are: - - --prefix=BASEDIR - - Selects a different base directory for the installation of - PostgreSQL. The default is /usr/local/pgsql. - - --enable-locale - - If you want to use locales. - - --enable-multibyte - - Allows the use of multibyte character encodings. This is primarily - for languages like Japanese, Korean, or Chinese. - - --with-perl - - Builds the Perl interface. Please note that the Perl interface - will be installed into the usual place for Perl modules (typically - under /usr/lib/perl), so you must have root access to use this - option successfully. - - --with-odbc - - Builds the ODBC driver package. - - --with-tcl - - Builds interface libraries and programs requiring Tcl/Tk, - including libpgtcl, pgtclsh, and pgtksh. - - 5. Compile the program. Type - - gmake - - The compilation process can take anywhere from 10 minutes to an hour. - Your milage will most certainly vary. Remember to use GNU make. - - The last line displayed will hopefully be - - All of PostgreSQL is successfully made. Ready to install. - - 6. Install the program. Type - - gmake install - - 7. Tell your system how to find the new shared libraries. How to do this - varies between platforms. What tends to work everywhere is to set the - environment variable LD_LIBRARY_PATH: - - LD_LIBRARY_PATH=/usr/local/pgsql/lib - export LD_LIBRARY_PATH - - on sh, ksh, bash, zsh or - - setenv LD_LIBRARY_PATH /usr/local/pgsql/lib - - on csh or tcsh. You might want to put this into a shell startup file - such as /etc/profile. - - On some systems the following is the preferred method, but you must - have root access. Edit file /etc/ld.so.conf to add a line - - /usr/local/pgsql/lib - - Then run command /sbin/ldconfig. - - If in doubt, refer to the manual pages of your system. If you later on - get a message like - - psql: error in loading shared libraries - libpq.so.2.1: cannot open shared object file: No such file or directory - - then the above was necessary. Simply do this step then. - - 8. Create the database installation. To do this you must log in to your - PostgreSQL superuser account. It will not work as root. - - mkdir /usr/local/pgsql/data - chown postgres /usr/local/pgsql/data - su - postgres - /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data - - The -D option specifies the location where the data will be stored. You - can use any path you want, it does not have to be under the - installation directory. Just make sure that the superuser account can - write to the directory (or create it) before starting initdb. (If you - have already been doing the installation up to now as the PostgreSQL - superuser, you may have to log in as root temporarily to create the - data directory.) - - 9. The previous step should have told you how to start up the database - server. Do so now. - - /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data - - This will start the server in the foreground. To make it detach to the - background, use the -S. - - 10. If you are upgrading from an existing installation, dump your data back - in: - - /usr/local/pgsql/bin/psql -d template1 -f db.out - - You also might want to copy over the old pg_hba.conf file and any other - files you might have had set up for authentication, such as password - files. - -This concludes the installation proper. To make your life more productive -and enjoyable you should look at the following optional steps and -suggestions. - - * Life will be more convenient if you set up some enviroment variables. - First of all you probably want to include /usr/local/pgsql/bin (or - equivalent) into your PATH. To do this, add the following to your shell - startup file, such as ~/.bash_profile (or /etc/profile, if you want it - to affect every user): - - PATH=$PATH:/usr/local/pgsql/bin - - Furthermore, if you set PGDATA in the environment of the PostgreSQL - superuser, you can omit the -D for postmaster and initdb. - - * You probably want to install the man and HTML documentation. Type - - cd /usr/src/pgsql/postgresql-7.0/doc - gmake install - - This will install files under /usr/local/pgsql/doc and - /usr/local/pgsql/man. To enable your system to find the man - documentation, you need to add a line like the following to a shell - startup file: - - MANPATH=$MANPATH:/usr/local/pgsql/man - - The documentation is also available in Postscript format. If you have a - Postscript printer, or have your machine already set up to accept - Postscript files using a print filter, then to print the User's Guide - simply type - - cd /usr/local/pgsql/doc - gunzip -c user.ps.tz | lpr - - Here is how you might do it if you have Ghostscript on your system and - are writing to a laserjet printer. - - gunzip -c user.ps.gz | gs -sDEVICE=laserjet -r300 -q -dNOPAUSE -sOutputFile=- | lpr - - Printer setups can vary wildly from system to system. If in doubt, - consult your manuals or your local expert. - - The Adminstrator's Guide should probably be your first reading if you - are completely new to PostgreSQL, as it contains information about how - to set up database users and authentication. - - * Usually, you will want to modify your computer so that it will - automatically start the database server whenever it boots. This is not - required; the PostgreSQL server can be run successfully from - non-privileged accounts without root intervention. - - Different systems have different conventions for starting up daemons at - boot time, so you are advised to familiarize yourself with them. Most - systems have a file /etc/rc.local or /etc/rc.d/rc.local which is almost - certainly no bad place to put such a command. Whatever you do, - postmaster must be run by the PostgreSQL superuser (postgres) and not - by root or any other user. Therefore you probably always want to form - your command lines along the lines of su -c '...' postgres. - - It might be advisable to keep a log of the server output. To start the - server that way try: - - nohup su -c 'postmaster -D /usr/local/pgsql/data > server.log 2>&1' postgres & - - Here are a few more operating system specific suggestions. - - o Edit file rc.local on NetBSD or file rc2.d on SPARC Solaris 2.5.1 - to contain the following single line: - - su postgres -c "/usr/local/pgsql/bin/postmaster -S -D /usr/local/pgsql/data" - - o In FreeBSD 2.2-RELEASE edit /usr/local/etc/rc.d/pgsql.sh to - contain the following lines and make it chmod 755 and chown - root:bin. - - #!/bin/sh - [ -x /usr/local/pgsql/bin/postmaster ] && { - su -l pgsql -c 'exec /usr/local/pgsql/bin/postmaster - -D/usr/local/pgsql/data - -S -o -F > /usr/local/pgsql/errlog' & - echo -n ' pgsql' - } - - You may put the line breaks as shown above. The shell is smart - enough to keep parsing beyond end-of-line if there is an - expression unfinished. The exec saves one layer of shell under the - postmaster process so the parent is init. - - o In RedHat Linux add a file /etc/rc.d/init.d/postgres.init which is - based on the example in contrib/linux/. Then make a softlink to - this file from /etc/rc.d/rc5.d/S98postgres.init. - - * Run the regression tests. The regression tests are a test suite to - verify that PostgreSQL runs on your machine in the way the developers - expected it to. You should definitely do this before putting a server - into production use. The file - /usr/src/pgsql/postgresql-7.0/src/test/regress/README has detailed - instructions for running and interpreting the regression tests. - -To start "playing around", set up the paths as explained above and start the -server. To create a database, type - -createdb testdb - -Then enter - -psql testdb -to connect to that database. At the prompt you can enter SQL and start -experimenting. + PostgreSQL Installation + For a fresh install or upgrading from previous releases of + PostgreSQL: + 1. Create the PostgreSQL superuser account. This is the user + the server will run as. For production use you should create + a separate, unprivileged account (postgres is commonly + used). If you do not have root access or just want to play + around, your own user account is enough. + Running PostgreSQL as root, bin, or any other account with + special access rights is a security risk; don't do it. The + postmaster will in fact refuse to start as root. + You need not do the building and installation itself under + this account (although you can). You will be told when you + need to login as the database superuser. + 2. Configure the source code for your system. It is this step + at which you can specify your actual installation path for + the build process and make choices about what gets + installed. Change into the src subdirectory and type: + > ./configure + + followed by any options you might want to give it. For a + first installation you should be able to do fine without + any. For a complete list of options, type: + > ./configure --help + + Some of the more commonly used ones are: + + --prefix=BASEDIR + Selects a different base directory for the installation + of PostgreSQL. The default is /usr/local/pgsql. + + --enable-locale + If you want to use locales. + + --enable-multibyte + Allows the use of multibyte character encodings. This is + primarily for languages like Japanese, Korean, or Chinese. + + --with-perl + Builds the Perl interface and plperl extension language. + Please note that the Perl interface needs to be installed + into the usual place for Perl modules (typically under + /usr/lib/perl), so you must have root access to perform + the installation step. (It is often easiest to leave out + --with-perl initially, and then build and install the Perl + interface after completing the installation of PostgreSQL + itself.) + + --with-odbc + Builds the ODBC driver package. + + --with-tcl + Builds interface libraries and programs requiring Tcl/Tk, + including libpgtcl, pgtclsh, and pgtksh. + + 3. Compile the program. Type + > gmake + + The compilation process can take anywhere from 10 minutes + to an hour. Your mileage will most certainly vary. Remember + to use GNU make. + The last line displayed will hopefully be + All of PostgreSQL is successfully made. Ready to install. + + + 4. If you want to test the newly built server before you + install it, you can run the regression tests at this point. + The regression tests are a test suite to verify that + PostgreSQL runs on your machine in the way the developers + expected it to. For detailed instructions see Regression + Test. (Be sure to use the "parallel regress test" method, + since the sequential method only works with an + already-installed server.) + 5. If you are not upgrading an existing system then skip to + step 7. + You now need to back up your existing database. To dump + your fairly recent post-6.0 database installation, type + > pg_dumpall > db.out + + If you wish to preserve object id's (oids), then use the -o + option when running pg_dumpall. However, unless you have a + special reason for doing this (such as using OIDs as keys in + tables), don't do it. + Make sure to use the pg_dumpall command from the version + you are currently running. 7.0's pg_dumpall will not work on + older databases. However, if you are still using 6.0, do not + use the pg_dumpall script from 6.0 or everything will be + owned by the PostgreSQL superuser after you reload. In that + case you should grab pg_dumpall from a later 6.x.x release. + If you are upgrading from a version prior to Postgres95 + v1.09 then you must back up your database, install + Postgres95 v1.09, restore your database, then back it up + again. + + Caution + + You must make sure that your database is not updated + in the middle of your backup. If necessary, bring down + postmaster, edit the permissions in file + /usr/local/pgsql/data/pg_hba.conf to allow only you on, + then bring postmaster back up. + + + + 6. If you are upgrading an existing system then kill the + database server now. Type + > ps ax | grep postmaster + + or + > ps -e | grep postmaster + + (It depends on your system which one of these two works. No + harm can be done by typing the wrong one.) This should list + the process numbers for a number of processes, similar to + this: + 263 ? SW 0:00 (postmaster) + 777 p1 S 0:00 grep postmaster + + Type the following line, with pid replaced by the process + id for process postmaster (263 in the above case). (Do not + use the id for the process "grep postmaster".) + > kill pid + + + + Tip: On systems which have PostgreSQL started at boot + time, there is probably a startup file that will + accomplish the same thing. For example, on a Redhat Linux + system one might find that + > /etc/rc.d/init.d/postgres.init stop + + works. + + Also move the old directories out of the way. Type the + following: + > mv /usr/local/pgsql /usr/local/pgsql.old + + (substitute your particular paths). + 7. Install the PostgreSQL executable files and libraries. Type + > gmake install + + + You should do this step as the user that you want the + installed executables to be owned by. This does not have to + be the same as the database superuser; some people prefer to + have the installed files be owned by root. + 8. If necessary, tell your system how to find the new shared + libraries. How to do this varies between platforms. The most + widely usable method is to set the environment variable + LD_LIBRARY_PATH: + > LD_LIBRARY_PATH=/usr/local/pgsql/lib + > export LD_LIBRARY_PATH + + on sh, ksh, bash, zsh or + > setenv LD_LIBRARY_PATH /usr/local/pgsql/lib + + on csh or tcsh. You might want to put this into a shell + startup file such as /etc/profile. + On some systems the following is the preferred method, but + you must have root access. Edit file /etc/ld.so.conf to add + a line + /usr/local/pgsql/lib + + Then run command /sbin/ldconfig. + If in doubt, refer to the manual pages of your system. If + you later on get a message like + psql: error in loading shared libraries + libpq.so.2.1: cannot open shared object file: No such file + or directory + + then the above was necessary. Simply do this step then. + 9. Create the database installation (the working data files). + To do this you must log in to your PostgreSQL superuser + account. It will not work as root. + > mkdir /usr/local/pgsql/data + > chown postgres /usr/local/pgsql/data + > su - postgres + > /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data + + + The -D option specifies the location where the data will be + stored. You can use any path you want, it does not have to + be under the installation directory. Just make sure that the + superuser account can write to the directory (or create it, + if it doesn't already exist) before starting initdb. (If you + have already been doing the installation up to now as the + PostgreSQL superuser, you may have to log in as root + temporarily to create the data directory underneath a + root-owned directory.) + 10. The previous step should have told you how to start up + the database server. Do so now. The command should look + something like + > /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data + + This will start the server in the foreground. To make it + detach to the background, you can use the -S option, but + then you won't see any log messages the server produces. A + better way to put the server in the background is + > nohup /usr/local/pgsql/bin/postmaster -D + /usr/local/pgsql/data \ + </dev/null >>server.log 2>>1 & + + + 11. If you are upgrading from an existing installation, + dump your data back in: + > /usr/local/pgsql/bin/psql -d template1 -f db.out + + You also might want to copy over the old pg_hba.conf file + and any other files you might have had set up for + authentication, such as password files. + + This concludes the installation proper. To make your life more + productive and enjoyable you should look at the following + optional steps and suggestions. + o Life will be more convenient if you set up some environment + variables. First of all you probably want to include + /usr/local/pgsql/bin (or equivalent) into your PATH. To do + this, add the following to your shell startup file, such as + ~/.bash_profile (or /etc/profile, if you want it to affect + every user): + > PATH=$PATH:/usr/local/pgsql/bin + + + Furthermore, if you set PGDATA in the environment of the + PostgreSQL superuser, you can omit the -D for postmaster and + initdb. + o You probably want to install the man and HTML documentation. + Type + > cd /usr/src/pgsql/postgresql-7.0/doc + > gmake install + + This will install files under /usr/local/pgsql/doc and + /usr/local/pgsql/man. To enable your system to find the man + documentation, you need to add a line like the following to a + shell startup file: + > MANPATH=$MANPATH:/usr/local/pgsql/man + + + The documentation is also available in Postscript format. If + you have a Postscript printer, or have your machine already + set up to accept Postscript files using a print filter, then + to print the User's Guide simply type + > cd /usr/local/pgsql/doc + > gunzip -c user.ps.tz | lpr + + Here is how you might do it if you have Ghostscript on your + system and are writing to a laserjet printer. + > gunzip -c user.ps.gz \ + | gs -sDEVICE=laserjet -r300 -q -dNOPAUSE -sOutputFile=- + \ + | lpr + + Printer setups can vary wildly from system to system. If in + doubt, consult your manuals or your local expert. + The Adminstrator's Guide should probably be your first + reading if you are completely new to PostgreSQL, as it + contains information about how to set up database users and + authentication. + o Usually, you will want to modify your computer so that it + will automatically start the database server whenever it + boots. This is not required; the PostgreSQL server can be run + successfully from non-privileged accounts without root + intervention. + Different systems have different conventions for starting up + daemons at boot time, so you are advised to familiarize + yourself with them. Most systems have a file /etc/rc.local or + /etc/rc.d/rc.local which is almost certainly no bad place to + put such a command. Whatever you do, postmaster must be run + by the PostgreSQL superuser (postgres) and not by root or any + other user. Therefore you probably always want to form your + command lines along the lines of su -c '...' postgres. + It might be advisable to keep a log of the server output. To + start the server that way try: + > nohup su -c 'postmaster -D /usr/local/pgsql/data > + server.log 2>&1' postgres & + + + Here are a few more operating system specific suggestions. + o Edit file rc.local on NetBSD or file rc2.d on SPARC Solaris + 2.5.1 to contain the following single line: + > su postgres -c "/usr/local/pgsql/bin/postmaster -S -D + /usr/local/pgsql/data" + + + o In FreeBSD 2.2-RELEASE edit /usr/local/etc/rc.d/pgsql.sh to + contain the following lines and make it chmod 755 and chown + root:bin. + #!/bin/sh + [ -x /usr/local/pgsql/bin/postmaster ] && { + su -l pgsql -c 'exec /usr/local/pgsql/bin/postmaster + -D/usr/local/pgsql/data + -S -o -F > /usr/local/pgsql/errlog' & + echo -n ' pgsql' + } + + You may put the line breaks as shown above. The shell is + smart enough to keep parsing beyond end-of-line if there is + an expression unfinished. The exec saves one layer of shell + under the postmaster process so the parent is init. + o In RedHat Linux add a file /etc/rc.d/init.d/postgres.init + which is based on the example in contrib/linux/. Then make a + softlink to this file from /etc/rc.d/rc5.d/S98postgres.init. + + o Run the regression tests against the installed server (using + the sequential test method). If you didn't run the tests + before installation, you should definitely do it now. For + detailed instructions see Regression Test. + To start experimenting with Postgres, set up the paths as + explained above and start the server. To create a database, + type + + > createdb testdb + + + Then enter + + > psql testdb + + + to connect to that database. At the prompt you can enter SQL + commands and start experimenting. +Chapter 4. Configuration Options + + +Parameters for Configuration (configure) + + + The full set of parameters available in configure can be + obtained by typing + + $ ./configure --help + + + + The following parameters may be of interest to installers: + + Directories to install PostgreSQL in: + --prefix=PREFIX install architecture-independent files + [/usr/local/pgsql] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --libdir=DIR object code libraries in DIR + [EPREFIX/lib] + --includedir=DIR C header files in DIR + [PREFIX/include] + --mandir=DIR man documentation in DIR [PREFIX/man] + Features and packages: + --disable-FEATURE do not include FEATURE + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE + --enable and --with options recognized: + --with-template=template + use operating system template file + see template directory + --with-includes=dirs look for header files for tcl/tk, etc + --with-libraries=dirs look for additional libraries in DIRS + --with-libs=dirs alternate for --with-libraries + --enable-locale enable locale support + --enable-recode enable cyrillic recode support + --enable-multibyte enable multibyte character support + --with-pgport=portnum change default postmaster port + --with-maxbackends=n set default maximum number of processes + --with-tcl build Tcl interfaces and pgtclsh + --with-tclconfig=tcldir + tclConfig.sh and tkConfig.sh location + --with-perl build Perl interface and plperl + --with-odbc build ODBC driver package + --with-odbcinst=odbcdir + default directory for odbcinst.ini + --enable-cassert enable assertion checks + --enable-debug build with debugging symbols (-g) + --with-CC=compiler + use specific C compiler + --with-CXX=compiler + use specific C++ compiler + --without-CXX prevent building C++ code + + + + Some systems may have trouble building a specific feature of + Postgres. For example, systems with a damaged C++ compiler may + need to specify --without-CXX to instruct the build procedure + to skip construction of libpq++. + Use the --with-includes and --with-libraries options if you + want to build Postgres using include files or libraries that + are not installed in your system's standard search path. For + example, you might use these to build with an experimental + version of Tcl. If you need to specify more than one + nonstandard directory for include files or libraries, do it + like this: + + --with-includes="/opt/tcl/include /opt/perl5/include" + + + + +Parameters for Building (make) + + + Many installation-related parameters can be set in the + building stage of Postgres installation. + In most cases, these parameters should be placed in a file, + Makefile.custom, intended just for that purpose. The default + distribution does not contain this optional file, so you will + create it using a text editor of your choice. When upgrading + installations, you can simply copy your old Makefile.custom to + the new installation before doing the build. + Alternatively, you can set variables on the make command line: + + make [ variable=value [...] ] + + + + A few of the many variables that can be specified are: + + POSTGRESDIR + Top of the installation tree. + + BINDIR + Location of applications and utilities. + + LIBDIR + Location of object libraries, including shared libraries. + + HEADERDIR + Location of include files. + + ODBCINST + Location of installation-wide psqlODBC (ODBC) configuration + file. + + There are other optional parameters which are not as commonly + used. Many of those listed below are appropriate when doing + Postgres server code development. + + CFLAGS + Set flags for the C compiler. Should be assigned with "+=" + to retain relevant default parameters. + + YFLAGS + Set flags for the yacc/bison parser. -v might be used to + help diagnose problems building a new parser. Should be + assigned with "+=" to retain relevant default parameters. + + USE_TCL + Enable Tcl interface building. + + HSTYLE + DocBook HTML style sheets for building the documentation + from scratch. Not used unless you are developing new + documentation from the DocBook-compatible SGML source + documents in doc/src/sgml/. + + PSTYLE + DocBook style sheets for building printed documentation + from scratch. Not used unless you are developing new + documentation from the DocBook-compatible SGML source + documents in doc/src/sgml/. + + Here is an example Makefile.custom for a PentiumPro Linux + system: + + # Makefile.custom + # Thomas Lockhart 1999-06-01 + + POSTGRESDIR= /opt/postgres/current + CFLAGS+= -m486 -O2 + + # documentation + + HSTYLE= /home/tgl/SGML/db118.d/docbook/html + PSTYLE= /home/tgl/SGML/db118.d/docbook/print + + + + +Locale Support + + + + + Note: Written by Oleg Bartunov. See Oleg's web page + (http://www.sai.msu.su/~megera/postgres/) for additional + information on locale and Russian language support. + + While doing a project for a company in Moscow, Russia, I + encountered the problem that postgresql had no support of + national alphabets. After looking for possible workarounds I + decided to develop support of locale myself. I'm not a + C-programer but already had some experience with locale + programming when I work with perl (debugging) and glimpse. + After several days of digging through the Postgres source tree + I made very minor corections to src/backend/utils/adt/varlena.c + and src/backend/main/main.c and got what I needed! I did + support only for LC_CTYPE and LC_COLLATE, but later LC_MONETARY + was added by others. I got many messages from people about this + patch so I decided to send it to developers and (to my + surprise) it was incorporated into the Postgres distribution. + People often complain that locale doesn't work for them. There + are several common mistakes: + o Didn't properly configure postgresql before compilation. You + must run configure with --enable-locale option to enable + locale support. Didn't setup environment correctly when + starting postmaster. You must define environment variables + LC_CTYPE and LC_COLLATE before running postmaster because + backend gets information about locale from environment. I use + following shell script (runpostgres): + #!/bin/sh + + export LC_CTYPE=koi8-r + export LC_COLLATE=koi8-r + postmaster -B 1024 -S -D/usr/local/pgsql/data/ -o + '-Fe' + + and run it from rc.local as + /bin/su - postgres -c "/home/postgres/runpostgres" + + + o Broken locale support in OS (for example, locale support in + libc under Linux several times has changed and this caused a + lot of problems). Latest perl has also support of locale and + if locale is broken perl -v will complain something like: + 8:17[mira]:~/WWW/postgres>setenv LC_CTYPE not_exist + 8:18[mira]:~/WWW/postgres>perl -v + perl: warning: Setting locale failed. + perl: warning: Please check that your locale settings: + LC_ALL = (unset), + LC_CTYPE = "not_exist", + LANG = (unset) + are supported and installed on your system. + perl: warning: Falling back to the standard locale + ("C"). + + + o Wrong location of locale files! Possible locations include: + /usr/lib/locale (Linux, Solaris), /usr/share/locale (Linux), + /usr/lib/nls/loc (DUX 4.0). Check man locale to find the + correct location. Under Linux I did a symbolic link between + /usr/lib/locale and /usr/share/locale to be sure that the + next libc will not break my locale. + + +What are the Benefits? + + + You can use ~* and order by operators for strings contain + characters from national alphabets. Non-english users + definitely need that. If you won't use locale stuff just + undefine the USE_LOCALE variable. + +What are the Drawbacks? + + + There is one evident drawback of using locale - its speed! So, + use locale only if you really need it. + +Kerberos Authentication + + + Kerberos is an industry-standard secure authentication system + suitable for distributed computing over a public network. + +Availability + + + The Kerberos authentication system is not distributed with + Postgres. Versions of Kerberos are typically available as + optional software from operating system vendors. In addition, a + source code distribution may be obtained through MIT Project + Athena (ftp://athena-dist.mit.edu). + + Note: You may wish to obtain the MIT version even if your + vendor provides a version, since some vendor ports have been + deliberately crippled or rendered non-interoperable with the + MIT version. + + Users located outside the United States of America and Canada + are warned that distribution of the actual encryption code in + Kerberos is restricted by U. S. Government export regulations. + Inquiries regarding your Kerberos should be directed to your + vendor or MIT Project Athena (info-kerberos@athena.mit.edu). + Note that FAQLs (Frequently-Asked Questions Lists) are + periodically posted to the Kerberos mailing list + (mailto:kerberos@athena.mit.edu) (send mail to subscribe + (mailto:kerberos-request@athena.mit.edu)), and USENET news + group (news:comp.protocols.kerberos). + +Installation + + + Installation of Kerberos itself is covered in detail in the + Kerberos Installation Notes . Make sure that the server key + file (the srvtab or keytab) is somehow readable by the Postgres + account. + Postgres and its clients can be compiled to use either Version + 4 or Version 5 of the MIT Kerberos protocols by setting the + KRBVERS variable in the file src/Makefile.global to the + appropriate value. You can also change the location where + Postgres expects to find the associated libraries, header files + and its own server key file. + After compilation is complete, Postgres must be registered as + a Kerberos service. See the Kerberos Operations Notes and + related manual pages for more details on registering services. + +Operation + + + After initial installation, Postgres should operate in all + ways as a normal Kerberos service. For details on the use of + authentication, see the PostgreSQL User's Guide reference + sections for postmaster and psql. + In the Kerberos Version 5 hooks, the following assumptions are + made about user and service naming: + o User principal names (anames) are assumed to contain the + actual Unix/Postgres user name in the first component. + o The Postgres service is assumed to be have two components, + the service name and a hostname, canonicalized as in Version + 4 (i.e., with all domain suffixes removed). + + + + Table 4-1. Kerberos Parameter Examples + Param- Example + eter + user frew@S2K.ORG + user aoki/HOST=miyu.S2K.Berkeley.EDU@S2K.- + ORG + host postgres_dbms/ucbvax@S2K.ORG + + + + Support for Version 4 will disappear sometime after the + production release of Version 5 by MIT. + +Chapter 5. Release Notes + + +Release 7.0 + + + This release contains improvements in many areas, + demonstrating the continued growth of PostgreSQL. There are + more improvements and fixes in 7.0 than in any previous + release. The developers have confidence that this is the best + release yet; we do our best to put out only solid releases, and + this one is no exception. + Major changes in this release: + + Foreign Keys + Foreign keys are now implemented, with the exception of + PARTIAL MATCH foreign keys. Many users have been asking for + this feature, and we are pleased to offer it. + + Optimizer Overhaul + Continuing on work started a year ago, the optimizer has + been improved, allowing better query plan selection and + faster performance with less memory usage. + + Updated psql + psql, our interactive terminal monitor, has been updated + with a variety of new features. See the psql manual page for + details. + + Join Syntax + SQL92 join syntax is now supported, though only as INNER + JOINs for this release. JOIN, NATURAL JOIN, JOIN/USING, + JOIN/ON are available, as are column correlation names. + + +Migration to v7.0 + + + A dump/restore using pg_dump is required for those wishing to + migrate data from any previous release of Postgres. For those + upgrading from 6.5.*, you may instead use pg_upgrade to upgrade + to this release; however, a full dump/reload installation is + always the most robust method for upgrades. + Interface and compatibility issues to consider for the new + release include: + o The date/time types datetime and timespan have been + superceded by the SQL92-defined types timestamp and interval. + Although there has been some effort to ease the transition by + allowing Postgres to recognize the deprecated type names and + translate them to the new type names, this mechanism may not + be completely transparent to your existing application. + o The optimizer has been substantially improved in the area of + query cost estimation. In some cases, this will result in + decreased query times as the optimizer makes a better choice + for the preferred plan. However, in a small number of cases, + usually involving pathological distributions of data, your + query times may go up. If you are dealing with large amounts + of data, you may want to check your queries to verify + performance. + o The JDBC and ODBC interfaces have been upgraded and + extended. + o The string function CHAR_LENGTH is now a native function. + Previous versions translated this into a call to LENGTH, + which could result in ambiguity with other types implementing + LENGTH such as the geometric types. + + +Detailed Change List + + + + + Bug Fixes + --------- + Prevent function calls exceeding maximum number of arguments (Tom) + Improve CASE construct (Tom) + Fix SELECT coalesce(f1,0) FROM int4_tbl GROUP BY f1 (Tom) + Fix SELECT sentence.words[0] FROM sentence GROUP BY + sentence.words[0] (Tom) + Fix GROUP BY scan bug (Tom) + Improvements in SQL grammar processing (Tom) + Fix for views involved in INSERT ... SELECT ... (Tom) + Fix for SELECT a/2, a/2 FROM missing_target GROUP BY a/2 (Tom) + Fix for subselects in INSERT ... SELECT (Tom) + Prevent INSERT ... SELECT ... ORDER BY (Tom) + Fixes for relations greater than 2GB, including vacuum + Improve propagating system table changes to other backends (Tom) + Improve propagating user table changes to other backends (Tom) + Fix handling of temp tables in complex situations (Bruce, Tom) + Allow table locking at table open, improving concurrent + reliability (Tom) + Properly quote sequence names in pg_dump (Ross J. Reedstrom) + Prevent DROP DATABASE while others accessing + Prevent any rows from being returned by GROUP BY if no rows + processed (Tom) + Fix SELECT COUNT(1) FROM table WHERE ...' if no rows matching + WHERE (Tom) + Fix pg_upgrade so it works for MVCC (Tom) + Fix for SELECT ... WHERE x IN (SELECT ... HAVING SUM(x) > 1) (Tom) + Fix for "f1 datetime DEFAULT 'now'" (Tom) + Fix problems with CURRENT_DATE used in DEFAULT (Tom) + Allow comment-only lines, and ;;; lines too. (Tom) + Improve recovery after failed disk writes, disk full (Hiroshi) + Fix cases where table is mentioned in FROM but not joined (Tom) + Allow HAVING clause without aggregate functions (Tom) + Fix for "--" comment and no trailing newline, as seen in perl + Improve pg_dump failure error reports (Bruce) + Allow sorts and hashes to exceed 2GB file sizes (Tom) + Fix for pg_dump dumping of inherited rules (Tom) + Fix for NULL handling comparisons (Tom) + Fix inconsistent state caused by failed CREATE/DROP (Hiroshi) + Fix for dbname with dash + Prevent DROP INDEX from interfering with other backends (Tom) + Fix file descriptor leak in verify_password() + Fix for "Unable to identify an operator =$" problem + Fix ODBC so no segfault if CommLog and Debug enabled + (Dirk Niggemann) + Fix for recursive exit call (Massimo) + Fix for extra-long timezones (Jeroen van Vianen) + Make pg_dump preserve primary key information (Peter E) + Prevent databases with single quotes (Peter E) + Prevent DROP DATABASE inside transaction (Peter E) + ecpg memory leak fixes (Stephen Birch) + Fix for SELECT null::text, SELECT int4fac(null) + and SELECT 2 + (null) (Tom) + Y2K timestamp fix (Massimo) + Fix for VACUUM 'HEAP_MOVED_IN was not expected' errors (Tom) + Fix for views with tables/columns containing spaces (Tom) + Prevent permissions on indexes (Peter E) + Fix for spinlock stuck problem on error (Hiroshi) + Fix ipcclean on Linux + Fix handling of NULL constraint conditions (Tom) + Fix memory leak in odbc driver (Nick Gorham) + Fix for permission check on UNION tables (Tom) + Fix to allow SELECT 'a' LIKE 'a' (Tom) + Fix for SELECT 1 + NULL (Tom) + Fixes to CHAR + Fix log() on numeric type (Tom) + Deprecate ':' and ';' operators + Allow vacuum of temporary tables + Disallow inherited columns with the same name as new columns + Recover or force failure when disk space is exhausted(Hiroshi) + Fix INSERT INTO ... SELECT with AS columns matching result columns + Fix INSERT ... SELECT ... GROUP BY groups by target columns not + source columns(Tom) + Fix CREATE TABLE test (a char(5) DEFAULT text '', b int4) + with INSERT(Tom) + Fix UNION with LIMIT + Fix CREATE TABLE x AS SELECT 1 UNION SELECT 2 + Fix CREATE TABLE test(col char(2) DEFAULT user) + Fix mismatched types in CREATE TABLE ... DEFAULT + Fix SELECT * FROM pg_class where oid in (0,-1) + Fix SELECT COUNT('asdf') FROM pg_class WHERE oid=12 + Prevent user who can create databases can modifying pg_database + table (Peter E) + Fix btree to give a useful elog when key > 1/2 (page - overhead) + (Tom) + Fix INSERT of 0.0 into DECIMAL(4,4) field (Tom) + + Enhancements + ------------ + New CLI interface include file sqlcli.h, based on SQL3/SQL98 + Remove all limits on query length, row length limit still + exists (Tom) + Update jdbc protocol to 2.0 (Jens Glaser (jens@jens.de)) + Add TRUNCATE command to quickly truncate relation (Mike Mascari) + Fix to give super user and createdb user proper update catalog + rights (Peter E) + Allow ecpg bool variables to have NULL values (Christof) + Issue ecpg error if NULL value for variable with no NULL + indicator (Christof) + Allow ^C to cancel COPY command (Massimo) + Add SET FSYNC and SHOW PG_OPTIONS commands (Massimo) + Function name overloading for dynamically-loaded C functions + (Frankpitt) + Add CmdTuples() to libpq++(Vince) + New CREATE CONSTRAINT TRIGGER and SET CONSTRAINTS commands (Jan) + Allow CREATE FUNCTION/WITH clause to be used for all types + configure --enable-debug adds -g (Peter E) + configure --disable-debug removes -g (Peter E) + Allow more complex default expressions (Tom) + First real FOREIGN KEY constraint trigger functionality (Jan) + Add FOREIGN KEY ... MATCH FULL ... ON DELETE CASCADE (Jan) + Add FOREIGN KEY ... MATCH <unspecified> referential actions + (Don Baccus) + Allow WHERE restriction on ctid (physical heap location) (Hiroshi) + Move pginterface from contrib to interface directory, + rename to pgeasy (Bruce) + Change pgeasy connectdb() parameter ordering (Bruce) + Require SELECT DISTINCT target list to have all ORDER BY + columns (Tom) + Add Oracle's COMMENT ON command (Mike Mascari (mascarim@yahoo)) + libpq's PQsetNoticeProcessor function now returns previous + hook (Peter E) + Prevent PQsetNoticeProcessor from being set to NULL (Peter E) + Make USING in COPY optional (Bruce) + Allow subselects in the target list (Tom) + Allow subselects on the left side of comparison operators (Tom) + New parallel regression test (Jan) + Change backend-side COPY to write files with permissions 644 + not 666 (Tom) + Force permissions on PGDATA directory to be secure, even if it + exists (Tom) + Added psql LASTOID variable to return last inserted oid (Peter E) + Allow concurrent vacuum and remove pg_vlock vacuum lock file (Tom) + Add permissions check for vacuum (Peter E) + New libpq functions to allow asynchronous connections: + PQconnectStart(), PQconnectPoll(), PQresetStart(), PQresetPoll(), + PQsetenvStart(), PQsetenvPoll(), PQsetenvAbort (Ewan Mellor) + New libpq PQsetenv() function (Ewan Mellor) + create/alter user extension (Peter E) + New postmaster.pid and postmaster.opts under $PGDATA (Tatsuo) + New scripts for create/drop user/db (Peter E) + Major psql overhaul (Peter E) + Add const to libpq interface (Peter E) + New libpq function PQoidValue (Peter E) + Show specific non-aggregate causing problem with GROUP BY (Tom) + Make changes to pg_shadow recreate pg_pwd file (Peter E) + Add aggregate(DISTINCT ...) (Tom) + Allow flag to control COPY input/output of NULLs (Peter E) + Make postgres user have a password by default (Peter E) + Add CREATE/ALTER/DROP GROUP (Peter E) + All administration scripts now support --long options + (Peter E, Karel) + Vacuumdb script now supports --all option (Peter E) + ecpg new portable FETCH syntax + Add ecpg EXEC SQL IFDEF, EXEC SQL IFNDEF, EXEC SQL ELSE, EXEC + SQL ELIF and EXEC SQL ENDIF directives + Add pg_ctl script to control backend startup (Tatsuo) + Add postmaster.opts.default file to store startup flags (Tatsuo) + Allow --with-mb=SQL_ASCII + Increase maximum number of index keys to 16 (Bruce) + Increase maximum number of function arguments to 16 (Bruce) + Allow configuration of maximum number of index keys and + arguments (Bruce) + Allow unprivileged users to change their passwords (Peter E) + Password authentication enabled; required for new users (Peter E) + Disallow dropping a user who owns a database (Peter E) + Change initdb option --with-mb to --enable-multibyte + Add option for initdb to prompts for superuser password (Peter E) + Allow complex type casts like col::numeric(9,2) and + col::int2::float8 (Tom) + Updated user interfaces on initdb, initlocation, pg_dump, + ipcclean (Peter E) + New pg_char_to_encoding() and pg_encoding_to_char() (Tatsuo) + New libpq functions PQsetClientEncoding(), PQclientEncoding() + (Tatsuo) + Libpq non-blocking mode (Alfred Perlstein) + Improve conversion of types in casts that don't specify a length + New plperl internal programming language (Mark Hollomon) + Allow COPY IN to read file that do not end with a newline (Tom) + Indicate when long identifiers are truncated (Tom) + Allow aggregates to use type equivalency (Peter E) + Add Oracle's to_char(), to_date(), to_datetime(), to_timestamp(), + to_number() conversion functions (Karel Zak <zakkr@zf.jcu.cz>) + Add SELECT DISTINCT ON (expr [, expr ...]) targetlist ... (Tom) + Check to be sure ORDER BY is compatible with DISTINCT (Tom) + Add NUMERIC and int8 types to ODBC + Improve EXPLAIN results for Append, Group, Agg, Unique (Tom) + Add ALTER TABLE ... ADD FOREIGN KEY (Stephan Szabo) + Allow SELECT .. FOR UPDATE in PL/pgSQL (Hiroshi) + Enable backward sequential scan even after reaching EOF (Hiroshi) + Add btree indexing of boolean values, >= and <= (Don Baccus) + Print current line number when COPY FROM fails (Massimo) + Recognize POSIX time zone e.g. "PST+8" and "GMT-8" (Thomas) + Add DEC as synonym for DECIMAL (Thomas) + Add SESSION_USER as SQL92 keyword (== CURRENT_USER) (Thomas) + Implement SQL92 column aliases (aka correlation names) (Thomas) + Implement SQL92 join syntax (Thomas) + INTERVAL reserved word allowed as a column identifier (Thomas) + Implement REINDEX command (Hiroshi) + Accept ALL in aggregate function SUM(ALL col) (Tom) + Prevent GROUP BY from using column aliases (Tom) + New psql \encoding option (Tatsuo) + Allow PQrequestCancel() to terminate when in waiting-for-lock + state (Hiroshi) + Allow negation of a negative number in all cases + Add ecpg descriptors (Christof, Michael) + Allow CREATE VIEW v AS SELECT f1::char(8) FROM tbl + Allow casts with length, like foo::char(8) + Add support for SJIS user defined characters (Tatsuo) + Larger views/rules supported + Make libpq's PQconndefaults() thread-safe (Tom) + Disable // as comment to be ANSI conforming, should use -- (Tom) + Allow column aliases on views CREATE VIEW name (collist) + Fixes for views with subqueries (Tom) + Allow UPDATE table SET fld = (SELECT ...) (Tom) + SET command options no longer require quotes + Update pgaccess to 0.98.6 + New SET SEED command + New pg_options.sample file + New SET FSYNC command (Massimo) + Allow pg_descriptions when creating tables + Allow pg_descriptions when creating types, columns, and functions + Allow psql \copy to allow delimiters(Peter E) + Allow psql to print nulls as distinct from "" [null](Peter E) + + Types + ----- + Many array fixes (Tom) + Allow bare column names to be subscripted as arrays (Tom) + Improve type casting of int and float constants (Tom) + Cleanups for int8 inputs, range checking, and type conversion (Tom) + Fix for SELECT timespan('21:11:26'::time) (Tom) + netmask('x.x.x.x/0') is 255.255.255.255 instead of 0.0.0.0 + (Oleg Sharoiko) + Add btree index on NUMERIC (Jan) + Perl fix for large objects containing NUL characters + (Douglas Thomson) + ODBC fix for for large objects (free) + Fix indexing of cidr data type + Fix for Ethernet MAC addresses (macaddr type) comparisons + Fix for date/time types when overflows happen (Tom) + Allow array on int8 (Peter E) + Fix for rounding/overflow of NUMERIC type, like NUMERIC(4,4) (Tom) + Allow NUMERIC arrays + Fix bugs in NUMERIC ceil() and floor() functions (Tom) + Make char_length()/octet_length including trailing blanks (Tom) + Made abstime/reltime use int4 instead of time_t (Peter E) + New lztext data type for compressed text fields + Revise code to handle coercion of int and float constants (Tom) + Start at new code to implement a BIT and BIT VARYING type + (Adriaan Joubert) + NUMERIC now accepts scientific notation (Tom) + NUMERIC to int4 rounds (Tom) + Convert float4/8 to NUMERIC properly (Tom) + Allow type conversion with NUMERIC (Thomas) + Make ISO date style (2000-02-16 09:33) the default (Thomas) + Add NATIONAL CHAR [ VARYING ] (Thomas) + Allow NUMERIC round and trunc to accept negative scales (Tom) + New TIME WITH TIME ZONE type (Thomas) + Add MAX()/MIN() on time type (Thomas) + Add abs(), mod(), fac() for int8 (Thomas) + Rename functions to round(), sqrt(), cbrt(), pow() for float8 + (Thomas) + Add transcendental math functions for float8 (Thomas) + Add exp() and ln() for NUMERIC type (Jan) + Rename NUMERIC power() to pow() (Thomas) + Improved TRANSLATE() function (Edwin Ramirez, Tom) + Allow X=-Y operators (Tom) + Allow SELECT float8(COUNT(*))/(SELECT COUNT(*) FROM t) + FROM t GROUP BY f1; (Tom) + Allow LOCALE to use indexes in regular expression searches (Tom) + Allow creation of functional indexes to use default types + + Performance + ----------- + Prevent exponential space usage with many AND's and OR's (Tom) + Collect attribute selectivity values for system columns (Tom) + Reduce memory usage of aggregates (Tom) + Fix for LIKE optimization to use indexes with multi-byte + encodings (Tom) + Fix r-tree index optimizer selectivity (Thomas) + Improve optimizer selectivity computations and functions (Tom) + Optimize btree searching when many equal keys exist (Tom) + Enable fast LIKE index processing only if index present (Tom) + Re-use free space on index pages with duplicates (Tom) + Improve hash join processing (Tom) + Prevent descending sort if result is already sorted(Hiroshi) + Allow commuting of index scan query qualifications (Tom) + Prefer index scans when ORDER BY/GROUP BY is required (Tom) + Allocate large memory requests in fix-sized chunks for + performance (Tom) + Fix vacuum's performance reducing memory requests (Tom) + Implement constant-expression simplification + (Bernard Frankpitt, Tom) + Use secondary columns to be used to determine start of index + scan (Hiroshi) + Prevent quadruple use of disk space when sorting (Tom) + Faster sorting by calling fewer functions (Tom) + Create system indexes to match all system caches + (Bruce, Hiroshi) + Make system caches use system indexes (Bruce) + Make all system indexes unique (Bruce) + Improve pg_statistics management to help VACUUM speed (Tom) + Flush backend cache less frequently (Tom, Hiroshi) + COPY now reuses previous memory allocation, improving + performance (Tom) + Improve optimization cost estimation (Tom) + Improve optimizer estimate of range queries + (x > lowbound AND x < highbound) (Tom) + Use DNF instead of CNF where appropriate (Tom, Taral) + Further cleanup for OR-of-AND WHERE-clauses (Tom) + Make use of index in OR clauses + (x = 1 AND y = 2) OR (x = 2 AND y = 4) (Tom) + Smarter optimizer for random index page access (Tom) + New SET variable to control optimizer costs (Tom) + Optimizer queries based on LIMIT, OFFSET, and EXISTS + qualifications (Tom) + Reduce optimizer internal housekeeping of join paths for + speedup (Tom) + Major subquery speedup (Tom) + Fewer fsync writes when fsync is not disabled (Tom) + Improved LIKE optimizer estimates (Tom) + Prevent fsync in SELECT-only queries (Vadim) + Index creation uses psort, since psort now faster (Tom) + Allow creation of sort temp tables > 1 Gig + + Source Tree Changes + ------------------- + Fix for linux PPC compile + New generic expression-tree-walker subroutine (Tom) + Change form() to varargform() to prevent portability problems + Improved range checking for large integers on Alphas + Clean up #include in /include directory (Bruce) + Add scripts for checking includes (Bruce) + Remove un-needed #include's from *.c files (Bruce) + Change #include's to use <> and "" as appropriate (Bruce) + Enable WIN32 compilation of libpq + Alpha spinlock fix from Uncle George (gatgul@voicenet.com) + Overhaul of optimizer data structures (Tom) + Fix to cygipc library (Yutaka Tanida) + Allow pgsql to work on newer Cygwin snapshots (Dan) + New catalog version number (Tom) + Add Linux ARM + Rename heap_replace to heap_update + Update for QNX (Dr. Andreas Kardos) + New platform-specific regression handling (Tom) + Rename oid8 -> oidvector and int28 -> int2vector (Bruce) + Included all yacc and lex files into the distribution (Peter E.) + Remove lextest, no longer needed (Peter E) + Fix for libpq and psql on Win32 (Magnus) + Change datetime and timespan into timestamp and interval (Thomas) + Fix for plpgsql on BSDI + Add SQL_ASCII test case to the regression test (Tatsuo) + configure --with-mb now deprecated (Tatsuo) + NT fixes + NetBSD fixes Johnny C. Lam (lamj@stat.cmu.edu) + Fixes for Alpha compiles + New multibyte encodings + +Chapter 6. Regression Test + + + Regression test instructions and analysis. + + The PostgreSQL regression tests are a comprehensive set of + tests for the SQL implementation embedded in PostgreSQL. They + test standard SQL operations as well as the extended + capabilities of PostgreSQL. + There are two different ways in which the regression tests can + be run: the "sequential" method and the "parallel" method. The + sequential method runs each test script in turn, whereas the + parallel method starts up multiple server processes to run + groups of tests in parallel. Parallel testing gives confidence + that interprocess communication and locking are working + correctly. Another key difference is that the sequential test + procedure uses an already-installed postmaster, whereas the + parallel test procedure tests a system that has been built but + not yet installed. (The parallel test script actually does an + installation into a temporary directory and fires up a private + postmaster therein.) + 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 tests are currently evaluated using a simple diff + comparison against the outputs generated on a reference system, + so the results are sensitive to small system differences. When + a test is reported as "failed", always examine the differences + between expected and actual results; you may well find that the + differences are not significant. + The regression tests were originally developed by Jolly Chen + and Andrew Yu, and were extensively revised/repackaged by Marc + Fournier and Thomas Lockhart. From PostgreSQL v6.1 onward the + regression tests are current for every official release. + +Regression Environment + + + The regression testing notes below assume the following + (except where noted): + o Commands are Unix-compatible. See note below. + o Defaults are used except where noted. + o User postgres is the Postgres superuser. + o The source path is /usr/src/pgsql (other paths are + possible). + o The runtime path is /usr/local/pgsql (other paths are + possible). + + Normally, the regression tests should be run as the postgres + user since the 'src/test/regress' directory and sub-directories + are owned by the postgres user. If you run the regression test + as another user the 'src/test/regress' directory tree must be + writeable by that user. + It was formerly necessary to run the postmaster with system + time zone set to PST, but this is no longer required. You can + run the regression tests under your normal postmaster + configuration. The test script will set the PGTZ environment + variable to ensure that timezone-dependent tests produce the + expected results. However, your system must provide library + support for the PST8PDT time zone, or the timezone-dependent + tests will fail. To verify that your machine does have this + support, type the following: + + setenv TZ PST8PDT + date + + + + 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: + + setenv PGTZ PST8PDT7,M04.01.0,M10.05.03 + + + + The directory layout for the regression test area is: + + Table 6-1. Directory Layout + Directory Description + 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 contain what the results actually + look like. Also used as temporary storage for table + copy testing. + tmp_check Temporary installation created by parallel testing + script. + + + + +Regression Test Procedure + + + 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 ps and tar vary wildly on what options + you should use on each platform. Use common sense before typing + in these commands. + + Postgres Regression Test + 1. Prepare the files needed for the regression test with: + cd /usr/src/pgsql/src/test/regress + gmake clean + gmake all + + You can skip "gmake clean" if this is the first time you + are running the tests. + This step compiles a C program with PostgreSQL extension + functions into a shared library. Localized SQL scripts and + output-comparison files are also created for the tests that + need them. The localization replaces macros in the source + files with absolute pathnames and user names. + 2. If you intend to use the "sequential" test procedure, which + tests an already-installed postmaster, be sure that the + postmaster is running. If it isn't already running, start + the postmaster in an available window by typing + postmaster + + or start the postmaster daemon running in the background by + typing + cd + nohup postmaster > regress.log 2>&1 & + + The latter is probably preferable, since the regression + test log will be quite lengthy (60K or so, in Postgres 7.0) + and you might want to review it for clues if things go + wrong. + + Note: Do not run postmaster from the root account. + + + 3. Run the regression tests. For a sequential test, type + cd /usr/src/pgsql/src/test/regress + gmake runtest + + For a parallel test, type + cd /usr/src/pgsql/src/test/regress + gmake runcheck + + The sequential test just runs the test scripts using your + already-running postmaster. The parallel test will perform a + complete installation of Postgres into a temporary + directory, start a private postmaster therein, and then run + the test scripts. Finally it will kill the private + postmaster (but the temporary directory isn't removed + automatically). + 4. 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" due to + platform-specific variations. See the next section for + details on determining whether a "failure" is significant. + Some of the tests, notably "numeric", can take a while, + especially on slower platforms. Have patience. + 5. After running the tests and examining the results, type + cd /usr/src/pgsql/src/test/regress + gmake clean + + to recover the temporary disk space used by the tests. If + you ran a sequential test, also type + dropdb regression + + + +Regression Analysis + + + The actual outputs of the regression tests are in files in the + ./results directory. The test script uses diff to compare each + output file against the reference outputs stored in the + ./expected directory. Any differences are saved for your + inspection in ./regression.diffs. (Or you can run diff + yourself, if you prefer.) + The files might not compare exactly. The test script will + report any difference as a "failure", but the difference might + be due to small cross-system differences in error message + wording, math library behavior, etc. "Failures" of this type do + not indicate a problem with Postgres. + Thus, it is necessary to examine the actual differences for + each "failed" test to determine whether there is really a + problem. The following paragraphs attempt to provide some + guidance in determining whether a difference is significant or + not. + +Error message differences + + + 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. + +Date and time differences + + + Most of the date and time results are dependent on timezone + environment. The reference files are generated for timezone + PST8PDT (Berkeley, California) and there will be apparent + failures if the tests are not run with that timezone setting. + The regression test driver sets environment variable PGTZ to + PST8PDT to ensure proper results. + Some of the queries in the "timestamp" test will fail if you + run the test on the day of a daylight-savings time changeover, + or the day before or after one. These queries assume that the + intervals between midnight yesterday, midnight today and + midnight tomorrow are exactly twenty-four hours ... which is + wrong if daylight-savings time went into or out of effect + meanwhile. + There appear to be some systems which do not accept the + recommended syntax for explicitly setting the local time zone + rules; you may need to use a different PGTZ setting on such + machines. + Some systems using older timezone libraries fail to apply + daylight-savings corrections to pre-1970 dates, causing + pre-1970 PDT times to be displayed in PST instead. This will + result in localized differences in the test results. + +Floating point differences + + + Some of the tests involve computing 64-bit (float8) numbers + from table columns. Differences in results involving + mathematical functions of float8 columns have been observed. + The float8 and geometry tests are particularly prone to small + differences across platforms. 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. + +Polygon differences + + + 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 float8 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 following: + + QUERY: SELECT * from street; + QUERY: SELECT * from iexit; + + + + +Random differences + + + There is at least one case in the "random" test script that is + intended to produce random results. This causes random to fail + the regression test once in a while (perhaps once in every five + to ten trials). Typing + + diff results/random.out expected/random.out + + + should produce only one or a few lines of differences. You + need not worry unless the random test always fails in repeated + attempts. (On the other hand, if the random test is never + reported to fail even in many trials of the regress tests, you + probably should worry.) + +The "expected" files + + + The ./expected/*.out files were adapted from the original + monolithic expected.input 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 + expected.input file was created on a SPARC Solaris 2.4 system + using the postgres5-1.02a5.tar.gz 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. The original + sample.regress.out file was from the postgres-1.01 release + constructed by Jolly Chen. It may have been created on a DEC + ALPHA machine as the Makefile.global in the postgres-1.01 + release has PORTNAME=alpha. + +Platform-specific comparison files + + + Since some of the tests inherently produce platform-specific + results, we have provided a way to supply platform-specific + result comparison files. Frequently, the same variation applies + to multiple platforms; rather than supplying a separate + comparison file for every platform, there is a mapping file + that defines which comparison file to use. So, to eliminate + bogus test "failures" for a particular platform, you must + choose or make a variant result file, and then add a line to + the mapping file, which is "resultmap". + Each line in the mapping file is of the form + + testname/platformnamepattern=comparisonfilename + + + The test name is just the name of the particular regression + test module. The platform name pattern is a pattern in the + style of expr(1) (that is, a regular expression with an + implicit ^ anchor at the start). It is matched against the + platform name as printed by config.guess. The comparison file + name is the name of the substitute result comparison file. + For example: the int2 regress test includes a deliberate entry + of a value that is too large to fit in int2. The specific error + message that is produced is platform-dependent; our reference + platform emits + + ERROR: pg_atoi: error reading "100000": Numerical result + out of range + + + but a fair number of other Unix platforms emit + + ERROR: pg_atoi: error reading "100000": Result too large + + + Therefore, we provide a variant comparison file, + int2-too-large.out, that includes this spelling of the error + message. To silence the bogus "failure" message on HPPA + platforms, resultmap includes + + int2/hppa=int2-too-large + + + which will trigger on any machine for which config.guess's + output begins with 'hppa'. Other lines in resultmap select the + variant comparison file for other platforms where it's + appropriate.