summaryrefslogtreecommitdiff
path: root/doc/src/FAQ/FAQ.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/FAQ/FAQ.html')
-rw-r--r--doc/src/FAQ/FAQ.html1349
1 files changed, 0 insertions, 1349 deletions
diff --git a/doc/src/FAQ/FAQ.html b/doc/src/FAQ/FAQ.html
deleted file mode 100644
index 32762e38ea2..00000000000
--- a/doc/src/FAQ/FAQ.html
+++ /dev/null
@@ -1,1349 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD html 4.01 transitional//EN">
-
-<HTML>
- <!-- DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN" -->
- <!-- HTML -->
-
- <HEAD>
- <META name="generator" content="HTML Tidy, see www.w3.org">
-
- <TITLE>PostgreSQL FAQ</TITLE>
- </HEAD>
-
- <BODY bgcolor="#ffffff" text="#000000" link="#ff0000" vlink="#a00000"
- alink="#0000ff">
- <H1>Frequently Asked Questions (FAQ) for PostgreSQL</H1>
-
- <P>Last updated: Tue Jun 11 06:36:10 EDT 2002</P>
-
- <P>Current maintainer: Bruce Momjian (<A href=
- "mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</A>)<BR>
- </P>
-
- <P>The most recent version of this document can be viewed at <A
- href=
- "http://www.Postgresql.org/docs/faq-english.html">http://www.PostgreSQL.org/docs/faq-english.html</A>.</P>
-
- <P>Platform-specific questions are answered at <A href=
- "http://www.PostgreSQL.org/users-lounge/docs/faq.html">http://www.PostgreSQL.org/users-lounge/docs/faq.html</A>.</P>
- <HR>
-
- <H2 align="center">General Questions</H2>
- <A href="#1.1">1.1</A>) What is PostgreSQL? How is it
- pronounced?<BR>
- <A href="#1.2">1.2</A>) What is the copyright on PostgreSQL?<BR>
- <A href="#1.3">1.3</A>) What Unix platforms does PostgreSQL run
- on?<BR>
- <A href="#1.4">1.4</A>) What non-Unix ports are available?<BR>
- <A href="#1.5">1.5</A>) Where can I get PostgreSQL?<BR>
- <A href="#1.6">1.6</A>) Where can I get support?<BR>
- <A href="#1.7">1.7</A>) What is the latest release?<BR>
- <A href="#1.8">1.8</A>) What documentation is available?<BR>
- <A href="#1.9">1.9</A>) How do I find out about known bugs or
- missing features?<BR>
- <A href="#1.10">1.10</A>) How can I learn <SMALL>SQL</SMALL>?<BR>
- <A href="#1.11">1.11</A>) Is PostgreSQL Y2K compliant?<BR>
- <A href="#1.12">1.12</A>) How do I join the development team?<BR>
- <A href="#1.13">1.13</A>) How do I submit a bug report?<BR>
- <A href="#1.14">1.14</A>) How does PostgreSQL compare to other
- <SMALL>DBMS</SMALL>s?<BR>
- <A href="#1.15">1.15</A>) How can I financially assist
- PostgreSQL?<BR>
-
-
- <H2 align="center">User Client Questions</H2>
- <A href="#2.1">2.1</A>) Are there <SMALL>ODBC</SMALL> drivers for
- PostgreSQL?<BR>
- <A href="#2.2">2.2</A>) What tools are available for using
- PostgreSQL with Web pages?<BR>
- <A href="#2.3">2.3</A>) Does PostgreSQL have a graphical user
- interface? A report generator? An embedded query language
- interface?<BR>
- <A href="#2.4">2.4</A>) What languages are available to
- communicate with PostgreSQL?<BR>
-
-
- <H2 align="center">Administrative Questions</H2>
- <A href="#3.1">3.1</A>) How do I install PostgreSQL somewhere other
- than <I>/usr/local/pgsql</I>?<BR>
- <A href="#3.2">3.2</A>) When I start <I>postmaster</I>, I get a
- <I>Bad System Call</I> or core dumped message. Why?<BR>
- <A href="#3.3">3.3</A>) When I try to start <I>postmaster</I>, I
- get <I>IpcMemoryCreate</I> errors. Why?<BR>
- <A href="#3.4">3.4</A>) When I try to start <I>postmaster</I>, I
- get <I>IpcSemaphoreCreate</I> errors. Why?<BR>
- <A href="#3.5">3.5</A>) How do I control connections from other
- hosts?<BR>
- <A href="#3.6">3.6</A>) How do I tune the database engine for
- better performance?<BR>
- <A href="#3.7">3.7</A>) What debugging features are available?<BR>
- <A href="#3.8">3.8</A>) Why do I get <I>"Sorry, too many
- clients"</I> when trying to connect?<BR>
- <A href="#3.9">3.9</A>) What are the <I>pg_sorttempNNN.NN</I>
- files in my database directory?<BR>
-
-
- <H2 align="center">Operational Questions</H2>
- <A href="#4.1">4.1</A>) What is the difference between binary
- cursors and normal cursors?<BR>
- <A href="#4.2">4.2</A>) How do I <SMALL>SELECT</SMALL> only the
- first few rows of a query?<BR>
- <A href="#4.3">4.3</A>) How do I get a list of tables or other
- things I can see in <I>psql</I>?<BR>
- <A href="#4.4">4.4</A>) How do you remove a column from a
- table?<BR>
- <A href="#4.5">4.5</A>) What is the maximum size for a row, a
- table, and a database?<BR>
- <A href="#4.6">4.6</A>) How much database disk space is required
- to store data from a typical text file?<BR>
- <A href="#4.7">4.7</A>) How do I find out what tables, indexes,
- databases, and users are defined?<BR>
- <A href="#4.8">4.8</A>) My queries are slow or don't make use of
- the indexes. Why?<BR>
- <A href="#4.9">4.9</A>) How do I see how the query optimizer is
- evaluating my query?<BR>
- <A href="#4.10">4.10</A>) What is an R-tree index?<BR>
- <A href="#4.11">4.11</A>) What is the Genetic Query Optimizer?<BR>
- <A href="#4.12">4.12</A>) How do I perform regular expression
- searches and case-insensitive regular expression searches? How do I
- use an index for case-insensitive searches?<BR>
- <A href="#4.13">4.13</A>) In a query, how do I detect if a field
- is <SMALL>NULL</SMALL>?<BR>
- <A href="#4.14">4.14</A>) What is the difference between the
- various character types?<BR>
- <A href="#4.15.1">4.15.1</A>) How do I create a
- serial/auto-incrementing field?<BR>
- <A href="#4.15.2">4.15.2</A>) How do I get the value of a
- <SMALL>SERIAL</SMALL> insert?<BR>
- <A href="#4.15.3">4.15.3</A>) Don't <I>currval()</I> and
- <I>nextval()</I> lead to a race condition with other users?<BR>
- <A href="#4.15.4">4.15.4</A>) Why aren't my sequence numbers
- reused on transaction abort? Why are there gaps in the numbering of
- my sequence/SERIAL column?<BR>
- <A href="#4.16">4.16</A>) What is an <SMALL>OID</SMALL>? What is a
- <SMALL>TID</SMALL>?<BR>
- <A href="#4.17">4.17</A>) What is the meaning of some of the terms
- used in PostgreSQL?<BR>
- <A href="#4.18">4.18</A>) Why do I get the error <I>"ERROR: Memory
- exhausted in AllocSetAlloc()"</I>?<BR>
- <A href="#4.19">4.19</A>) How do I tell what PostgreSQL version I
- am running?<BR>
- <A href="#4.20">4.20</A>) Why does my large-object operations get
- <I>"invalid large obj descriptor"</I>?<BR>
- <A href="#4.21">4.21</A>) How do I create a column that will
- default to the current time?<BR>
- <A href="#4.22">4.22</A>) Why are my subqueries using
- <CODE><SMALL>IN</SMALL></CODE> so slow?<BR>
- <A href="#4.23">4.23</A>) How do I perform an outer join?<BR>
- <A href="#4.24">4.24</A>) How do I perform queries using multiple
- databases?<BR>
- <A href="#4.25">4.25</A>) How do I return multiple rows or columns
- from a function?<BR>
- <A href="#4.26">4.26</A>) Why can't I reliably create/drop
- temporary tables in PL/PgSQL functions?<BR>
-
-
- <H2 align="center">Extending PostgreSQL</H2>
- <A href="#5.1">5.1</A>) I wrote a user-defined function. When I run
- it in <I>psql</I>, why does it dump core?<BR>
- <A href="#5.2">5.2</A>) How can I contribute some nifty new types
- and functions to PostgreSQL?<BR>
- <A href="#5.3">5.3</A>) How do I write a C function to return a
- tuple?<BR>
- <A href="#5.4">5.4</A>) I have changed a source file. Why does the
- recompile not see the change?<BR>
-
- <HR>
-
- <H2 align="center">General Questions</H2>
-
- <H4><A name="1.1">1.1</A>) What is PostgreSQL?</H4>
-
- <P>PostgreSQL is pronounced <I>Post-Gres-Q-L</I>.</P>
-
- <P>PostgreSQL is an enhancement of the POSTGRES database management
- system, a next-generation <SMALL>DBMS</SMALL> research prototype.
- While PostgreSQL retains the powerful data model and rich data
- types of POSTGRES, it replaces the PostQuel query language with an
- extended subset of <SMALL>SQL</SMALL>. PostgreSQL is free and the
- complete source is available.</P>
-
- <P>PostgreSQL development is performed by a team of Internet
- developers who all subscribe to the PostgreSQL development mailing
- list. The current coordinator is Marc G. Fournier (<A href=
- "mailto:scrappy@PostgreSQL.org">scrappy@PostgreSQL.org</A>). (See
- below on how to join). This team is now responsible for all
- development of PostgreSQL.</P>
-
- <P>The authors of PostgreSQL 1.01 were Andrew Yu and Jolly Chen.
- Many others have contributed to the porting, testing, debugging,
- and enhancement of the code. The original Postgres code, from which
- PostgreSQL is derived, was the effort of many graduate students,
- undergraduate students, and staff programmers working under the
- direction of Professor Michael Stonebraker at the University of
- California, Berkeley.</P>
-
- <P>The original name of the software at Berkeley was Postgres. When
- <SMALL>SQL</SMALL> functionality was added in 1995, its name was
- changed to Postgres95. The name was changed at the end of 1996 to
- PostgreSQL.</P>
-
- <H4><A name="1.2">1.2</A>) What is the copyright on
- PostgreSQL?</H4>
-
- <P>PostgreSQL is subject to the following COPYRIGHT:</P>
-
- <P>PostgreSQL Data Base Management System</P>
-
- <P>Portions copyright (c) 1996-2002, PostgreSQL Global Development
- Group Portions Copyright (c) 1994-6 Regents of the University of
- California</P>
-
- <P>Permission to use, copy, modify, and distribute this software
- and its documentation for any purpose, without fee, and without a
- written agreement is hereby granted, provided that the above
- copyright notice and this paragraph and the following two
- paragraphs appear in all copies.</P>
-
- <P>IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY
- PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
- DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS
- SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
- CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</P>
-
- <P>THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY
- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
- SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE
- UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE,
- SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.</P>
-
- <P>The above is the BSD license, the classic open-source license.
- It has no restrictions on how the source code may be used. We like
- it and have no intention of changing it.</P>
-
- <H4><A name="1.3">1.3</A>) What Unix platforms does PostgreSQL run
- on?</H4>
-
- <P>In general, a modern Unix-compatible platform should be able to
- run PostgreSQL. The platforms that had received explicit testing at
- the time of release are listed in the installation
- instructions.</P>
-
- <H4><A name="1.4">1.4</A>) What non-Unix ports are available?</H4>
-
- <P><STRONG>Client</STRONG></P>
-
- <P>It is possible to compile the <I>libpq</I> C library, psql, and
- other interfaces and binaries to run on MS Windows platforms. In
- this case, the client is running on MS Windows, and communicates
- via TCP/IP to a server running on one of our supported Unix
- platforms. A file <I>win31.mak</I> is included in the distribution
- for making a Win32 <I>libpq</I> library and <I>psql</I>. PostgreSQL
- also communicates with <SMALL>ODBC</SMALL> clients.</P>
-
- <P><STRONG>Server</STRONG></P>
-
- <P>The database server can run on Windows NT and Win2k using
- Cygwin, the Cygnus Unix/NT porting library. See
- <I>pgsql/doc/FAQ_MSWIN</I> in the distribution or the <A href=
- "http://www.postgresql.org/docs/faq-mswin.html">MS Windows FAQ</A>
- on our web site. We have no plan to do a native port to any
- Microsoft platform.</P>
-
- <H4><A name="1.5">1.5</A>) Where can I get PostgreSQL?</H4>
-
- <P>The primary anonymous ftp site for PostgreSQL is <A href=
- "ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</A>.
- For mirror sites, see our main web site.</P>
-
- <H4><A name="1.6">1.6</A>) Where can I get support?</H4>
-
- <P>The main mailing list is: <A href=
- "mailto:pgsql-general@PostgreSQL.org">pgsql-general@PostgreSQL.org</A>.
- It is available for discussion of matters pertaining to PostgreSQL.
- To subscribe, send mail with the following lines in the body (not
- the subject line):</P>
-<PRE>
- subscribe
- end
-</PRE>
-
- <P>to <A href=
- "mailto:pgsql-general-request@PostgreSQL.org">pgsql-general-request@PostgreSQL.org</A>.</P>
-
- <P>There is also a digest list available. To subscribe to this
- list, send email to: <A href=
- "mailto:pgsql-general-digest-request@PostgreSQL.org">pgsql-general-digest-request@PostgreSQL.org</A>
- with a body of:</P>
-<PRE>
- subscribe
- end
-</PRE>
- Digests are sent out to members of this list whenever the main list
- has received around 30k of messages.
-
- <P>The bugs mailing list is available. To subscribe to this list,
- send email to <A href=
- "mailto:pgsql-bugs-request@PostgreSQL.org">pgsql-bugs-request@PostgreSQL.org</A>
- with a body of:</P>
-<PRE>
- subscribe
- end
-</PRE>
- There is also a developers discussion mailing list available. To
- subscribe to this list, send email to <A href=
- "mailto:pgsql-hackers-request@PostgreSQL.org">pgsql-hackers-request@PostgreSQL.org</A>
- with a body of:
-<PRE>
- subscribe
- end
-</PRE>
-
- <P>Additional mailing lists and information about PostgreSQL can be
- found via the PostgreSQL WWW home page at:</P>
-
- <BLOCKQUOTE>
- <A href="http://www.PostgreSQL.org">http://www.PostgreSQL.org</A>
- </BLOCKQUOTE>
-
- <P>There is also an IRC channel on EFNet, channel
- <I>#PostgreSQL</I>. I use the Unix command <CODE>irc -c
- '#PostgreSQL' "$USER" irc.phoenix.net.</CODE></P>
-
- <P>A list of commercial support companies is available at <A href=
- "http://www.postgresql.org/users-lounge/commercial-support.html">http://www.postgresql.org/users-lounge/commercial-support.html</A>.</P>
-
- <H4><A name="1.7">1.7</A>) What is the latest release?</H4>
-
- <P>The latest release of PostgreSQL is version 7.2.1.</P>
-
- <P>We plan to have major releases every four months.</P>
-
- <H4><A name="1.8">1.8</A>) What documentation is available?</H4>
-
- <P>Several manuals, manual pages, and some small test examples are
- included in the distribution. See the <I>/doc</I> directory. You
- can also browse the manual online at <A href=
- "http://www.PostgreSQL.org/users-lounge/docs/">http://www.PostgreSQL.org/users-lounge/docs/</A>.</P>
-
- <P>There are two PostgreSQL books available online at <A href=
- "http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</A>
- and <A href=
- "http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</A>.
- There is a list of PostgreSQL books available for purchase at <A
- href=
- "http://www.postgresql.org/books/">http://www.postgresql.org/books/</A>.
- There is also a collection of PostgreSQL technical articles at <A
- href=
- "http://techdocs.postgresql.org/">http://techdocs.postgresql.org/</A>.</P>
-
- <P><I>psql</I> has some nice \d commands to show information about
- types, operators, functions, aggregates, etc.</P>
-
- <P>Our web site contains even more documentation.</P>
-
- <H4><A name="1.9">1.9</A>) How do I find out about known bugs or
- missing features?</H4>
-
- <P>PostgreSQL supports an extended subset of <SMALL>SQL</SMALL>-92.
- See our <A href="http://developer.PostgreSQL.org/todo.php">TODO</A>
- list for known bugs, missing features, and future plans.</P>
-
- <H4><A name="1.10">1.10</A>) How can I learn
- <SMALL>SQL</SMALL>?</H4>
-
- <P>The PostgreSQL book at <A href=
- "http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</A>
- teaches <SMALL>SQL</SMALL>. There is another PostgreSQL book at <A
- href=
- "http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook.</A>
- There is a nice tutorial at <A href=
- "http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm,</A>
- at <A href=
- "http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM">
- http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM,</A>
- and at <A href=
- "http://sqlcourse.com/">http://sqlcourse.com.</A></P>
-
- <P>Another one is "Teach Yourself SQL in 21 Days, Second Edition"
- at <A href=
- "http://members.tripod.com/er4ebus/sql/index.htm">http://members.tripod.com/er4ebus/sql/index.htm</A></P>
-
- <P>Many of our users like <I>The Practical SQL Handbook</I>,
- Bowman, Judith S., et al., Addison-Wesley. Others like <I>The
- Complete Reference SQL</I>, Groff et al., McGraw-Hill.</P>
-
- <H4><A name="1.11">1.11</A>) Is PostgreSQL Y2K compliant?</H4>
-
- <P>Yes, we easily handle dates past the year 2000 AD, and before
- 2000 BC.</P>
-
- <H4><A name="1.12">1.12</A>) How do I join the development
- team?</H4>
-
- <P>First, download the latest source and read the PostgreSQL
- Developers documentation on our web site, or in the distribution.
- Second, subscribe to the <I>pgsql-hackers</I> and
- <I>pgsql-patches</I> mailing lists. Third, submit high quality
- patches to pgsql-patches.</P>
-
- <P>There are about a dozen people who have commit privileges to the
- PostgreSQL <SMALL>CVS</SMALL> archive. They each have submitted so
- many high-quality patches that it was impossible for the existing
- committers to keep up, and we had confidence that patches they
- committed were of high quality.</P>
-
- <H4><A name="1.13">1.13</A>) How do I submit a bug report?</H4>
-
- <P>Please visit the <A href=
- "http://www.postgresql.org/bugs/bugs.php">PostgreSQL BugTool</A>
- page, which gives guidelines and directions on how to submit a
- bug.</P>
-
- <P>Also check out our ftp site <A href=
- "ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</A> to
- see if there is a more recent PostgreSQL version or patches.</P>
-
- <H4><A name="1.14">1.14</A>) How does PostgreSQL compare to other
- <SMALL>DBMS</SMALL>s?</H4>
-
- <P>There are several ways of measuring software: features,
- performance, reliability, support, and price.</P>
-
- <DL>
- <DT><B>Features</B></DT>
-
- <DD>PostgreSQL has most features present in large commercial
- <SMALL>DBMS</SMALL>s, like transactions, subselects, triggers,
- views, foreign key referential integrity, and sophisticated
- locking. We have some features they do not have, like
- user-defined types, inheritance, rules, and multi-version
- concurrency control to reduce lock contention.<BR>
- <BR>
- </DD>
-
- <DT><B>Performance</B></DT>
-
- <DD>PostgreSQL has performance similar to other commercial and
- open source databases. it is faster for some things, slower for
- others. In comparison to MySQL or leaner database systems, we are
- slower on inserts/updates because of transaction overhead. Of
- course, MySQL does not have any of the features mentioned in the
- <I>Features</I> section above. We are built for reliability and
- features, though we continue to improve performance in every
- release. There is an interesting Web page comparing PostgreSQL to
- MySQL at <A href= "http://openacs.org/why-not-mysql.html">
-
- http://openacs.org/why-not-mysql.html</A><BR>
-
- <BR>
- </DD>
-
- <DT><B>Reliability</B></DT>
-
- <DD>We realize that a <SMALL>DBMS</SMALL> must be reliable, or it
- is worthless. We strive to release well-tested, stable code that
- has a minimum of bugs. Each release has at least one month of
- beta testing, and our release history shows that we can provide
- stable, solid releases that are ready for production use. We
- believe we compare favorably to other database software in this
- area.<BR>
- <BR>
- </DD>
-
- <DT><B>Support</B></DT>
-
- <DD>Our mailing list provides a large group of developers and
- users to help resolve any problems encountered. While we can not
- guarantee a fix, commercial <SMALL>DBMS</SMALL>s do not always
- supply a fix either. Direct access to developers, the user
- community, manuals, and the source code often make PostgreSQL
- support superior to other <SMALL>DBMS</SMALL>s. There is
- commercial per-incident support available for those who need it.
- (See <A href="#1.6">support FAQ item</A>.)<BR>
- <BR>
- </DD>
-
- <DT><B>Price</B></DT>
-
- <DD>We are free for all use, both commercial and non-commercial.
- You can add our code to your product with no limitations, except
- those outlined in our BSD-style license stated above.<BR>
- <BR>
- </DD>
- </DL>
-
- <H4><A name="1.15">1.15</A>) How can I financially assist
- PostgreSQL?</H4>
-
- <P>PostgreSQL has had a first-class infrastructure since we started
- six years ago. This is all thanks to Marc Fournier, who has created
- and managed this infrastructure over the years.</P>
-
- <P>Quality infrastructure is very important to an open-source
- project. It prevents disruptions that can greatly delay forward
- movement of the project.</P>
-
- <P>Of course, this infrastructure is not cheap. There are a variety
- of monthly and one-time expenses that are required to keep it
- going. If you or your company has money it can donate to help fund
- this effort, please go to <A href=
- "http://www.pgsql.com/pg_goodies">http://www.pgsql.com/pg_goodies</A>
- and make a donation.</P>
-
- <P>Although the web page mentions PostgreSQL, Inc, the
- "contributions" item is solely to support the PostgreSQL project
- and does not fund any specific company. If you prefer, you can also
- send a check to the contact address.</P>
- <HR>
-
- <H2 align="center">User Client Questions</H2>
-
- <H4><A name="2.1">2.1</A>) Are there <SMALL>ODBC</SMALL> drivers
- for PostgreSQL?</H4>
-
- <P>There are two <SMALL>ODBC</SMALL> drivers available, PsqlODBC
- and OpenLink <SMALL>ODBC</SMALL>.</P>
-
- <P>PsqlODBC is included in the distribution. More information about
- it can be gotten from <A href=
- "ftp://ftp.PostgreSQL.org/pub/odbc/">ftp://ftp.PostgreSQL.org/pub/odbc/</A>.</P>
-
- <P>OpenLink <SMALL>ODBC</SMALL> can be gotten from <A href=
- "http://www.openlinksw.com/">http://www.openlinksw.com</A>. It
- works with their standard <SMALL>ODBC</SMALL> client software so
- you'll have PostgreSQL <SMALL>ODBC</SMALL> available on every
- client platform they support (Win, Mac, Unix, VMS).</P>
-
- <P>They will probably be selling this product to people who need
- commercial-quality support, but a freeware version will always be
- available. Please send questions to <A href=
- "mailto:postgres95@openlink.co.uk">postgres95@openlink.co.uk</A>.</P>
-
- <P>See also the <A href=
- "http://www.postgresql.org/devel-corner/docs/programmer/odbc.html">ODBC
- chapter of the Programmer's Guide</A>.</P>
-
- <H4><A name="2.2">2.2</A>) What tools are available for using
- PostgreSQL with Web pages?</H4>
-
- <P>A nice introduction to Database-backed Web pages can be seen at:
- <A href="http://www.webreview.com">http://www.webreview.com</A></P>
-
- <P>There is also one at <A href=
- "http://www.phone.net/home/mwm/hotlist/">http://www.phone.net/home/mwm/hotlist/.</A></P>
-
- <P>For Web integration, PHP is an excellent interface. It is at <A
- href="http://www.php.net">http://www.php.net</A>.</P>
-
- <P>For complex cases, many use the Perl interface and CGI.pm.</P>
-
- <H4><A name="2.3">2.3</A>) Does PostgreSQL have a graphical user
- interface? A report generator? An embedded query language
- interface?</H4>
-
- <P>We have a nice graphical user interface called <I>pgaccess</I>,
- which is shipped as part of the distribution. <I>pgaccess</I> also
- has a report generator. The Web page is <A href=
- "http://www.flex.ro/pgaccess">http://www.flex.ro/pgaccess</A></P>
-
- <P>We also include <I>ecpg</I>, which is an embedded SQL query
- language interface for C.</P>
-
- <H4><A name="2.4">2.4</A>) What languages are available to
- communicate with PostgreSQL?</H4>
-
- <P>We have:</P>
-
- <UL>
- <LI>C (libpq)</LI>
-
- <LI>C++ (libpq++)</LI>
-
- <LI>Embedded C (ecpg)</LI>
-
- <LI>Java (jdbc)</LI>
-
- <LI>Perl (perl5)</LI>
-
- <LI>ODBC (odbc)</LI>
-
- <LI>Python (PyGreSQL)</LI>
-
- <LI>TCL (libpgtcl)</LI>
-
- <LI>C Easy API (libpgeasy)</LI>
-
- <LI>Embedded <SMALL>HTML</SMALL> (<A href=
- "http://www.php.net">PHP from http://www.php.net</A>)</LI>
- </UL>
- <HR>
-
- <H2 align="center">Administrative Questions</H2>
-
- <H4><A name="3.1">3.1</A>) How do I install PostgreSQL somewhere
- other than <I>/usr/local/pgsql</I>?</H4>
-
- <P>Specify the <I>--prefix</I> option when running
- <I>configure</I>.</P>
-
- <H4><A name="3.2">3.2</A>) When I start <I>postmaster</I>, I get a
- <I>Bad System Call</I> or core dumped message. Why?</H4>
-
- <P>It could be a variety of problems, but first check to see that
- you have System V extensions installed in your kernel. PostgreSQL
- requires kernel support for shared memory and semaphores.</P>
-
- <H4><A name="3.3">3.3</A>) When I try to start <I>postmaster</I>, I
- get <I>IpcMemoryCreate</I> errors. Why?</H4>
-
- <P>You either do not have shared memory configured properly in your
- kernel or you need to enlarge the shared memory available in the
- kernel. The exact amount you need depends on your architecture and
- how many buffers and backend processes you configure for
- <I>postmaster</I>. For most systems, with default numbers of
- buffers and processes, you need a minimum of ~1 MB. See the <A
- href=
- "http://www.postgresql.org/idocs/index.php?kernel-resources.html">PostgreSQL
- Administrator's Guide</A> for more detailed information about
- shared memory and semaphores.</P>
-
- <H4><A name="3.4">3.4</A>) When I try to start <I>postmaster</I>, I
- get <I>IpcSemaphoreCreate</I> errors. Why?</H4>
-
- <P>If the error message is <I>IpcSemaphoreCreate: semget failed (No
- space left on device)</I> then your kernel is not configured with
- enough semaphores. Postgres needs one semaphore per potential
- backend process. A temporary solution is to start <I>postmaster</I>
- with a smaller limit on the number of backend processes. Use
- <I>-N</I> with a parameter less than the default of 32. A more
- permanent solution is to increase your kernel's
- <SMALL>SEMMNS</SMALL> and <SMALL>SEMMNI</SMALL> parameters.</P>
-
- <P>Inoperative semaphores can also cause crashes during heavy
- database access.</P>
-
- <P>If the error message is something else, you might not have
- semaphore support configured in your kernel at all. See the
- PostgreSQL Administrator's Guide for more detailed information
- about shared memory and semaphores.</P>
-
- <H4><A name="3.5">3.5</A>) How do I control connections from other
- hosts?</H4>
-
- <P>By default, PostgreSQL only allows connections from the local
- machine using Unix domain sockets. Other machines will not be able
- to connect unless you add the <I>-i</I> flag to <I>postmaster</I>,
- <B>and</B> enable host-based authentication by modifying the file
- <I>$PGDATA/pg_hba.conf</I> accordingly. This will allow TCP/IP
- connections.</P>
-
- <H4><A name="3.6">3.6</A>) How do I tune the database engine for
- better performance?</H4>
-
- <P>Certainly, indexes can speed up queries. The
- <SMALL>EXPLAIN</SMALL> command allows you to see how PostgreSQL is
- interpreting your query, and which indexes are being used.</P>
-
- <P>If you are doing many <SMALL>INSERTs</SMALL>, consider doing
- them in a large batch using the <SMALL>COPY</SMALL> command. This
- is much faster than individual <SMALL>INSERTS.</SMALL> Second,
- statements not in a <SMALL>BEGIN WORK/COMMIT</SMALL> transaction
- block are considered to be in their own transaction. Consider
- performing several statements in a single transaction block. This
- reduces the transaction overhead. Also, consider dropping and
- recreating indexes when making large data changes.</P>
-
- <P>There are several tuning options. You can disable <I>fsync()</I>
- by starting <I>postmaster</I> with a <I>-o -F</I> option. This will
- prevent <I>fsync()</I>s from flushing to disk after every
- transaction.</P>
-
- <P>You can also use the <I>postmaster</I> <I>-B</I> option to
- increase the number of shared memory buffers used by the backend
- processes. If you make this parameter too high, the
- <I>postmaster</I> may not start because you have exceeded your
- kernel's limit on shared memory space. Each buffer is 8K and the
- default is 64 buffers.</P>
-
- <P>You can also use the backend <I>-S</I> option to increase the
- maximum amount of memory used by the backend process for temporary
- sorts. The <I>-S</I> value is measured in kilobytes, and the
- default is 512 (i.e. 512K).</P>
-
- <P>You can also use the <SMALL>CLUSTER</SMALL> command to group
- data in tables to match an index. See the <SMALL>CLUSTER</SMALL>
- manual page for more details.</P>
-
- <H4><A name="3.7">3.7</A>) What debugging features are
- available?</H4>
-
- <P>PostgreSQL has several features that report status information
- that can be valuable for debugging purposes.</P>
-
- <P>First, by running <I>configure</I> with the --enable-cassert
- option, many <I>assert()</I>s monitor the progress of the backend
- and halt the program when something unexpected occurs.</P>
-
- <P>Both <I>postmaster</I> and <I>postgres</I> have several debug
- options available. First, whenever you start <I>postmaster</I>,
- make sure you send the standard output and error to a log file,
- like:</P>
-<PRE>
- cd /usr/local/pgsql
- ./bin/postmaster &gt;server.log 2&gt;&amp;1 &amp;
-</PRE>
-
- <P>This will put a server.log file in the top-level PostgreSQL
- directory. This file contains useful information about problems or
- errors encountered by the server. <I>Postmaster</I> has a <I>-d</I>
- option that allows even more detailed information to be reported.
- The <I>-d</I> option takes a number that specifies the debug level.
- Be warned that high debug level values generate large log
- files.</P>
-
- <P>If <I>postmaster</I> is not running, you can actually run the
- <I>postgres</I> backend from the command line, and type your
- <SMALL>SQL</SMALL> statement directly. This is recommended
- <B>only</B> for debugging purposes. Note that a newline terminates
- the query, not a semicolon. If you have compiled with debugging
- symbols, you can use a debugger to see what is happening. Because
- the backend was not started from <I>postmaster</I>, it is not
- running in an identical environment and locking/backend interaction
- problems may not be duplicated.</P>
-
- <P>If <I>postmaster</I> is running, start <I>psql</I> in one
- window, then find the <SMALL>PID</SMALL> of the <I>postgres</I>
- process used by <I>psql</I>. Use a debugger to attach to the
- <I>postgres</I> <SMALL>PID.</SMALL> You can set breakpoints in the
- debugger and issue queries from <I>psql</I>. If you are debugging
- <I>postgres</I> startup, you can set PGOPTIONS="-W n", then start
- <I>psql</I>. This will cause startup to delay for <I>n</I> seconds
- so you can attach to the process with the debugger, set any
- breakpoints, and continue through the startup sequence.</P>
-
- <P>The <I>postgres</I> program has <I>-s, -A</I>, and <I>-t</I>
- options that can be very useful for debugging and performance
- measurements.</P>
-
- <P>You can also compile with profiling to see what functions are
- taking execution time. The backend profile files will be deposited
- in the <I>pgsql/data/base/dbname</I> directory. The client profile
- file will be put in the client's current directory. Linux requires
- a compile with <I>-DLINUX_PROFILE</I> for proper profiling.</P>
-
- <H4><A name="3.8">3.8</A>) Why do I get <I>"Sorry, too many
- clients"</I> when trying to connect?</H4>
-
- <P>You need to increase <I>postmaster</I>'s limit on how many
- concurrent backend processes it can start.</P>
-
- <P>The default limit is 32 processes. You can increase it by
- restarting <I>postmaster</I> with a suitable <I>-N</I> value or
- modifying <I>postgresql.conf</I>.</P>
-
- <P>Note that if you make <I>-N</I> larger than 32, you must also
- increase <I>-B</I> beyond its default of 64; <I>-B</I> must be at
- least twice <I>-N</I>, and probably should be more than that for
- best performance. For large numbers of backend processes, you are
- also likely to find that you need to increase various Unix kernel
- configuration parameters. Things to check include the maximum size
- of shared memory blocks, <SMALL>SHMMAX;</SMALL> the maximum number
- of semaphores, <SMALL>SEMMNS</SMALL> and <SMALL>SEMMNI;</SMALL> the
- maximum number of processes, <SMALL>NPROC;</SMALL> the maximum
- number of processes per user, <SMALL>MAXUPRC;</SMALL> and the
- maximum number of open files, <SMALL>NFILE</SMALL> and
- <SMALL>NINODE.</SMALL> The reason that PostgreSQL has a limit on
- the number of allowed backend processes is so your system won't run
- out of resources.</P>
-
- <P>In PostgreSQL versions prior to 6.5, the maximum number of
- backends was 64, and changing it required a rebuild after altering
- the MaxBackendId constant in
- <I>include/storage/sinvaladt.h</I>.</P>
-
- <H4><A name="3.9">3.9</A>) What are the <I>pg_sorttempNNN.NN</I>
- files in my database directory?</H4>
-
- <P>They are temporary files generated by the query executor. For
- example, if a sort needs to be done to satisfy an <SMALL>ORDER
- BY,</SMALL> and the sort requires more space than the backend's
- <I>-S</I> parameter allows, then temporary files are created to
- hold the extra data.</P>
-
- <P>The temporary files should be deleted automatically, but might
- not if a backend crashes during a sort. If you have no backends
- running at the time, it is safe to delete the pg_tempNNN.NN
- files.</P>
- <HR>
-
- <H2 align="center">Operational Questions</H2>
-
- <H4><A name="4.1">4.1</A>) What is the difference between binary
- cursors and normal cursors?</H4>
-
- <P>See the <SMALL>DECLARE</SMALL> manual page for a
- description.</P>
-
- <H4><A name="4.2">4.2</A>) How do I <SMALL>SELECT</SMALL> only the
- first few rows of a query?</H4>
-
- <P>See the <SMALL>FETCH</SMALL> manual page, or use
- <SMALL>SELECT</SMALL> ... <SMALL>LIMIT</SMALL>....</P>
-
- <P>The entire query may have to be evaluated, even if you only want
- the first few rows. Consider a query that has an <SMALL>ORDER
- BY.</SMALL> If there is an index that matches the <SMALL>ORDER
- BY</SMALL>, PostgreSQL may be able to evaluate only the first few
- records requested, or the entire query may have to be evaluated
- until the desired rows have been generated.</P>
-
- <H4><A name="4.3">4.3</A>) How do I get a list of tables or other
- things I can see in <I>psql</I>?</H4>
-
- <P>You can read the source code for <I>psql</I> in file
- <I>pgsql/src/bin/psql/describe.c</I>. It contains
- <SMALL>SQL</SMALL> commands that generate the output for psql's
- backslash commands. You can also start <I>psql</I> with the
- <I>-E</I> option so it will print out the queries it uses to
- execute the commands you give.</P>
-
- <H4><A name="4.4">4.4</A>) How do you remove a column from a
- table?</H4>
-
- <P>We do not support <SMALL>ALTER TABLE DROP COLUMN,</SMALL> but do
- this:</P>
-<PRE>
- BEGIN;
- LOCK TABLE old_table;
- SELECT ... -- select all columns but the one you want to remove
- INTO TABLE new_table
- FROM old_table;
- DROP TABLE old_table;
- ALTER TABLE new_table RENAME TO old_table;
- COMMIT;
-</PRE>
-
- <H4><A name="4.5">4.5</A>) What is the maximum size for a row, a
- table, and a database?</H4>
-
- <P>These are the limits:</P>
-<PRE>
- Maximum size for a database? unlimited (500 GB databases exist)
- Maximum size for a table? 16 TB
- Maximum size for a row? unlimited in 7.1 and later
- Maximum size for a field? 1 GB in 7.1 and later
- Maximum number of rows in a table? unlimited
- Maximum number of columns in a table? 250-1600 depending on column types
- Maximum number of indexes on a table? unlimited
-</PRE>
- Of course, these are not actually unlimited, but limited to
- available disk space and memory/swap space. Performance may suffer
- when these values get unusually large.
-
- <P>The maximum table size of 16 TB does not require large file
- support from the operating system. Large tables are stored as
- multiple 1 GB files so file system size limits are not
- important.</P>
-
- <P>The maximum table size and maximum number of columns can be
- increased if the default block size is increased to 32k.</P>
-
- <H4><A name="4.6">4.6</A>) How much database disk space is required
- to store data from a typical text file?</H4>
-
- <P>A PostgreSQL database may require up to five times the disk
- space to store data from a text file.</P>
-
- <P>As an example, consider a file of 100,000 lines with an integer
- and text description on each line. Suppose the text string
- avergages twenty bytes in length. The flat file would be 2.8 MB.
- The size of the PostgreSQL database file containing this data can
- be estimated as 6.4 MB:</P>
-<PRE>
- 36 bytes: each row header (approximate)
- 24 bytes: one int field and one text filed
- + 4 bytes: pointer on page to tuple
- ----------------------------------------
- 64 bytes per row
-
- The data page size in PostgreSQL is 8192 bytes (8 KB), so:
-
- 8192 bytes per page
- ------------------- = 128 rows per database page (rounded down)
- 64 bytes per row
-
- 100000 data rows
- -------------------- = 782 database pages (rounded up)
- 128 rows per page
-
-782 database pages * 8192 bytes per page = 6,406,144 bytes (6.4 MB)
-</PRE>
-
- <P>Indexes do not require as much overhead, but do contain the data
- that is being indexed, so they can be large also.</P>
-
- <H4><A name="4.7">4.7</A>) How do I find out what tables, indexes,
- databases, and users are defined?</H4>
-
- <P><I>psql</I> has a variety of backslash commands to show such
- information. Use \? to see them. There are also system tables
- beginning with <I>pg_</I> that describe these too. Also, <I>psql
- -l</I> will list all databases.</P>
-
- <P>Also try the file <I>pgsql/src/tutorial/syscat.source</I>. It
- illustrates many of the <SMALL>SELECT</SMALL>s needed to get
- information from the database system tables.</P>
-
- <H4><A name="4.8">4.8</A>) My queries are slow or don't make use of
- the indexes. Why?</H4>
- Indexes are not automatically used by every query. Indexes are only
- used if the table is larger than a minimum size, and the query
- selects only a small percentage of the rows in the table. This is
- because the random disk access caused by an index scan is sometimes
- slower than a straight read through the table, or sequential scan.
-
- <P>To determine if an index should be used, PostgreSQL must have
- statistics about the table. These statistics are collected using
- <SMALL>VACUUM ANALYZE</SMALL>, or simply <SMALL>ANALYZE</SMALL>.
- Using statistics, the optimizer knows how many rows are in the
- table, and can better determine if indexes should be used.
- Statistics are also valuable in determining optimal join order and
- join methods. Statistics collection should be performed
- periodically as the contents of the table change.</P>
-
- <P>Indexes are normally not used for <SMALL>ORDER BY</SMALL> or to
- perform joins. A sequential scan followed by an explicit sort is
- usually faster than an index scan of a large table.</P>
- However, <SMALL>LIMIT</SMALL> combined with <SMALL>ORDER BY</SMALL>
- often will use an index because only a small portion of the table
- is returned.
-
- <P>When using wild-card operators such as <SMALL>LIKE</SMALL> or
- <I>~</I>, indexes can only be used if the beginning of the search
- is anchored to the start of the string. Therefore, to use indexes,
- <SMALL>LIKE</SMALL> patterns must not start with <I>%</I>, and
- <I>~</I>(regular expression) patterns must start with <I>^</I>.</P>
-
- <H4><A name="4.9">4.9</A>) How do I see how the query optimizer is
- evaluating my query?</H4>
-
- <P>See the <SMALL>EXPLAIN</SMALL> manual page.</P>
-
- <H4><A name="4.10">4.10</A>) What is an R-tree index?</H4>
-
- <P>An R-tree index is used for indexing spatial data. A hash index
- can't handle range searches. A B-tree index only handles range
- searches in a single dimension. R-trees can handle
- multi-dimensional data. For example, if an R-tree index can be
- built on an attribute of type <I>point</I>, the system can more
- efficiently answer queries such as "select all points within a
- bounding rectangle."</P>
-
- <P>The canonical paper that describes the original R-tree design
- is:</P>
-
- <P>Guttman, A. "R-trees: A Dynamic Index Structure for Spatial
- Searching." Proceedings of the 1984 ACM SIGMOD Int'l Conf on Mgmt
- of Data, 45-57.</P>
-
- <P>You can also find this paper in Stonebraker's "Readings in
- Database Systems".</P>
-
- <P>Built-in R-trees can handle polygons and boxes. In theory,
- R-trees can be extended to handle higher number of dimensions. In
- practice, extending R-trees requires a bit of work and we don't
- currently have any documentation on how to do it.</P>
-
- <H4><A name="4.11">4.11</A>) What is the Genetic Query
- Optimizer?</H4>
-
- <P>The <SMALL>GEQO</SMALL> module speeds query optimization when
- joining many tables by means of a Genetic Algorithm (GA). It allows
- the handling of large join queries through nonexhaustive
- search.</P>
-
- <H4><A name="4.12">4.12</A>) How do I perform regular expression
- searches and case-insensitive regular expression searches? How do I
- use an index for case-insensitive searches?</H4>
-
- <P>The <I>~</I> operator does regular expression matching, and
- <I>~*</I> does case-insensitive regular expression matching. The
- case-insensitive variant of <SMALL>LIKE</SMALL> is called
- <SMALL>ILIKE</SMALL> in PostgreSQL 7.1 and later.</P>
-
- <P>Case-insensitive equality comparisons are normally expressed
- as:</P>
-<PRE>
- SELECT *
- FROM tab
- WHERE lower(col) = 'abc'
-
-</PRE>
- This will not use an standard index. However, if you create a
- functional index, it will be used:
-<PRE>
- CREATE INDEX tabindex on tab (lower(col));
-
-</PRE>
-
- <H4><A name="4.13">4.13</A>) In a query, how do I detect if a field
- is <SMALL>NULL</SMALL>?</H4>
-
- <P>You test the column with <SMALL>IS NULL</SMALL> and <SMALL>IS
- NOT NULL</SMALL>.</P>
-
- <H4><A name="4.14">4.14</A>) What is the difference between the
- various character types?</H4>
-<PRE>
-Type Internal Name Notes
---------------------------------------------------
-"char" char 1 character
-CHAR(#) bpchar blank padded to the specified fixed length
-VARCHAR(#) varchar size specifies maximum length, no padding
-TEXT text no specific upper limit on length
-BYTEA bytea variable-length byte array (null-byte safe)
-</PRE>
-
- <P>You will see the internal name when examining system catalogs
- and in some error messages.</P>
-
- <P>The last four types above are "varlena" types (i.e., the first
- four bytes on disk are the length, followed by the data). Thus the
- actual space used is slightly greater than the declared size.
- However, these data types are also subject to compression or being
- stored out-of-line by <SMALL>TOAST</SMALL>, so the space on disk
- might also be less than expected.</P>
-
- <P><SMALL>CHAR()</SMALL> is best when storing strings that are
- usually the same length. <SMALL>VARCHAR()</SMALL> is best when
- storing variable-length strings but it limits how long a string can
- be. <SMALL>TEXT</SMALL> is for strings of unlimited length, maximum
- 1 gigabyte. <SMALL>BYTEA</SMALL> is for storing binary data,
- particularly values that include <SMALL>NULL</SMALL> bytes.</P>
-
- <H4><A name="4.15.1">4.15.1</A>) How do I create a
- serial/auto-incrementing field?</H4>
-
- <P>PostgreSQL supports a <SMALL>SERIAL</SMALL> data type. It
- auto-creates a sequence and index on the column. For example,
- this:</P>
-<PRE>
- CREATE TABLE person (
- id SERIAL,
- name TEXT
- );
-</PRE>
- is automatically translated into this:
-<PRE>
- CREATE SEQUENCE person_id_seq;
- CREATE TABLE person (
- id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
- name TEXT
- );
- CREATE UNIQUE INDEX person_id_key ON person ( id );
-</PRE>
- See the <I>create_sequence</I> manual page for more information
- about sequences. You can also use each row's <I>OID</I> field as a
- unique value. However, if you need to dump and reload the database,
- you need to use <I>pg_dump</I>'s <I>-o</I> option or <SMALL>COPY
- WITH OIDS</SMALL> option to preserve the <SMALL>OID</SMALL>s.
-
- <H4><A name="4.15.2">4.15.2</A>) How do I get the value of a
- <SMALL>SERIAL</SMALL> insert?</H4>
-
- <P>One approach is to retrieve the next <SMALL>SERIAL</SMALL> value
- from the sequence object with the <I>nextval()</I> function
- <I>before</I> inserting and then insert it explicitly. Using the
- example table in <A href="#4.15.1">4.15.1</A>, that might look like
- this in Perl:</P>
-<PRE>
- new_id = output of "SELECT nextval('person_id_seq')"
- INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal');
-</PRE>
- You would then also have the new value stored in
- <CODE>new_id</CODE> for use in other queries (e.g., as a foreign
- key to the <CODE>person</CODE> table). Note that the name of the
- automatically created <SMALL>SEQUENCE</SMALL> object will be named
- &lt;<I>table</I>&gt;_&lt;<I>serialcolumn</I>&gt;_<I>seq</I>, where
- <I>table</I> and <I>serialcolumn</I> are the names of your table
- and your <SMALL>SERIAL</SMALL> column, respectively.
-
- <P>Alternatively, you could retrieve the assigned
- <SMALL>SERIAL</SMALL> value with the <I>currval</I>() function
- <I>after</I> it was inserted by default, e.g.,</P>
-<PRE>
- INSERT INTO person (name) VALUES ('Blaise Pascal');
- new_id = output of "SELECT currval('person_id_seq')";
-</PRE>
- Finally, you could use the <A href="#4.16"><SMALL>OID</SMALL></A>
- returned from the <SMALL>INSERT</SMALL> statement to look up the
- default value, though this is probably the least portable approach.
- In Perl, using DBI with Edmund Mergl's DBD::Pg module, the oid
- value is made available via <I>$sth-&gt;{pg_oid_status}</I> after
- <I>$sth-&gt;execute()</I>.
-
- <H4><A name="4.15.3">4.15.3</A>) Don't <I>currval()</I> and
- <I>nextval()</I> lead to a race condition with other users?</H4>
-
- <P>No. Currval() returns the current value assigned by your
- backend, not by all users.</P>
-
- <H4><A name="4.15.4">4.15.4</A>) Why aren't my sequence numbers
- reused on transaction abort? Why are there gaps in the numbering of
- my sequence/SERIAL column?</H4>
-
- <P>To improve concurrency, sequence values are given out to running
- transactions as needed and are not locked until the transaction
- completes. This causes gaps in numbering from aborted
- transactions.</P>
-
- <H4><A name="4.16">4.16</A>) What is an <SMALL>OID</SMALL>? What is
- a <SMALL>TID</SMALL>?</H4>
-
- <P><SMALL>OID</SMALL>s are PostgreSQL's answer to unique row ids.
- Every row that is created in PostgreSQL gets a unique
- <SMALL>OID</SMALL>. All <SMALL>OID</SMALL>s generated during
- <I>initdb</I> are less than 16384 (from
- <I>backend/access/transam.h</I>). All user-created
- <SMALL>OID</SMALL>s are equal to or greater than this. By default,
- all these <SMALL>OID</SMALL>s are unique not only within a table or
- database, but unique within the entire PostgreSQL installation.</P>
-
- <P>PostgreSQL uses <SMALL>OID</SMALL>s in its internal system
- tables to link rows between tables. These <SMALL>OID</SMALL>s can
- be used to identify specific user rows and used in joins. It is
- recommended you use column type <SMALL>OID</SMALL> to store
- <SMALL>OID</SMALL> values. You can create an index on the
- <SMALL>OID</SMALL> field for faster access.</P>
-
- <P>O<SMALL>ID</SMALL>s are assigned to all new rows from a central
- area that is used by all databases. If you want to change the
- <SMALL>OID</SMALL> to something else, or if you want to make a copy
- of the table, with the original <SMALL>OID</SMALL>s, there is no
- reason you can't do it:</P>
-<PRE>
- CREATE TABLE new_table(old_oid oid, mycol int);
- SELECT old_oid, mycol INTO new FROM old;
- COPY new TO '/tmp/pgtable';
- DELETE FROM new;
- COPY new WITH OIDS FROM '/tmp/pgtable';
-<!--
- CREATE TABLE new_table (mycol int);
- INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM old_table;
--->
-</PRE>
-
- <P>O<SMALL>ID</SMALL>s are stored as 4-byte integers, and will
- overflow at 4 billion. No one has reported this ever happening, and
- we plan to have the limit removed before anyone does.</P>
-
- <P>T<SMALL>ID</SMALL>s are used to identify specific physical rows
- with block and offset values. T<SMALL>ID</SMALL>s change after rows
- are modified or reloaded. They are used by index entries to point
- to physical rows.</P>
-
- <H4><A name="4.17">4.17</A>) What is the meaning of some of the
- terms used in PostgreSQL?</H4>
-
- <P>Some of the source code and older documentation use terms that
- have more common usage. Here are some:</P>
-
- <UL>
- <LI>table, relation, class</LI>
-
- <LI>row, record, tuple</LI>
-
- <LI>column, field, attribute</LI>
-
- <LI>retrieve, select</LI>
-
- <LI>replace, update</LI>
-
- <LI>append, insert</LI>
-
- <LI><SMALL>OID</SMALL>, serial value</LI>
-
- <LI>portal, cursor</LI>
-
- <LI>range variable, table name, table alias</LI>
- </UL>
-
- <P>A list of general database terms can be found at: <A href=
- "http://www.comptechnews.com/~reaster/dbdesign.html">http://www.comptechnews.com/~reaster/dbdesign.html</A></P>
-
- <H4><A name="4.18">4.18</A>) Why do I get the error <I>"ERROR:
- Memory exhausted in AllocSetAlloc()"</I>?</H4>
-
- <P>If you are running a version older than 7.1, an upgrade may fix
- the problem. Also it is possible you have run out of virtual memory
- on your system, or your kernel has a low limit for certain
- resources. Try this before starting <I>postmaster</I>:</P>
-<PRE>
- ulimit -d 262144
- limit datasize 256m
-</PRE>
- Depending on your shell, only one of these may succeed, but it will
- set your process data segment limit much higher and perhaps allow
- the query to complete. This command applies to the current process,
- and all subprocesses created after the command is run. If you are
- having a problem with the <SMALL>SQL</SMALL> client because the
- backend is returning too much data, try it before starting the
- client.
-
- <H4><A name="4.19">4.19</A>) How do I tell what PostgreSQL version
- I am running?</H4>
-
- <P>From <I>psql</I>, type <CODE>select version();</CODE></P>
-
- <H4><A name="4.20">4.20</A>) Why does my large-object operations
- get <I>"invalid large obj descriptor"</I>?</H4>
-
- <P>You need to put <CODE>BEGIN WORK</CODE> and <CODE>COMMIT</CODE>
- around any use of a large object handle, that is, surrounding
- <CODE>lo_open</CODE> ... <CODE>lo_close.</CODE></P>
-
- <P>Currently PostgreSQL enforces the rule by closing large object
- handles at transaction commit. So the first attempt to do anything
- with the handle will draw <I>invalid large obj descriptor</I>. So
- code that used to work (at least most of the time) will now
- generate that error message if you fail to use a transaction.</P>
-
- <P>If you are using a client interface like <SMALL>ODBC</SMALL> you
- may need to set <CODE>auto-commit off.</CODE></P>
-
- <H4><A name="4.21">4.21</A>) How do I create a column that will
- default to the current time?</H4>
-
- <P>Use <I>CURRENT_TIMESTAMP</I>:</P>
-<PRE>
-<CODE>CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
-</CODE>
-</PRE>
-
- <H4><A name="4.22">4.22</A>) Why are my subqueries using
- <CODE><SMALL>IN</SMALL></CODE> so slow?</H4>
-
- <P>Currently, we join subqueries to outer queries by sequentially
- scanning the result of the subquery for each row of the outer
- query. A workaround is to replace <CODE>IN</CODE> with
- <CODE>EXISTS</CODE>:</P>
-<PRE>
-<CODE>SELECT *
- FROM tab
- WHERE col1 IN (SELECT col2 FROM TAB2)
-</CODE>
-</PRE>
- to:
-<PRE>
-<CODE>SELECT *
- FROM tab
- WHERE EXISTS (SELECT col2 FROM TAB2 WHERE col1 = col2)
-</CODE>
-</PRE>
- We hope to fix this limitation in a future release.
-
- <H4><A name="4.23">4.23</A>) How do I perform an outer join?</H4>
-
- <P>PostgreSQL 7.1 and later supports outer joins using the SQL
- standard syntax. Here are two examples:</P>
-<PRE>
- SELECT *
- FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
-</PRE>
- or
-<PRE>
- SELECT *
- FROM t1 LEFT OUTER JOIN t2 USING (col);
-</PRE>
-
- <P>These identical queries join t1.col to t2.col, and also return
- any unjoined rows in t1 (those with no match in t2). A
- <SMALL>RIGHT</SMALL> join would add unjoined rows of t2. A
- <SMALL>FULL</SMALL> join would return the matched rows plus all
- unjoined rows from t1 and t2. The word <SMALL>OUTER</SMALL> is
- optional and is assumed in <SMALL>LEFT</SMALL>,
- <SMALL>RIGHT</SMALL>, and <SMALL>FULL</SMALL> joins. Ordinary joins
- are called <SMALL>INNER</SMALL> joins.</P>
-
- <P>In previous releases, outer joins can be simulated using
- <SMALL>UNION</SMALL> and <SMALL>NOT IN</SMALL>. For example, when
- joining <I>tab1</I> and <I>tab2</I>, the following query does an
- <I>outer</I> join of the two tables:<BR>
- <BR>
- </P>
-<PRE>
- SELECT tab1.col1, tab2.col2
- FROM tab1, tab2
- WHERE tab1.col1 = tab2.col1
- UNION ALL
- SELECT tab1.col1, NULL
- FROM tab1
- WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
- ORDER BY col1
-</PRE>
-
- <H4><A name="4.24">4.24</A>) How do I perform queries using
- multiple databases?</H4>
-
- <P>There is no way to query any database except the current one.
- Because PostgreSQL loads database-specific system catalogs, it is
- uncertain how a cross-database query should even behave.</P>
-
- <P>Of course, a client can make simultaneous connections to
- different databases and merge the information that way.</P>
-
- <H4><A name="4.25">4.25</A>) How do I return multiple rows or
- columns from a function?</H4>
-
- <P>You can return result sets from PL/pgSQL functions using
- <I>refcursors</I>. See <A href=
- "http://developer.postgresql.org/docs/postgres/plpgsql-cursors.html">
- http://developer.postgresql.org/docs/postgres/plpgsql-cursors.html,</A>
- section 23.7.3.3.</P>
-
- <H4><A name="4.26">4.26</A>) Why can't I reliably create/drop
- temporary tables in PL/PgSQL functions?</H4>
- PL/PgSQL caches function contents, and an unfortunate side effect
- is that if a PL/PgSQL function accesses a temporary table, and that
- table is later dropped and recreated, and the function called
- again, the function will fail because the cached function contents
- still point to the old temporary table. The solution is to use
- <SMALL>EXECUTE</SMALL> for temporary table access in PL/PgSQL. This
- will cause the query to be reparsed every time.
-
- <HR>
-
- <H2 align="center">Extending PostgreSQL</H2>
-
- <H4><A name="5.1">5.1</A>) I wrote a user-defined function. When I
- run it in <I>psql</I>, why does it dump core?</H4>
-
- <P>The problem could be a number of things. Try testing your
- user-defined function in a stand-alone test program first.</P>
-
- <H4><A name="5.2">5.2</A>) How can I contribute some nifty new
- types and functions to PostgreSQL?</H4>
-
- <P>Send your extensions to the <I>pgsql-hackers</I> mailing list,
- and they will eventually end up in the <I>contrib/</I>
- subdirectory.</P>
-
- <H4><A name="5.3">5.3</A>) How do I write a C function to return a
- tuple?</H4>
-
- <P>This requires wizardry so extreme that the authors have never
- tried it, though in principle it can be done.</P>
-
- <H4><A name="5.4">5.4</A>) I have changed a source file. Why does
- the recompile not see the change?</H4>
-
- <P>The <I>Makefiles</I> do not have the proper dependencies for
- include files. You have to do a <I>make clean</I> and then another
- <I>make</I>. If you are using <SMALL>GCC</SMALL> you can use the
- <I>--enable-depend</I> option of <I>configure</I> to have the
- compiler compute the dependencies automatically.</P>
- </BODY>
-</HTML>
-