<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.postgresql.org/skins/common/feed.css?207"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.postgresql.org/index.php?title=Special:Contributions&amp;feed=atom&amp;target=Mastermind</id>
		<title>PostgreSQL wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.postgresql.org/index.php?title=Special:Contributions&amp;feed=atom&amp;target=Mastermind"/>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Special:Contributions/Mastermind"/>
		<updated>2013-05-22T04:40:06Z</updated>
		<subtitle>From PostgreSQL wiki</subtitle>
		<generator>MediaWiki 1.15.5-2squeeze5</generator>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Todo</id>
		<title>Todo</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Todo"/>
				<updated>2013-01-27T19:01:07Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;margin: 1ex 1em; float: right;&amp;quot;&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This list contains '''known PostgreSQL bugs and feature requests''' and we hope it is complete. If you would like to work on an item, please read the [[Developer FAQ]] first. There is also a [[Development_information|development information page]].&lt;br /&gt;
&lt;br /&gt;
* {{TodoPending}} - marks ordinary, incomplete items&lt;br /&gt;
* {{TodoEasy}} - marks items that are easier to implement&lt;br /&gt;
* {{TodoDone}} - marks changes that are done, and will appear in the PostgreSQL 9.3 release.&lt;br /&gt;
&lt;br /&gt;
For help on editing this list, please see [[Talk:Todo]]. &amp;lt;b&amp;gt;Please do not add items here without discussion on the mailing list.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;For Developers:&amp;lt;/b&amp;gt; Unfortunately this list does not contain all the information necessary for someone to start coding a feature.  Some of these items might have become unnecessary since they were added --- others might be desirable but the implementation might be unclear.  When selecting items listed below, be prepared to first discuss the value of the feature. Do not assume that you can select one, code it and then expect it to be committed. Always discuss design on Hackers list before starting to code.  The flow should be:&lt;br /&gt;
&lt;br /&gt;
     Desirability -&amp;gt; Design -&amp;gt; Implement -&amp;gt; Test -&amp;gt; Review -&amp;gt; Commit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 1ex 4em;&amp;quot;&amp;gt;&lt;br /&gt;
== Administration ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow administrators to cancel multi-statement idle transactions&lt;br /&gt;
|This allows locks to be released, but it is complex to report the cancellation back to the client.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-12/msg01340.php &amp;lt;nowiki&amp;gt;Cancelling idle in transaction state&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-12/msg00441.php &amp;lt;nowiki&amp;gt;Re: Cancelling idle in transaction state&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Check for unreferenced table files created by transactions that were in-progress when the server terminated abruptly&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-06/msg00096.php &amp;lt;nowiki&amp;gt;Removing unreferenced files&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Set proper permissions on non-system schemas during db creation&lt;br /&gt;
|Currently all schemas are owned by the super-user because they are copied from the template1 database.  However, since all objects are inherited from the template database, it is not clear that setting schemas to the db owner is correct.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow log_min_messages to be specified on a per-module basis&lt;br /&gt;
|This would allow administrators to see more detailed information from specific sections of the backend, e.g. checkpoints, autovacuum, etc. Another idea is to allow separate configuration files for each module, or allow arbitrary SET commands to be passed to them. See also [[Logging Brainstorm]].}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Simplify creation of partitioned tables&lt;br /&gt;
|This would allow creation of partitioned tables without requiring creation of triggers or rules for INSERT/UPDATE/DELETE, and constraints for rapid partition selection.  Options could include range and hash partition selection. See also [[Table partitioning]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow custom variables to appear in pg_settings()&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00850.php &amp;lt;nowiki&amp;gt;Re: count(*) performance improvement ideas&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have custom variables be transaction-safe&lt;br /&gt;
* {{MessageLink|4B577E9F.8000505@dunslane.net|Custom GUCs still a bit broken}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement the SQL-standard mechanism whereby REVOKE ROLE revokes only the privilege granted by the invoking role, and not those granted by other roles&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-05/msg00010.php &amp;lt;nowiki&amp;gt;Re: Grantor name gets lost when grantor role dropped&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent query cancel packets from being replayed by an attacker, especially when using SSL&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-08/msg00345.php &amp;lt;nowiki&amp;gt;Replay attack of query cancel&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide a way to query the log collector subprocess to determine the name of the currently active log file&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2008-11/msg00418.php &amp;lt;nowiki&amp;gt;Current log files when rotating?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow simpler reporting of the unix domain socket directory and allow easier configuration of its default location&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-10/msg01555.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-10/msg01482.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow custom daemons to be automatically stopped/started along with the postmaster&lt;br /&gt;
|This allows easier administration of daemons like user job schedulers or replication-related daemons.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg01701.php &amp;lt;nowiki&amp;gt;Re: scheduler in core&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve logging of prepared transactions recovered during startup&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-11/msg00092.php &amp;lt;nowiki&amp;gt;&amp;amp;quot;recovering prepared transaction&amp;amp;quot; after server restart message&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Consider using POSIX shared memory to avoid System V shared memory kernel limits&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4DFA2673.3010009@enterprisedb.com &amp;lt;nowiki&amp;gt;POSIX shared memory patch status&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Configuration files ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Change pg_ident.conf parsing to be the same as pg_hba.conf&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-06/msg02204.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow postgresql.conf file values to be changed via an SQL API, perhaps using SET GLOBAL&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-10/msg00764.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-10/msg01509.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-11/msg00002.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider normalizing fractions in postgresql.conf, perhaps using '%'&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-06/msg00550.php &amp;lt;nowiki&amp;gt;Fractions in GUC variables&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow Kerberos to disable stripping of realms so we can check the username@realm against multiple realms&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00009.php &amp;lt;nowiki&amp;gt;krb_match_realm patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve LDAP authentication configuration options&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01745.php &amp;lt;nowiki&amp;gt;Proposed Patch - LDAPS support for servers on port 636 w/o TLS&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add external tool to auto-tune some postgresql.conf parameters&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00000.php &amp;lt;nowiki&amp;gt;Re: Overhauling GUCS&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-11/msg00033.php &amp;lt;nowiki&amp;gt;Simple postgresql.conf wizard&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add 'hostgss' pg_hba.conf option to allow GSS link-level encryption&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-07/msg01454.php &amp;lt;nowiki&amp;gt;Re: Plans for 8.4&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Process pg_hba.conf keywords as case-insensitive&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-09/msg00432.php &amp;lt;nowiki&amp;gt;More robust pg_hba.conf parsing/error logging&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Create utility to compute accurate random_page_cost value&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2011-04/msg00162.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2011-04/msg00362.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow configuration files to be independently validated&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-03/msg01831.php&lt;br /&gt;
* http://archives.postgresql.org/message-id/12666.1310774573@sss.pgh.pa.us&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow postgresql.conf settings to be accepted by backends even if some settings are invalid for those backends&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-04/msg00330.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-05/msg00375.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow all backends to receive postgresql.conf setting changes at the same time&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-04/msg00330.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-05/msg00375.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow synchronous_standby_names to be disabled after communication failure with all synchronous standby servers exceeds some timeout&lt;br /&gt;
|This also requires successful execution of a synchronous notification command.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-07/msg00409.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Tablespaces ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow a database in tablespace t1 with tables created in tablespace t2 to be used as a template for a new database created with default tablespace t2&lt;br /&gt;
|Currently all objects in the default database tablespace must have default tablespace specifications. This is because new databases are created by copying directories. If you mix default tablespace tables and tablespace-specified tables in the same directory, creating a new database from such a mixed directory would create a new database with tables that had incorrect explicit tablespaces.  To fix this would require modifying pg_class in the newly copied database, which we don't currently do.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow reporting of which objects are in which tablespaces&lt;br /&gt;
|This item is difficult because a tablespace can contain objects from multiple databases. There is a server-side function that returns the databases which use a specific tablespace, so this requires a tool that will call that function and connect to each database to find the objects in each database for that tablespace.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow WAL replay of CREATE TABLESPACE to work when the directory structure on the recovery computer is different from the original}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow per-tablespace quotas}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow tablespaces on RAM-based partitions for unlogged tables&lt;br /&gt;
* http://archives.postgresql.org/pgsql-advocacy/2011-05/msg00033.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow toast tables to be moved to a different tablespace&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2011-05/msg00980.php]&lt;br /&gt;
* {{messageLink|CAFEQCbH756DyyAPQ1ykh3+b+kE1-EhWRww1WO_x5v38C-uLnUg@mail.gmail.com|patch : Allow toast tables to be moved to a different tablespace}} (issues remain)&lt;br /&gt;
* [http://archives.postgresql.org/message-id/CAFEQCbEq07OopgE5xFYv2Q3eMq45hRSJkjCBO+kvpJq9NEVhow@mail.gmail.com Allow toast tables to be moved to a different tablespace]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Statistics Collector ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow statistics last vacuum/analyze execution times to be displayed without requiring track_counts to be enabled&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-docs/2007-04/msg00028.php &amp;lt;nowiki&amp;gt;row-level stats and last analyze time&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Clear table counters on TRUNCATE&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg00169.php &amp;lt;nowiki&amp;gt;Small TRUNCATE glitch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== SSL ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow SSL authentication/encryption over unix domain sockets&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00924.php &amp;lt;nowiki&amp;gt;Re: Spoofing as the postmaster&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow SSL key file permission checks to be optionally disabled when sharing SSL keys with other applications&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-12/msg00069.php &amp;lt;nowiki&amp;gt;BUG #3809: SSL &amp;amp;quot;unsafe&amp;amp;quot; private key permissions bug&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow SSL CRL files to be re-read during configuration file reload, rather than requiring a server restart&lt;br /&gt;
|Unlike SSL CRT files, CRL (Certificate Revocation List) files are updated frequently&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2008-12/msg00832.php &amp;lt;nowiki&amp;gt;Automatic CRL reload&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
Alternatively or additionally supporting OCSP (online certificate security protocol) would provide real-time revocation discovery without reloading&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Allow automatic selection of SSL client certificates from a certificate store&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-05/msg00406.php &amp;lt;nowiki&amp;gt;Allow multiple certificates or keys in the postgresql.crt/.key files&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Send the full certificate server chain to the client&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-12/msg00145.php BUG #5245: Full Server Certificate Chain Not Sent to client]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Point-In-Time Recovery (PITR) ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Create dump tool for write-ahead logs for use in determining transaction id for point-in-time recovery&lt;br /&gt;
|This is useful for checking PITR recovery.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow archive_mode to be changed without server restart?&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-10/msg01655.php &amp;lt;nowiki&amp;gt;Enabling archive_mode without restart&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider avoiding WAL switching via archive_timeout if there has been no database activity&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-01/msg01469.php &amp;lt;nowiki&amp;gt;archive_timeout behavior for no activity&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg00395.php &amp;lt;nowiki&amp;gt;Re: archive_timeout behavior for no activity&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow base backup from standby to continue when the standby is promoted.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2012-10/msg00239.php &amp;lt;nowiki&amp;gt;Re: Promoting a standby during base backup&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Standby server mode ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Allow pg_xlogfile_name() to be used in recovery mode&lt;br /&gt;
* [http://archives.postgresql.org/message-id/3f0b79eb1001190135vd9f62f1sa7868abc1ea61d12@mail.gmail.com &amp;lt;nowiki&amp;gt;Streaming replication and pg_xlogfile_name()&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Prevent variables inherited from the server environment from begin used for making streaming replication connections.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg01011.php &amp;lt;nowiki&amp;gt;Re: Parameter name standby_mode&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Change walsender so that it applies per-role settings&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-09/msg00642.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Restructure configuration parameters for standby mode&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-09/msg01820.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemf&lt;br /&gt;
| Allow time-delayed application of logs on the standby&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-04/msg00992.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Add -X parameter to pg_basebackup to specify a different directory for px_xlog, like initdb&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Add a new &amp;quot;eager&amp;quot; synchronous mode that starts out synchronous but reverts to asynchronous after a failure timeout period&lt;br /&gt;
|This would require some type of command to be executed to alert administrators of this change.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-12/msg01224.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Data Types ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix data types where equality comparison is not intuitive, e.g. box&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-10/msg01643.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for public SYNONYMs&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-03/msg00519.php &amp;lt;nowiki&amp;gt;Proposal for SYNONYMS&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-11/msg02043.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-general/2010-12/msg00139.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for SQL-standard GENERATED/IDENTITY columns&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-07/msg00543.php &amp;lt;nowiki&amp;gt;Re: Three weeks left until feature freeze&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-08/msg00038.php &amp;lt;nowiki&amp;gt;GENERATED ... AS IDENTITY, Was: Re: Feature Freeze&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-05/msg00344.php &amp;lt;nowiki&amp;gt;Behavior of GENERATED columns per SQL2003&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-05/msg00076.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] Behavior of GENERATED columns per SQL2003&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00604.php &amp;lt;nowiki&amp;gt;IDENTITY/GENERATED patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider placing all sequences in a single table, or create a system view&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00008.php &amp;lt;nowiki&amp;gt;Re: newbie: renaming sequences task&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2012-02/msg00258.php Removing special case OID generation]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider a special data type for regular expressions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg01067.php &amp;lt;nowiki&amp;gt;Why is there a tsquery data type?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce BIT data type overhead using short varlena headers&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-12/msg00273.php &amp;lt;nowiki&amp;gt;storage size of &amp;amp;quot;bit&amp;amp;quot; data type..&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow renaming and deleting enumerated values from an existing enumerated data type&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support scoped IPv6 addresses in the inet type&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-05/msg00111.php &amp;lt;nowiki&amp;gt;strange problem with ip6&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Considering improving performance of computing CHAR() value lengths&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-06/msg00900.php &amp;lt;nowiki&amp;gt;char() overhead on read-only workloads not so insignifcant as the docs claim it is...&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg01787.php &amp;lt;nowiki&amp;gt;Re: [PATCH] backend: compare word-at-a-time in bcTruelen&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add overlaps geometric operators that ignore point overlaps&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-03/msg00861.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Remove or improve rounding in geometric comparison operators&lt;br /&gt;
* http://archives.postgresql.org/message-id/9804.1346187849@sss.pgh.pa.us&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Add IMMUTABLE column attribute&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-11/msg00623.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Domains ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow functions defined as casts to domains to be called during casting&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-05/msg00072.php &amp;lt;nowiki&amp;gt;bug? non working casts for domain&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-09/msg01681.php &amp;lt;nowiki&amp;gt;TODO: Fix CREATE CAST on DOMAINs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow values to be cast to domain types&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2003-06/msg01206.php &amp;lt;nowiki&amp;gt;Domain casting still doesn't work right&amp;lt;/nowiki&amp;gt;] &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00289.php &amp;lt;nowiki&amp;gt;domain casting?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-05/msg00812.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make domains work better with polymorphic functions&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4887.1228700773@sss.pgh.pa.us Polymorphic types vs. domains]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/15535.1238774571@sss.pgh.pa.us some difficulties with fixing it]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Dates and Times ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow infinite intervals just like infinite timestamps&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-11/msg00076.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Determine how to represent date/time field extraction on infinite timestamps&lt;br /&gt;
* [http://archives.postgresql.org/message-id/CA+mi_8bda-Fnev9iXeUbnqhVaCWzbYhHkWoxPQfBca9eDPpRMw@mail.gmail.com extract(epoch from infinity) is not 0]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/CADAkt-icuESH16uLOCXbR-dKpcvwtUJE4JWXnkdAjAAwP6j12g@mail.gmail.com converting between infinity timestamp and float8]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow TIMESTAMP WITH TIME ZONE to store the original timezone information, either zone name or offset from UTC&lt;br /&gt;
|If the TIMESTAMP value is stored with a time zone name, interval computations should adjust based on the time zone rules. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-10/msg00705.php &amp;lt;nowiki&amp;gt;timestamp with time zone a la sql99&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have timestamp subtraction not call justify_hours()?&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-sql/2006-10/msg00059.php &amp;lt;nowiki&amp;gt;timestamp subtraction (was Re: formatting intervals with to_char)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve TIMESTAMP WITH TIME ZONE subtraction to be DST-aware&lt;br /&gt;
|Currently subtracting one date from another that crosses a daylight savings time adjustment can return '1 day 1 hour', but adding that back to the first date returns a time one hour in the future.  This is caused by the adjustment of '25 hours' to '1 day 1 hour', and '1 day' is the same time the next day, even if daylight savings adjustments are involved.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix interval display to support values exceeding 2^31 hours}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add overflow checking to timestamp and interval arithmetic}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add function to allow the creation of timestamps using parameters&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2010-06/msg00232.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Arrays ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for arrays of domains&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-05/msg00114.php &amp;lt;nowiki&amp;gt;Re: updated WIP: arrays of composites&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow single-byte header storage for array elements}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add function to detect if an array is empty&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-11/msg00475.php &amp;lt;nowiki&amp;gt;Re: array_length()&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve handling of empty arrays&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-10/msg01033.php &amp;lt;nowiki&amp;gt;So what's an &amp;amp;quot;empty&amp;amp;quot; array anyway?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-general/2012-07/msg00633.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve handling of NULLs in arrays&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2008-11/msg00009.php &amp;lt;nowiki&amp;gt;BUG #4509: array_cat's null behaviour is inconsistent&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-11/msg01040.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Binary Data ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve vacuum of large objects, like contrib/vacuumlo?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Auto-delete large objects when referencing row is deleted&lt;br /&gt;
|contrib/lo offers this functionality.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow read/write into TOAST values like large objects&lt;br /&gt;
|Writing might require the TOAST column to be stored EXTERNAL.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-06/msg00049.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add API for 64-bit large object access&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-09/msg00781.php &amp;lt;nowiki&amp;gt;64-bit API for large objects&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-09/msg01790.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== MONEY Data Type ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add locale-aware MONEY type, and support multiple currencies&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2005-08/msg01432.php &amp;lt;nowiki&amp;gt;A real currency type&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg01181.php &amp;lt;nowiki&amp;gt;Money type todos?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|MONEY dumps in a locale-specific format making it difficult to restore to a system with a different locale}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Text Search ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow dictionaries to change the token that is passed on to later dictionaries&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-11/msg00081.php &amp;lt;nowiki&amp;gt;a tsearch2 (8.2.4) dictionary that only filters out stopwords&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider a function-based API for '@@' searches&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00511.php &amp;lt;nowiki&amp;gt;Simplifying Text Search&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve text search error messages&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg00966.php &amp;lt;nowiki&amp;gt;Poorly designed tsearch NOTICEs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg01146.php &amp;lt;nowiki&amp;gt;Re: Poorly designed tsearch NOTICEs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider changing error to warning for strings larger than one megabyte&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2008-02/msg00190.php &amp;lt;nowiki&amp;gt;BUG #3975: tsearch2 index should not bomb out of 1Mb limit&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-03/msg00062.php &amp;lt;nowiki&amp;gt;Re: [BUGS] BUG #3975: tsearch2 index should not bomb out of 1Mb limit&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|tsearch and tsdicts regression tests fail in Turkish locale on glibc&lt;br /&gt;
* [http://archives.postgresql.org/message-id/49749645.5070801@gmx.net tsearch with Turkish locale]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|tsquery negator operator treated as part of lexeme&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-06/msg00346.php BUG #4887: inclusion operator (@&amp;gt;) on tsqeries behaves not conforming to documentation]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve handling of dash and plus signs in email address user names, and perhaps improve URL parsing&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-10/msg00772.php&lt;br /&gt;
* [http://archives.postgresql.org/message-id/E1Ri8il-0008Ct-9p@wrigleys.postgresql.org tsearch does not recognize all valid emails]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve default parser, to more easily allow adding new tokens&lt;br /&gt;
* http://archives.postgresql.org/message-id/23485.1297727826@sss.pgh.pa.us&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add additional support functions&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-06/msg00319.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== XML ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow XML arrays to be cast to other data types&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-09/msg00981.php &amp;lt;nowiki&amp;gt;proposal casting from XML[] to int[], numeric[], text[]&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg00231.php &amp;lt;nowiki&amp;gt;Re: proposal casting from XML[] to int[], numeric[], text[]&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00471.php &amp;lt;nowiki&amp;gt;Re: proposal casting from XML[] to int[], numeric[], text[]&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add XML Schema validation and xmlvalidate functions (SQL:2008)}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add xmlvalidatedtd variant to support validating against a DTD?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Relax-NG validation; libxml2 supports this already}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow reliable XML operation non-UTF8 server encodings (xpath(), in particular, is known to not work)&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-01/msg00135.php &amp;lt;nowiki&amp;gt;BUG #4622: xpath only work in utf-8 server encoding&amp;lt;/nowiki&amp;gt;] &lt;br /&gt;
* http://archives.postgresql.org/message-id/4110.1238973350@sss.pgh.pa.us}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add functions from SQL:2006: XMLDOCUMENT, XMLCAST, XMLTEXT}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add XMLNAMESPACES support in XMLELEMENT and elsewhere}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Move XSLT from contrib/xml2 to a more reasonable location&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-08/msg00539.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Report errors returned by the XSLT library&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-08/msg00562.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve the XSLT parameter passing API&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-08/msg00416.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|XML Canonical: Convert XML documents to canonical form to compare them. libxml2 has support for this.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add pretty-printed XML output option&lt;br /&gt;
|Parse a document and serialize it back in some indented form. libxml2 might support this.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add XMLQUERY (from the SQL/XML standard)}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow XML sthredding&lt;br /&gt;
|In some cases shredding could be better option (if there is no need to keep XML docs entirely, e.g. if we have already developed tools that understand only relational data.  This would be a separate module that implements annotated schema decomposition technique, similar to DB2 and SQL Server functionality.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix Nested or repeated xpath() that apparently mess up namespaces [http://archives.postgresql.org/pgsql-bugs/2008-03/msg00097.php] [http://archives.postgresql.org/pgsql-bugs/2008-03/msg00144.php] [http://archives.postgresql.org/pgsql-general/2008-03/msg00295.php] [http://archives.postgresql.org/pgsql-bugs/2008-07/msg00054.php] [http://archives.postgresql.org/message-id/004f01c90e91$138e9d10$3aabd730$@anstett@iaas.uni-stuttgart.de]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|XPath: Adding the &amp;lt;x&amp;gt; at the root causes problems [http://archives.postgresql.org/pgsql-bugs/2008-05/msg00184.php] [http://archives.postgresql.org/pgsql-bugs/2008-07/msg00054.php] [http://archives.postgresql.org/pgsql-general/2008-07/msg00613.php]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|xpath_table needs to be implemented/implementable to get rid of contrib/xml2 [http://archives.postgresql.org/pgsql-general/2008-05/msg00823.php]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|xpath_table is pretty broken anyway [http://archives.postgresql.org/pgsql-hackers/2010-02/msg02424.php]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|better handling of XPath data types [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00616.php] [http://archives.postgresql.org/message-id/004a01c90e90$4b986d90$e2c948b0$@anstett@iaas.uni-stuttgart.de]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve handling of PIs and DTDs in xmlconcat() [http://archives.postgresql.org/message-id/200904211211.n3LCB09p008988@wwwmaster.postgresql.org]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Restructure XML and /contrib/xml2 functionality&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-02/msg02314.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-03/msg00017.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow INET subnet comparisons using non-constants to be indexed}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add an INET overlaps operator, for use by exclusion constraints &lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-03/msg00845.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Enforce typmod for function inputs, function results and parameters for spi_prepare'd statements called from PLs&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-01/msg01403.php &amp;lt;nowiki&amp;gt;Re: BUG #2917: spi_prepare doesn't accept typename aliases&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-11/msg01160.php &amp;lt;nowiki&amp;gt;RFC for adding typmods to functions&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix IS OF so it matches the ISO specification, and add documentation&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2003-08/msg00060.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] IS OF&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-02/msg00060.php &amp;lt;nowiki&amp;gt;ToDo: add documentation for operator IS OF&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement Boyer-Moore searching in LIKE queries&lt;br /&gt;
* {{messageLink|27645.1220635769@sss.pgh.pa.us|TODO item: Implement Boyer-Moore searching (First time hacker)}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent malicious functions from being executed with the permissions of unsuspecting users&lt;br /&gt;
|Index functions are safe, so VACUUM and ANALYZE are safe too.  Triggers, CHECK and DEFAULT expressions, and rules are still vulnerable. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00268.php &amp;lt;nowiki&amp;gt;Some notes about the index-functions security vulnerability&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce memory usage of aggregates in set returning functions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2008-01/msg00031.php &amp;lt;nowiki&amp;gt;Re: Performance of aggregates over set-returning functions&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix /contrib/ltree operator&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-11/msg00044.php &amp;lt;nowiki&amp;gt;BUG #3720: wrong results at using ltree&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix /contrib/btree_gist's implementation of inet indexing&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2010-10/msg00099.php &amp;lt;nowiki&amp;gt;BUG #5705: btree_gist: Index on inet changes query result&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Fix inconsistent precedence of =, &amp;amp;gt;, and &amp;amp;lt; compared to &amp;amp;lt;&amp;amp;gt;, &amp;amp;gt;=, and &amp;amp;lt;=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-12/msg00145.php &amp;lt;nowiki&amp;gt;BUG #3822: Nonstandard precedence for comparison operators&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix regular expression bug when using complex back-references&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-10/msg00000.php &amp;lt;nowiki&amp;gt;BUG #3645: regular expression back references seem broken&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have /contrib/dblink reuse unnamed connections&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg00895.php &amp;lt;nowiki&amp;gt;dblink un-named connection doesn't get re-used&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve formatting of pg_get_viewdef() output&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-01/msg01648.php &amp;lt;nowiki&amp;gt;pg_get_viewdef formattiing&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-08/msg01885.php &amp;lt;nowiki&amp;gt;Re: pretty print viewdefs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2011-12/msg00906.php reprise: pretty print viewdefs]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add function to dump pg_depend information cleanly&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-09/msg00226.php &amp;lt;nowiki&amp;gt;Elementary dependency look-up&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add function to allow easier transaction id comparisons&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-11/msg00786.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Character Formatting ===&lt;br /&gt;
&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow to_date() and to_timestamp() to accept localized month names}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add missing parameter handling in to_char()&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-12/msg00948.php &amp;lt;nowiki&amp;gt;Re: to_char and i18n&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Throw an error from to_char() instead of printing a string of &amp;quot;#&amp;quot; when a number doesn't fit in the desired output format.&lt;br /&gt;
* discussed in [http://archives.postgresql.org/message-id/37ed240d0907290836w42187222n18664dfcbcb445b1@mail.gmail.com &amp;quot;to_char, support for EEEE format&amp;quot;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow to_char() on interval values to accumulate the highest unit requested&lt;br /&gt;
|2= Some special format flag would be required to request such accumulation.  Such functionality could also be added to EXTRACT. Prevent accumulation that crosses the month/day boundary because of the uneven number of days in a month.&lt;br /&gt;
* to_char(INTERVAL '1 hour 5 minutes', 'MI') =&amp;amp;gt; 65&lt;br /&gt;
* to_char(INTERVAL '43 hours 20 minutes', 'MI' ) =&amp;amp;gt; 2600&lt;br /&gt;
* to_char(INTERVAL '43 hours 20 minutes', 'WK:DD:HR:MI') =&amp;amp;gt; 0:1:19:20&lt;br /&gt;
* to_char(INTERVAL '3 years 5 months','MM') =&amp;amp;gt; 41&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix to_number() handling for values not matching the format string&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-09/msg01447.php &amp;lt;nowiki&amp;gt;Re: numeric_to_number() function skipping some digits&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Multi-Language Support ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add NCHAR (as distinguished from ordinary varchar),}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a cares-about-collation column to pg_proc, so that unresolved-collation errors can be thrown at parse time&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2011-03/msg01520.php &amp;lt;nowiki&amp;gt;Open issues for collations&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Integrate collations with text search configurations&lt;br /&gt;
* [http://archives.postgresql.org/message-id/28887.1303579034@sss.pgh.pa.us &amp;lt;nowiki&amp;gt;Some TODO items for collations&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Integrate collations with to_char() and related functions&lt;br /&gt;
* [http://archives.postgresql.org/message-id/28887.1303579034@sss.pgh.pa.us &amp;lt;nowiki&amp;gt;Some TODO items for collations&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support collation-sensitive equality and hashing functions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2011-06/msg00472.php &amp;lt;nowiki&amp;gt; contrib/citext versus collations&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a LOCALE option to CREATE DATABASE, as a shorthand&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-04/msg00119.php &amp;lt;nowiki&amp;gt; Re: 8.4 open items list&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support multiple simultaneous character sets, per SQL:2008}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve UTF8 combined character handling?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add octet_length_server() and octet_length_client()}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make octet_length_client() the same as octet_length()?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix problems with wrong runtime encoding conversion for NLS message files}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add URL to more complete multi-byte regression tests&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-07/msg00272.php &amp;lt;nowiki&amp;gt;Multi-byte and client side character encoding tests for copy command..&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix contrib/fuzzystrmatch to work with multibyte encodings&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-04/msg00047.php &amp;lt;nowiki&amp;gt; soundex function returns UTF-16 characters&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-04/msg00138.php &amp;lt;nowiki&amp;gt; dmetaphone woes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change memory allocation for multi-byte functions so memory is allocated inside conversion functions&lt;br /&gt;
|Currently we preallocate memory based on worst-case usage.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ability to use case-insensitive regular expressions on multi-byte characters&lt;br /&gt;
|Currently it works for UTF-8, but not other multi-byte encodings&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-12/msg00433.php &amp;lt;nowiki&amp;gt;Regexps vs. locale&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* {{MessageLink|20091201210024.B1393753FB7@cvs.postgresql.org|A partial solution for UTF-8}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve encoding of connection startup messages sent to the client&lt;br /&gt;
|Currently some authentication error messages are sent in the server encoding&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2008-12/msg00801.php &amp;lt;nowiki&amp;gt;encoding of PostgreSQL messages&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2009-01/msg00005.php &amp;lt;nowiki&amp;gt;Re: encoding of PostgreSQL messages&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|More sensible support for Unicode combining characters, normal forms&lt;br /&gt;
* http://archives.postgresql.org/message-id/200904141532.44618.peter_e@gmx.net&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Views / Rules ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Automatically create rules on views so they are updateable, per SQL:2008&lt;br /&gt;
|We can only auto-create rules for simple views.  For more complex cases users will still have to write rules manually.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-03/msg00586.php &amp;lt;nowiki&amp;gt;Proposal for updatable views&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-08/msg00255.php &amp;lt;nowiki&amp;gt;Updatable views&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-01/msg01746.php &amp;lt;nowiki&amp;gt;Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://wiki.postgresql.org/wiki/Updatable_views&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-07/msg00035.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-08/msg00303.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add the functionality of the WITH CHECK OPTION clause to CREATE VIEW&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow VIEW/RULE recompilation when the underlying tables change&lt;br /&gt;
|This is both difficult and controversial.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-12/msg01723.php Re: About &amp;quot;Allow VIEW/RULE recompilation when the underlying tables change&amp;quot;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-12/msg01724.php Re: About &amp;quot;Allow VIEW/RULE recompilation when the underlying tables change2&amp;quot;]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/CACk%3DU9NFSzWrEba8G5dZ%3DTZLy3_hx3QXGyCcKVWT%3D4iA1FjMuA@mail.gmail.com VIEW still referring to old name of field]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make it possible to use RETURNING together with conditional DO INSTEAD rules, such as for partitioning setups&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-09/msg00577.php &amp;lt;nowiki&amp;gt;RETURNING and DO INSTEAD ... Intentional or not?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add the ability to automatically create materialized views&lt;br /&gt;
|Right now materialized views require the user to create triggers on the main table to keep the summary table current.  SQL syntax should be able to manage the triggers and summary table automatically.  A more sophisticated implementation would automatically retrieve from the summary table when the main table is referenced, if possible.  See [[Materialized Views]] for implementation details&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-04/msg00479.php &amp;lt;nowiki&amp;gt;GSoC - proposal - Materialized Views in PostgreSQL&amp;lt;/nowiki&amp;gt;] &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve ability to modify views via ALTER TABLE&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00691.php &amp;lt;nowiki&amp;gt;Re: idea: storing view source in system catalogs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-07/msg01410.php &amp;lt;nowiki&amp;gt;modifying views&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-08/msg00300.php &amp;lt;nowiki&amp;gt;Re: patch: Add columns via CREATE OR REPLACE VIEW&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== SQL Commands ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add CORRESPONDING BY to UNION/INTERSECT/EXCEPT&lt;br /&gt;
* [http://dissipatedheat.com/2011/11/10/how-not-to-write-a-patch-for-postgresql/ How not to write this patch.]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve type determination of unknown (NULL or quoted literal) result columns for UNION/INTERSECT/EXCEPT&lt;br /&gt;
* [http://archives.postgresql.org/message-id/9799.1302719551@sss.pgh.pa.us &amp;lt;nowiki&amp;gt;UNION construct type cast gives poor error message&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ROLLUP, CUBE, GROUPING SETS options to GROUP BY&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-10/msg00838.php &amp;lt;nowiki&amp;gt;WIP: grouping sets support&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-05/msg00466.php &amp;lt;nowiki&amp;gt;Implementation of GROUPING SETS (T431: Extended grouping 	capabilities)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow prepared transactions with temporary tables created and dropped in the same transaction, and when an ON COMMIT DELETE ROWS temporary table is accessed&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00047.php &amp;lt;nowiki&amp;gt;Re: &amp;amp;quot;could not open relation 1663/16384/16584: No such file or directory&amp;amp;quot; in a specific combination of transactions with temp tables&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/492543D5.9050904@enterprisedb.com A suggestion on how to implement this]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a GUC variable to warn about non-standard SQL usage in queries}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add SQL-standard MERGE/REPLACE/UPSERT command&lt;br /&gt;
|MERGE is typically used to merge two tables.  REPLACE or UPSERT command does UPDATE, or on failure, INSERT. See [[SQL MERGE]] for notes on the implementation details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add NOVICE output level for helpful messages&lt;br /&gt;
|For example, have it warn about unjoined tables.  This could also control automatic sequence/index creation messages.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow NOTIFY in rules involving conditionals}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow EXPLAIN to identify tables that were skipped because of constraint_exclusion&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Simplify dropping roles that have objects in several databases}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow the count returned by SELECT, etc to be represented as an int64 to allow a higher range of values}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for WITH RECURSIVE ... CYCLE&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-10/msg00291.php &amp;lt;nowiki&amp;gt;WITH RECURSIVE ... CYCLE in vanilla SQL: issues with arrays of rows&amp;lt;/nowiki&amp;gt;]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add DEFAULT .. AS OWNER so permission checks are done as the table owner&lt;br /&gt;
|This would be useful for SERIAL nextval() calls and CHECK constraints.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow DISTINCT to work in multiple-argument aggregate calls}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add comments on system tables/columns using the information in catalogs.sgml&lt;br /&gt;
|Ideally the information would be pulled from the SGML file automatically.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent the specification of conflicting transaction read/write options&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-01/msg00684.php &amp;lt;nowiki&amp;gt;Re: SET TRANSACTION and SQL Standard&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Support LATERAL subqueries&lt;br /&gt;
|Lateral subqueries can reference columns of tables defined outside the subquery at the same level, i.e. ''laterally''.&lt;br /&gt;
For example, a LATERAL subquery in a FROM clause could reference tables defined in the same FROM clause.&lt;br /&gt;
Currently only the columns of tables defined ''above'' subqueries are recognized.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-09/msg00292.php &amp;lt;nowiki&amp;gt;LATERAL&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-10/msg00991.php &amp;lt;nowiki&amp;gt;Re: LATERAL&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4F5AA202.9020906@gmail.com lateral function as a subquery - WIP patch]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent temporary tables created with ON COMMIT DELETE ROWS from repeatedly truncating the table on every commit if the table is already empty&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-03/msg00842.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2010-03/msg00392.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2010-04/msg00046.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow DELETE and UPDATE to be used with LIMIT and ORDER BY&lt;br /&gt;
* http://archives.postgresql.org/pgadmin-hackers/2010-04/msg00078.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-11/msg01997.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-12/msg00021.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow PREPARE of cursors}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have DISCARD PLANS discard plans cached by functions&lt;br /&gt;
|DISCARD all should do the same.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-01/msg00431.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Avoid multiple-evaluation of BETWEEN and IN arguments containing volatile expressions&lt;br /&gt;
* http://archives.postgresql.org/message-id/4D95B605.2020709@enterprisedb.com&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix nested CASE-WHEN constructs&lt;br /&gt;
* http://archives.postgresql.org/message-id/4DDCEEB8.50602@enterprisedb.com&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CREATE ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow CREATE TABLE AS to determine column lengths for complex expressions like SELECT col1 || col2}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have WITH CONSTRAINTS also create constraint indexes&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-04/msg00149.php &amp;lt;nowiki&amp;gt;Re: CREATE TABLE LIKE INCLUDING INDEXES support&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Move NOT NULL constraint information to pg_constraint&lt;br /&gt;
|Currently NOT NULL constraints are stored in pg_attribute without any designation of their origins, e.g. primary keys.  One manifest problem is that dropping a PRIMARY KEY constraint does not remove the NOT NULL constraint designation.  Another issue is that we should probably force NOT NULL to be propagated from parent tables to children, just as CHECK constraints are.  (But then does dropping PRIMARY KEY affect children?)&lt;br /&gt;
* http://archives.postgresql.org/message-id/19768.1238680878@sss.pgh.pa.us&lt;br /&gt;
* http://archives.postgresql.org/message-id/200909181005.n8IA5Ris061239@wwwmaster.postgresql.org&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-07/msg01223.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-07/msg00358.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent concurrent CREATE TABLE from sometimes returning a cryptic error message&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-10/msg00169.php &amp;lt;nowiki&amp;gt;BUG #3692: Conflicting create table statements throw unexpected error&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add CREATE SCHEMA ... LIKE that copies a schema}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix CREATE OR REPLACE FUNCTION to not leave objects depending on the function in inconsistent state&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2008-08/msg00985.php indexes on functions and create or replace function]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow temporary tables to exist as empty by default in all sessions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00006.php &amp;lt;nowiki&amp;gt;what is difference between LOCAL and GLOBAL TEMP TABLES in PostgreSQL&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-04/msg01329.php &amp;lt;nowiki&amp;gt;idea: global temp tables&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org//pgsql-hackers/2009-05/msg00016.php &amp;lt;nowiki&amp;gt;Re: idea: global temp tables&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-04/msg01098.php &amp;lt;nowiki&amp;gt;global temporary tables&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2012-04/msg01148.php Temporary tables under hot standby]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow the creation of &amp;quot;distinct&amp;quot; types&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-10/msg01647.php &amp;lt;nowiki&amp;gt;Distinct types&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider analyzing temporary tables when they are first used in a query&lt;br /&gt;
|Autovacuum cannot analyze or vacuum temporary tables.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-04/msg00416.php &amp;lt;nowiki&amp;gt;autovacuum and temp tables support&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow an unlogged table to be changed to logged&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-01/msg00315.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-04/msg00437.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-05/msg00323.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-06/msg00237.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== UPDATE ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Allow UPDATE tab SET ROW (col, ...) = (SELECT...)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-07/msg01308.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] extension for sql update&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg00865.php &amp;lt;nowiki&amp;gt;UPDATE using sub selects&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-04/msg00315.php &amp;lt;nowiki&amp;gt;UPDATE using sub selects&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-03/msg00237.php &amp;lt;nowiki&amp;gt;Re: UPDATE using sub selects&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Research self-referential UPDATEs that see inconsistent row versions in read-committed mode&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-05/msg00507.php &amp;lt;nowiki&amp;gt;Concurrently updating an updatable view&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-06/msg00016.php &amp;lt;nowiki&amp;gt;Re: Do we need a TODO? (was Re: Concurrently updating anupdatable view)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve performance of EvalPlanQual mechanism that rechecks already-updated rows&lt;br /&gt;
|This is related to the previous item, which questions whether it even has the right semantics&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2008-09/msg00045.php &amp;lt;nowiki&amp;gt;BUG #4401: concurrent updates to a table blocks one update indefinitely&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-07/msg00302.php &amp;lt;nowiki&amp;gt;BUG #4945: Parallel update(s) gone wild&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== ALTER ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have ALTER TABLE RENAME of a SERIAL column rename the sequence&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00008.php &amp;lt;nowiki&amp;gt;Re: newbie: renaming sequences task&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/CADLWmXUV4LbLhMZL8rYMhCy72aZZLB5BSARPQVgoX0BrxA0FFg@mail.gmail.com renaming implicit sequences]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have ALTER SEQUENCE RENAME rename the sequence name stored in the sequence table&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-09/msg00092.php &amp;lt;nowiki&amp;gt;BUG #3619: Renaming sequence does not update its 'sequence_name' field&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-10/msg00007.php &amp;lt;nowiki&amp;gt;Re: BUG #3619: Renaming sequence does not update its 'sequence_name' field&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00008.php &amp;lt;nowiki&amp;gt;Re: newbie: renaming sequences task&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ALTER DOMAIN to modify the underlying data type}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow ALTER TABLESPACE to move the tablespace to different directories}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow moving system tables to other tablespaces, where possible&lt;br /&gt;
|Currently non-global system tables must be in the default database tablespace. Global system tables can never be moved.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have ALTER INDEX update the name of a constraint using that index}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow column display reordering by recording a display, storage, and permanent id for every column?&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00782.php &amp;lt;nowiki&amp;gt;Re: column ordering, was Re: [PATCHES] Enums patch v2&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-11/msg01029.php &amp;lt;nowiki&amp;gt;Column reordering in pg_dump&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/message-id/1324412114-sup-9608@alvh.no-ip.org&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow deactivating (and reactivating) indexes via ALTER TABLE&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-12/msg01191.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ALTER OPERATOR ... RENAME&lt;br /&gt;
|needs to consider effects of changing operator precedence&lt;br /&gt;
* [http://archives.postgresql.org/message-id/1322948781.26266.9.camel@vanquo.pezone.net Missing rename support]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ALTER TABLE ... RENAME RULE&lt;br /&gt;
* [http://archives.postgresql.org/message-id/1322948781.26266.9.camel@vanquo.pezone.net Missing rename support]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== CLUSTER ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Automatically maintain clustering on a table&lt;br /&gt;
|This might require some background daemon to maintain clustering during periods of low usage. It might also require tables to be only partially filled for easier reorganization.  Another idea would be to create a merged heap/index data file so an index lookup would automatically access the heap data too.  A third idea would be to store heap rows in hashed groups, perhaps using a user-supplied hash function.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2004-08/msg00350.php &amp;lt;nowiki&amp;gt;Equivalent praxis to CLUSTERED INDEX?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00155.php &amp;lt;nowiki&amp;gt;Re: Grouped Index Tuples&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://community.enterprisedb.com/git/&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2009-10/msg00346.php &amp;lt;nowiki&amp;gt;Re: maintain_cluster_order_v5.patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== COPY ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY to report error lines and continue&lt;br /&gt;
|This requires the use of a savepoint before each COPY line is processed, with ROLLBACK on COPY failure. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00572.php &amp;lt;nowiki&amp;gt;Re: VLDB Features&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY FROM to create index entries in bulk&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00811.php &amp;lt;nowiki&amp;gt;Batch update of indexes on data loading&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY in CSV mode to control whether a quoted zero-length string is treated as NULL&lt;br /&gt;
|Currently this is always treated as a zero-length string, which generates an error when loading into an integer column &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00905.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] allow CSV quote in NULL&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve COPY performance&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00954.php &amp;lt;nowiki&amp;gt;Re: 8.3 / 8.2.6 restore comparison&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-08/msg01882.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY to report errors sooner&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01169.php &amp;lt;nowiki&amp;gt;Timely reporting of COPY errors&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY to handle other number formats&lt;br /&gt;
|E.g. the German notation. Best would be something like WITH DECIMAL ','.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow a stalled COPY to exit if the backend is terminated&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-04/msg00067.php &amp;lt;nowiki&amp;gt;Re: possible bug not in open items&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== GRANT/REVOKE ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow SERIAL sequences to inherit permissions from the base table?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow dropping of a role that has connection rights&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00736.php &amp;lt;nowiki&amp;gt;DROP ROLE dependency tracking ...&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== DECLARE CURSOR ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent DROP TABLE from dropping a table referenced by its own open cursor?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide some guarantees about the behavior of cursors that invoke volatile functions&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20997.1244563664@sss.pgh.pa.us Re: Cursor with hold emits the same row more than once across commits in 8.3.7]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== INSERT ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow INSERT/UPDATE of the system-generated oid value for a row}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|In rules, allow VALUES() to contain a mixture of 'old' and 'new' references}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== SHOW/SET ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add SET PERFORMANCE_TIPS option to suggest INDEX, VACUUM, VACUUM ANALYZE, and CLUSTER}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Rationalize the discrepancy between settings that use values in bytes and SHOW that returns the object count&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-docs/2008-07/msg00007.php &amp;lt;nowiki&amp;gt;Re: [ADMIN] shared_buffers and shmmax&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== ANALYZE ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have EXPLAIN ANALYZE issue NOTICE messages when the estimated and actual row counts differ by a specified percentage}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have EXPLAIN ANALYZE report rows as floating-point numbers&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-05/msg01363.php &amp;lt;nowiki&amp;gt;explain analyze rows=%.0f&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-06/msg00108.php &amp;lt;nowiki&amp;gt;Re: explain analyze rows=%.0f&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve how ANALYZE computes in-doubt tuples&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00771.php &amp;lt;nowiki&amp;gt;VACUUM/ANALYZE counting of in-doubt tuples&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Window Functions ===&lt;br /&gt;
See {{messageLink|357.1230492361@sss.pgh.pa.us|TODO items for window functions}}.&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support creation of user-defined window functions&lt;br /&gt;
|We have the ability to create new window functions written in C.  Is it&lt;br /&gt;
worth the effort to create an API that would let them be written in PL/pgsql, etc?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement full support for window framing clauses&lt;br /&gt;
|In addition to done clauses described in the [http://developer.postgresql.org/pgdocs/postgres/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS latest doc], these clauses are not implemented yet.&lt;br /&gt;
* RANGE BETWEEN ... PRECEDING/FOLLOWING&lt;br /&gt;
* EXCLUDE&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Investigate tuplestore performance issues&lt;br /&gt;
|The tuplestore_in_memory() thing is just a band-aid, we ought to try to solve it properly.  tuplestore_advance seems like a weak spot as well.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-12/msg00152.php &amp;lt;nowiki&amp;gt;tuplestore potential performance problem&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem|Do we really need so much duplicated code between Agg and WindowAgg?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Teach planner to evaluate multiple windows in the optimal order&lt;br /&gt;
|Currently windows are always evaluated in the query-specified order.&lt;br /&gt;
* http://archives.postgresql.org/message-id/3CDAD71E9D70417290FCF66F0178D1E1@amd64&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement DISTINCT clause in window aggregates&lt;br /&gt;
|Some proprietary RDBMSs have implemented it already, so it helps with porting from those.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Integrity Constraints ==&lt;br /&gt;
=== Keys ===&lt;br /&gt;
&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve deferrable unique constraints for cases with many conflicts&lt;br /&gt;
|The current implementation fires a trigger for each potentially conflicting row.  This might not scale well for an update that changes many key values at once.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Referential Integrity ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add MATCH PARTIAL referential integrity}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change foreign key constraint for array -&amp;amp;gt; element to mean element in array?&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-10/msg01814.php &amp;lt;nowiki&amp;gt;foreign keys for array/period contains relationships&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix problem when cascading referential triggers make changes on cascaded tables, seeing the tables in an intermediate state&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-09/msg00174.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] Work-in-progress referential action trigger timing&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Are ri_KeysEqual checks in the RI enforcement triggers still necessary?&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2005-10/msg00458.php &amp;lt;nowiki&amp;gt;Re: Effects of cascading references in foreign keys&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Optimize referential integrity checks involving null values&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-04/msg00744.php &amp;lt;nowiki&amp;gt;Can't ri_KeysEqual() consider two nulls as equal?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Check Constraints ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Run check constraints only when affected columns are changed&lt;br /&gt;
* http://archives.postgresql.org/message-id/1326055327.15293.13.camel@vanquo.pezone.net&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Server-Side Languages ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for polymorphic arguments and return types to languages other than PL/PgSQL}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for OUT and INOUT parameters to languages other than PL/PgSQL}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add more fine-grained specification of functions taking arbitrary data types&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-09/msg00367.php &amp;lt;nowiki&amp;gt;RfD: more powerful &amp;amp;quot;any&amp;amp;quot; types&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement stored procedures&lt;br /&gt;
|This might involve the control of transaction state and the return of multiple result sets&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2008-10/msg00454.php &amp;lt;nowiki&amp;gt;PL/pgSQL stored procedure returning multiple result sets (SELECTs)?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg01375.php &amp;lt;nowiki&amp;gt;Proposal: real procedures again (8.4)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-09/msg00542.php&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2011-04/msg01149.php &amp;lt;nowiki&amp;gt;Gathering specs and discussion on feature (post 9.1)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow holdable cursors in SPI}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Add SPI_gettypmod() to return a field's typemod from a TupleDesc&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2005-11/msg00250.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SQL-Language Functions ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Rethink query plan caching and timing of parse analysis within SQL-language functions&lt;br /&gt;
|They should work more like plpgsql functions do ...&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2011-05/msg00078.php &amp;lt;nowiki&amp;gt;Re: BUG #6019: invalid cached plan on inherited table&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== PL/pgSQL ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow handling of %TYPE arrays, e.g. tab.col%TYPE[]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Allow listing of record column names, and access to record columns via variables, e.g. columns := r.(*), tval2 := r.(colname)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-07/msg00458.php &amp;lt;nowiki&amp;gt;Re: PL/PGSQL: Dynamic Record Introspection&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-05/msg00302.php &amp;lt;nowiki&amp;gt;Re: PL/PGSQL: Dynamic Record Introspection&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-06/msg00031.php &amp;lt;nowiki&amp;gt;Re: PL/PGSQL: Dynamic Record Introspection&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow row and record variables to be set to NULL constants, and allow NULL tests on such variables&lt;br /&gt;
|Because a row is not scalar, do not allow assignment from NULL-valued scalars.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-10/msg00070.php &amp;lt;nowiki&amp;gt;NULL and plpgsql rows&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider keeping separate cached copies when search_path changes&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg01009.php &amp;lt;nowiki&amp;gt;pl/pgsql Plan Invalidation and search_path&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve handling of NULL row values vs. NULL rows&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-09/msg01758.php &amp;lt;nowiki&amp;gt;Null row vs. row of nulls in plpgsql&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-10/msg01973.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve PERFORM handling of WITH queries or document limitation&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2011-03/msg00309.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== PL/Perl ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow regex operations in plperl using UTF8 characters in non-UTF8 encoded databases}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== PL/Python ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Develop a trusted variant of PL/Python.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Create a new restricted execution class that will allow passing function arguments in as locals.  Passing them as globals means functions cannot be called recursively.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2011-02/msg01468.php &amp;lt;nowiki&amp;gt;Re: pl/python do not delete function arguments&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a DB-API compliant interface on top of the SPI interface&lt;br /&gt;
* http://petereisentraut.blogspot.com/2011/11/plpydbapi-db-api-for-plpython.html&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|For functions returning a setof record with a composite type, cache the I/O functions for the composite type&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-12/msg02007.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix loss of information during conversion of numeric type to Python float}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== PL/Tcl ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add table function support}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Check encoding validity of values passed back to Postgres in function returns, trigger tuple changes, and SPI calls.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Clients ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a function like pg_get_indexdef() that report more detailed index information&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-12/msg00166.php &amp;lt;nowiki&amp;gt;BUG #3829: Wrong index reporting from pgAdmin III (v1.8.0 rev 6766-6767)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Split out pg_resetxlog output into pre- and post-sections&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-08/msg02040.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== pg_ctl ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve pg_ctl's detection of running postmasters&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-06/msg00000.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-committers/2011-06/msg00001.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add additional shutdown modes, and change the default?&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-04/msg01283.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== psql ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have psql \ds show all sequences and their settings&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-07/msg00916.php &amp;lt;nowiki&amp;gt;Re: TODO item: Have psql show current values for a sequence&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-12/msg00401.php &amp;lt;nowiki&amp;gt;Quick patch: Display sequence owner&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Move psql backslash database information into the backend, use mnemonic commands?&lt;br /&gt;
|This would allow non-psql clients to pull the same information out of the database as psql. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-01/msg00191.php &amp;lt;nowiki&amp;gt;Re: psql \d option list overloaded&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make psql's \d commands more consistent in their handling of schemas&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-11/msg00014.php &amp;lt;nowiki&amp;gt;Re: psql and schemas&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make psql's \d commands distinguish default privileges from no privileges&lt;br /&gt;
|ACL displays were visibly different for the two cases before we &amp;quot;improved&amp;quot; them by using array_to_string.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2011-05/msg00082.php &amp;lt;nowiki&amp;gt;BUG #6021: There is no difference between default and empty access privileges with \dp&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consistently display privilege information for all objects in psql}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|\s without arguments (display history) fails with libedit, doesn't use pager either&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2011-06/msg00114.php &amp;lt;nowiki&amp;gt; psql \s not working - OS X&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a \set variable to control whether \s displays line numbers&lt;br /&gt;
|Another option is to add \# which lists line numbers, and allows command execution.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00255.php &amp;lt;nowiki&amp;gt;Re: psql possible TODO&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Include the symbolic SQLSTATE name in verbose error reports&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-09/msg00438.php &amp;lt;nowiki&amp;gt;Re: Checking is TSearch2 query is valid&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add prompt escape to display the client and server versions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-05/msg00310.php &amp;lt;nowiki&amp;gt;WIP patch for TODO Item: Add prompt escape to display the client and server versions&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add option to wrap column values at whitespace boundaries, rather than chopping them at a fixed width.&lt;br /&gt;
|Currently, &amp;amp;quot;wrapped&amp;amp;quot; format chops values into fixed widths.  Perhaps the word wrapping could use the same algorithm documented in the W3C specification. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00404.php &amp;lt;nowiki&amp;gt;Re: psql wrapped format default for backslash-d commands&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://www.w3.org/TR/CSS21/tables.html#auto-table-layout}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support the ReST table output format&lt;br /&gt;
|Details about the ReST format:  http://docutils.sourceforge.net/rst.html#reference-documentation&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-08/msg01007.php &amp;lt;nowiki&amp;gt;Proposal: new border setting in psql&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-01/msg00518.php &amp;lt;nowiki&amp;gt;Re: Proposal: new border setting in psql&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-01/msg00609.php &amp;lt;nowiki&amp;gt;Re: Proposal: new border setting in psql&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add option to print advice for people familiar with other databases&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-01/msg01845.php &amp;lt;nowiki&amp;gt;MySQL-ism help patch for psql&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ability to edit views with \ev&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-09/msg00023.php &amp;lt;nowiki&amp;gt;Adding \ev view editor?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix FETCH_COUNT to handle SELECT ... INTO and WITH queries&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-05/msg01565.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2010-05/msg00192.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent psql from sending remaining single-line multi-statement queries after reconnecting&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2010-05/msg00159.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-05/msg01283.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Add \i option to bring in the specified file as a quoted literal&lt;br /&gt;
|This would be useful for creating functions and other areas.  Details still need to be worked out.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2011-02/msg00016.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2011-02/msg00020.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider having psql -c read .psqlrc, for consistency&lt;br /&gt;
|psql -f already reads .psqlrc&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow processing of multiple -f (file) options&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve line drawing characters&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-04/msg00386.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider improving the continuation prompt&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-04/msg01772.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve speed of tab completion by using LIKE&lt;br /&gt;
* http://www.postgresql.org/message-id/20121012060345.GA29214@toroid.org&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== pg_dump / pg_restore ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Add full object name to the tag field.  eg. for operators we need '=(integer, integer)', instead of just '='.&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add pg_dumpall custom format dumps?&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2010-05/msg00509.php pg_dumpall custom format]&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Avoid using platform-dependent locale names in pg_dumpall output&lt;br /&gt;
|Using native locale names puts roadblocks in the way of porting a dump to another platform.  One possible solution is to get&lt;br /&gt;
CREATE DATABASE to accept some agreed-on set of locale names and fix them up to meet the platform's requirements.&lt;br /&gt;
* http://archives.postgresql.org/message-id/21396.1241716688@sss.pgh.pa.us&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow selection of individual object(s) of all types, not just tables}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|In a selective dump, allow dumping of an object and all its dependencies}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add options like pg_restore -l and -L to pg_dump}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add support for multiple pg_restore -t options, like pg_dump}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Stop dumping CASCADE on DROP TYPE commands in clean mode}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow pg_dump --clean to drop roles that own objects or have privileges&lt;br /&gt;
|tgl says: if this is about pg_dumpall, it's done as of 8.4.  If it's really about pg_dump, what does it mean?  pg_dump has no business dropping roles.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow pg_restore to load different parts of the COPY data for a single table simultaneously}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Remove support for dumping from pre-7.3 servers&lt;br /&gt;
|In 7.3 and later, we can get accurate dependency information from the server.  pg_dump still contains a lot of crufty code&lt;br /&gt;
to try to deal with the lack of dependency info in older servers, but the usefulness of maintaining that code grows small.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Refactor handling of database attributes between pg_dump and pg_dumpall&lt;br /&gt;
|Currently only pg_dumpall emits database attributes, such as ALTER DATABASE SET commands and database-level GRANTs.&lt;br /&gt;
Many people wish that pg_dump would do that.  One proposal is to let pg_dump issue such commands if the -C switch was used,&lt;br /&gt;
but it's unclear whether that will satisfy the demand.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg01031.php &amp;lt;nowiki&amp;gt;ALTER DATABASE vs pg_dump&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2010-05/msg00010.php summary of the issues]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change pg_dump so that a comment on the dumped database is applied to the loaded database, even if the database has a different name.&lt;br /&gt;
|This will require new backend syntax, perhaps COMMENT ON CURRENT DATABASE. This is related to the previous item.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow parallel restore of tar dumps&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-02/msg01154.php &amp;lt;nowiki&amp;gt;Re: parallel restore&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Preserve sparse storage of large objects over dump/restore&lt;br /&gt;
* [http://archives.postgresql.org/message-id/18789.1349750451@sss.pgh.pa.us &amp;lt;nowiki&amp;gt;TODO item: teach pg_dump about sparsely-stored large objects&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== ecpg ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Docs&lt;br /&gt;
|Document differences between ecpg and the SQL standard and information about the Informix-compatibility module.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Solve cardinality &amp;amp;gt; 1 for input descriptors / variables?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a semantic check level, e.g. check if a table really exists}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|fix handling of DB attributes that are arrays}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix nested C comments}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|sqlwarn[6] should be 'W' if the PRECISION or SCALE value specified}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make SET CONNECTION thread-aware, non-standard?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow multidimensional arrays}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement COPY FROM STDIN}} &lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide a way to specify size of a bytea parameter&lt;br /&gt;
* [http://archives.postgresql.org/message-id/200906192131.n5JLVoMo044178@wwwmaster.postgresql.org &amp;lt;nowiki&amp;gt;BUG #4866: ECPG and BYTEA&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Fix small memory leaks in ecpg&lt;br /&gt;
|Memory leaks in a short running application like ecpg are not really a problem, but make debugging more complicated}} &lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow reuse of cursor name variables&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20100329113435.GA3430@feivel.credativ.lan &amp;lt;nowiki&amp;gt;Problems with variable cursorname in ecpg&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== libpq ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent PQfnumber() from lowercasing unquoted column names&lt;br /&gt;
|PQfnumber() should never have been doing lowercasing, but historically it has so we need a way to prevent it}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider disallowing multiple queries in PQexec() as an additional barrier to SQL injection attacks&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-01/msg00184.php &amp;lt;nowiki&amp;gt;Re: InitPostgres and flatfiles question&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add PQexecf() that allows complex parameter substitution&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg01803.php &amp;lt;nowiki&amp;gt;Last minute mini-proposal (I know, know) for PQexecf()&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add SQLSTATE and severity to errors generated within libpq itself&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-interfaces/2007-11/msg00015.php &amp;lt;nowiki&amp;gt;v8.1: Error severity on libpq PGconn*&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-08/msg01425.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for interface/ipaddress binding to libpq&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg01811.php &amp;lt;nowiki&amp;gt;SR/libpq - outbound interface/ipaddress binding&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== HTTP===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow access to the database via HTTP&lt;br /&gt;
|See [[HTTP_API]]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Triggers ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve storage of deferred trigger queue&lt;br /&gt;
|Right now all deferred trigger information is stored in backend memory.  This could exhaust memory for very large trigger queues. This item involves dumping large queues into files, or doing some kind of join to process all the triggers, some bulk operation, or a bitmap. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00876.php &amp;lt;nowiki&amp;gt;Re: BUG #4204: COPY to table with FK has memory leak&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-10/msg00464.php &amp;lt;nowiki&amp;gt;Scaling up deferred unique checks and the after trigger queue&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-08/msg00023.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow triggers to be disabled in only the current session.&lt;br /&gt;
|This is currently possible by starting a multi-statement transaction, modifying the system tables, performing the desired SQL, restoring the system tables, and committing the transaction.  ALTER TABLE ... TRIGGER requires a table lock so it is not ideal for this usage.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|With disabled triggers, allow pg_dump to use ALTER TABLE ADD FOREIGN KEY&lt;br /&gt;
|If the dump is known to be valid, allow foreign keys to be added without revalidating the data.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow statement-level triggers to access modified rows}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|When statement-level triggers are defined on a parent table, have them fire only on the parent table, and fire child table triggers only where appropriate&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-11/msg01883.php &amp;lt;nowiki&amp;gt;Statement-level triggers and inheritance&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add event triggers&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Tighten trigger permission checks&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00564.php &amp;lt;nowiki&amp;gt;Security leak with trigger functions?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow BEFORE INSERT triggers on views&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-02/msg01466.php &amp;lt;nowiki&amp;gt;Re: Why can't I put a BEFORE EACH ROW trigger on a view?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add database and transaction-level triggers&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00451.php &amp;lt;nowiki&amp;gt;Proposal for db level triggers&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00620.php &amp;lt;nowiki&amp;gt;triggers on prepare, commit, rollback... ?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce locking requirements for creating a trigger&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00635.php &amp;lt;nowiki&amp;gt;Re: Change lock requirements for adding a trigger&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Avoid requirement for &amp;quot;AFTER&amp;quot; trigger functions to return a value&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-02/msg02384.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow creation of inline triggers&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-02/msg00708.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Inheritance ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow inherited tables to inherit indexes, UNIQUE constraints, and primary/foreign keys&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-05/msg00285.php &amp;lt;nowiki&amp;gt;Partitioning/inherited tables vs FKs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-12/msg00039.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-12/msg00305.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Honor UNIQUE INDEX on base column in INSERTs/UPDATEs on inherited table, e.g.  INSERT INTO inherit_table (unique_index_col) VALUES (dup) should fail&lt;br /&gt;
|The main difficulty with this item is the problem of creating an index that can span multiple tables.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Determine whether ALTER TABLE / SET SCHEMA should work on inheritance hierarchies (and thus support ONLY).  If yes, implement it.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|ALTER TABLE variants sometimes support recursion and sometimes not, but this is poorly/not documented, and the ONLY marker would then be silently ignored. Clarify the documentation, and reject ONLY if it is not supported.}}&lt;br /&gt;
&lt;br /&gt;
== Indexes ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent index uniqueness checks when UPDATE does not modify the column&lt;br /&gt;
|Uniqueness (index) checks are done when updating a column even if the column is not modified by the UPDATE.&lt;br /&gt;
However, HOT already short-circuits this in common cases, so more work might not be helpful.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow the creation of on-disk bitmap indexes which can be quickly combined with other bitmap indexes&lt;br /&gt;
|Such indexes could be more compact if there are only a few distinct values. Such indexes can also be compressed.  Keeping such indexes updated can be costly.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-07/msg00512.php &amp;lt;nowiki&amp;gt;Re: Bitmap index AM&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg01107.php &amp;lt;nowiki&amp;gt;Bitmap index thoughts&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg00265.php &amp;lt;nowiki&amp;gt;Stream bitmaps&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg01214.php &amp;lt;nowiki&amp;gt;Re: Bitmapscan changes - Requesting further feedback&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-05/msg00013.php &amp;lt;nowiki&amp;gt;Updated bitmap index patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00741.php &amp;lt;nowiki&amp;gt;Reviewing new index types (was Re: [PATCHES] Updated bitmap indexpatch)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-10/msg01023.php &amp;lt;nowiki&amp;gt;Bitmap Indexes: request for feedback&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/message-id/800923.27831.qm@web29010.mail.ird.yahoo.com &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow accurate statistics to be collected on indexes with more than one column or expression indexes, perhaps using per-index statistics&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2006-10/msg00222.php &amp;lt;nowiki&amp;gt;Re: Simple join optimized badly?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg01131.php &amp;lt;nowiki&amp;gt;Stats for multi-column indexes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-10/msg00741.php &amp;lt;nowiki&amp;gt;Cross-column statistics revisited&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-06/msg01431.php &amp;lt;nowiki&amp;gt;Multi-Dimensional Histograms&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-12/msg00913.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-12/msg02179.php &lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-01/msg00459.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-02/msg02054.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-04/msg01731.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-03/msg00894.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-09/msg00679.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider having a larger statistics target for indexed columns and expression indexes. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider smaller indexes that record a range of values per heap page, rather than having one index entry for every heap row&lt;br /&gt;
|This is useful if the heap is clustered by the indexed values. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00341.php &amp;lt;nowiki&amp;gt;Grouped Index Tuples&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-02/msg01264.php &amp;lt;nowiki&amp;gt;Grouped Index Tuples&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg00465.php &amp;lt;nowiki&amp;gt;Grouped Index Tuples / Clustered Indexes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-03/msg00163.php &amp;lt;nowiki&amp;gt;Bitmapscan changes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00014.php &amp;lt;nowiki&amp;gt;Re: GIT patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00487.php &amp;lt;nowiki&amp;gt;Re: Index Tuple Compression Approach?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01589.php &amp;lt;nowiki&amp;gt;Re: Index AM change proposals, redux&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add REINDEX CONCURRENTLY, like CREATE INDEX CONCURRENTLY&lt;br /&gt;
|This is difficult because you must upgrade to an exclusive table lock to replace the existing index file.  CREATE INDEX CONCURRENTLY does not have this complication.  This would allow index compaction without downtime. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2007-08/msg00289.php &amp;lt;nowiki&amp;gt;Re: When/if to Reindex&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-09/msg00911.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-10/msg00128.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow multiple indexes to be created concurrently, ideally via a single heap scan&lt;br /&gt;
|pg_restore allows parallel index builds, but it is done via subprocesses, and there is no SQL interface for this.&lt;br /&gt;
Cluster could definitely benefit from this.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2011-04/msg00093.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider sorting entries before inserting into btree index&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2008-01/msg01010.php &amp;lt;nowiki&amp;gt;Re: ATTN: Clodaldo was Performance problem. Could it be related to 8.3-beta4?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow creation of an index that can do comparisons to test if a value is between two column values&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00757.php &amp;lt;nowiki&amp;gt;Proposal: temporal extension &amp;amp;quot;period&amp;amp;quot; data type&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider using &amp;quot;effective_io_concurrency&amp;quot; for index scans&lt;br /&gt;
* Currently only bitmap scans use this, which might be fine because most multi-row index scans use bitmap scans.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix problem with btree page splits during checkpoints&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-11/msg00052.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-09/msg00184.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|[http://archives.postgresql.org/pgsql-hackers/2012-05/msg00669.php Support amgettuple() in GIN (useful for exclusion constraints)]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Allow &amp;quot;loose&amp;quot; or &amp;quot;skip&amp;quot; scans on btree indexes in which the first column has low cardinality&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2012-08/msg00159.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GIST ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add more GIST index support for geometric data types}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow GIST indexes to create certain complex index types, like digital trees (see Aoki)}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix performance issues in contrib/seg and contrib/cube GiST support&lt;br /&gt;
* [http://archives.postgresql.org/message-id/alpine.DEB.2.00.0904161633160.4053@aragorn.flymine.org GiST index performance]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/alpine.DEB.2.00.0904221704470.22330@aragorn.flymine.org draft patch]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2009-05/msg00069.php &amp;lt;nowiki&amp;gt;Re: GiST index performance&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2009-06/msg00068.php &amp;lt;nowiki&amp;gt;GiST index performance&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|[http://archives.postgresql.org/message-id/4DC8D284-05CF-4E3D-9670-AC9A32C37A36@justatheory.com GiST index support for arrays]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Hash ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add UNIQUE capability to hash indexes}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add hash WAL logging for crash recovery&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2011-09/msg00196.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow multi-column hash indexes}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Sorting ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider whether duplicate keys should be sorted by block/offset&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00558.php &amp;lt;nowiki&amp;gt;Remove hacks for old bad qsort() implementations?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider being smarter about memory and external files used during sorts&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg01101.php &amp;lt;nowiki&amp;gt;Sorting Improvements for 8.4&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00045.php &amp;lt;nowiki&amp;gt;Re: Sorting Improvements for 8.4&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider detoasting keys before sorting}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow sorts to use more available memory&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2007-11/msg01026.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-09/msg01123.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-02/msg01957.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Fsync ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Determine optimal fdatasync/fsync, O_SYNC/O_DSYNC options and whether fsync does anything&lt;br /&gt;
|Ideally this requires a separate test program like /contrib/pg_test_fsync that can be run at initdb time or optionally later.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider sorting writes during checkpoint&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-06/msg00541.php &amp;lt;nowiki&amp;gt;Sorted writes in checkpoint&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-07/msg00050.php &amp;lt;nowiki&amp;gt;Re: Sorting writes during checkpoint&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-10/msg02012.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-02/msg00278.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-01/msg00493.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Cache Usage ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide a way to calculate an &amp;amp;quot;estimated COUNT(*)&amp;amp;quot;&lt;br /&gt;
|Perhaps by using the optimizer's cardinality estimates or random sampling.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-11/msg00943.php &amp;lt;nowiki&amp;gt;Re: Improving count(*)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://wiki.postgresql.org/wiki/Slow_Counting&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider automatic caching of statements at various levels:&lt;br /&gt;
* Parsed query tree&lt;br /&gt;
* Query execute plan&lt;br /&gt;
* Query results &lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg00823.php &amp;lt;nowiki&amp;gt;Cached Query Plans (was: global prepared statements)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider increasing internal areas (NUM_CLOG_BUFFERS) when shared buffers is increased&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-10/msg01419.php &amp;lt;nowiki&amp;gt;Re: slru.c race condition (was Re: TRAP: FailedAssertion(&amp;amp;quot;!((itemid)-&amp;amp;gt;lp_flags &amp;amp;amp; 0x01)&amp;amp;quot;,)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00030.php &amp;lt;nowiki&amp;gt;clog_buffers to 64 in 8.3?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2007-08/msg00024.php &amp;lt;nowiki&amp;gt;CLOG Patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider decreasing the amount of memory used by PrivateRefCount&lt;br /&gt;
|&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-11/msg00797.php &amp;lt;nowiki&amp;gt;PrivateRefCount (for 8.3)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-01/msg00752.php &amp;lt;nowiki&amp;gt;Re: PrivateRefCount (for 8.3)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider allowing higher priority queries to have referenced buffer cache pages stay in memory longer&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00562.php &amp;lt;nowiki&amp;gt;Re: How to keep a table in memory?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve cache lookup speed for sessions accessing many relations&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-11/msg00356.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Vacuum ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Auto-fill the free space map by scanning the buffer cache or by checking pages written by the background writer&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-02/msg01125.php &amp;lt;nowiki&amp;gt;Dead Space Map&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-03/msg00011.php &amp;lt;nowiki&amp;gt;Re: Automatic free space map filling&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow concurrent inserts to use recently created pages rather than creating new ones&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-05/msg00853.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider having single-page pruning update the visibility map&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://commitfest.postgresql.org/action/patch_view?id=75&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg02344.php &amp;lt;nowiki&amp;gt;Re: visibility maps and heap_prune&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve tracking of total relation tuple counts now that vacuum doesn't always scan the whole heap&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-06/msg00531.php Partial vacuum versus pg_class.reltuples]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Bias FSM towards returning free space near the beginning of the heap file, in hopes that empty pages at the end can be truncated by VACUUM&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-09/msg01124.php &amp;lt;nowiki&amp;gt;FSM search modes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider a more compact data representation for dead tuple locations within VACUUM&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-05/msg00143.php &amp;lt;nowiki&amp;gt;Re: Have vacuum emit a warning when it runs out of maintenance_work_mem&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide more information in order to improve user-side estimates of dead space bloat in relations&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2009-05/msg01039.php &amp;lt;nowiki&amp;gt;Re: Bloated Table&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve locking behaviour of vacuum during trailing page truncation&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2011-03/msg00319.php&lt;br /&gt;
* http://archives.postgresql.org/message-id/4D8DF88E.7080205@Yahoo.com&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce the number of table scans performed by vacuum&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-05/msg01119.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-06/msg00605.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-07/msg00624.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Vacuum Gin indexes in physically order rather than logical order&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-04/msg00443.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Avoid creation of the free space map for small tables&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-11/msg01751.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-08/msg00552.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-08/msg00615.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Auto-vacuum ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Issue log message to suggest VACUUM FULL if a table is nearly empty?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent long-lived temporary tables from causing frozen-xid advancement starvation&lt;br /&gt;
|The problem is that autovacuum cannot vacuum them to set frozen xids; only the session that created them can do that. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-06/msg01645.php &amp;lt;nowiki&amp;gt;Re: AutoVacuum Behaviour Question&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent autovacuum from running if an old transaction is still running from the last vacuum&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00899.php &amp;lt;nowiki&amp;gt;Re: Autovacuum and OldestXmin&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have autoanalyze of parent tables occur when child tables are modified&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2010-06/msg00137.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2010-10/msg00271.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow visibility map all-visible bits to be set even when an auto-ANALYZE is running&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-01/msg00356.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow parallel cores to be used by vacuumdb&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4F10A728.7090403@agliodbs.com vacuumdb -j]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve autovacuum tuning&lt;br /&gt;
* http://www.postgresql.org/message-id/5078AD6B.8060802@agliodbs.com&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Locking ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix priority ordering of read and write light-weight locks&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-11/msg00893.php &amp;lt;nowiki&amp;gt;lwlocks and starvation&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-11/msg00905.php &amp;lt;nowiki&amp;gt;Re: lwlocks and starvation&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix problem when multiple subtransactions of the same outer transaction hold different types of locks, and one subtransaction aborts&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-11/msg01011.php &amp;lt;nowiki&amp;gt;FOR SHARE vs FOR UPDATE locks&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00001.php &amp;lt;nowiki&amp;gt;Re: FOR SHARE vs FOR UPDATE locks&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-02/msg00435.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] [pgsql-patches] Phantom Command IDs, updated patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-05/msg00773.php &amp;lt;nowiki&amp;gt;Re: savepoints and upgrading locks&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow UPDATEs on only non-referential integrity columns not to conflict with referential integrity locks&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-02/msg00073.php &amp;lt;nowiki&amp;gt;Referential Integrity and SHARE locks&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add idle_in_transaction_timeout GUC so locks are not held for long periods of time}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve deadlock detection when a page cleaning lock conflicts with a shared buffer that is pinned&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2008-01/msg00138.php &amp;lt;nowiki&amp;gt;BUG #3883: Autovacuum deadlock with truncate?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00873.php &amp;lt;nowiki&amp;gt;Thoughts about bug #3883&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-committers/2008-01/msg00365.php &amp;lt;nowiki&amp;gt;Re: pgsql: Add checks to TRUNCATE, CLUSTER, and REINDEX to prevent&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Detect deadlocks involving LockBufferForCleanup()&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00873.php &amp;lt;nowiki&amp;gt;Thoughts about bug #3883&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow finer control over who is cancelled in a deadlock&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-03/msg01727.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider a lock timeout parameter&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-05/msg00485.php &amp;lt;nowiki&amp;gt;SELECT ... FOR UPDATE [WAIT integer | NOWAIT] for 8.5&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Startup Time Improvements ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Experiment with multi-threaded backend for backend creation&lt;br /&gt;
|This would prevent the overhead associated with process creation. Most operating systems have trivial process creation time compared to database startup overhead, but a few operating systems (Win32, Solaris) might benefit from threading.  Also explore the idea of a single session using multiple threads to execute a statement faster.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow backends to change their database without restart&lt;br /&gt;
|This allows for faster server startup.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-11/msg00843.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-12/msg00336.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Write-Ahead Log ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Eliminate need to write full pages to WAL before page modification&lt;br /&gt;
|Currently, to protect against partial disk page writes, we write full page images to WAL before they are modified so we can correct any partial page writes during recovery.  These pages can also be eliminated from point-in-time archive files. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2002-06/msg00655.php &amp;lt;nowiki&amp;gt;Re: Index Scans become Seq Scans after VACUUM ANALYSE&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-05/msg01191.php&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20120105061916.GB21048@fetter.org WIP double writes]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4EFC449F02000025000441CD@gw.wicourts.gov double writes]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20120110214344.GB21106@fetter.org Double-write with Fast Checksums]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/1962493974.656458.1327703514780.JavaMail.root@zimbra-prod-mbox-4.vmware.com double writes using &amp;quot;double-write buffer&amp;quot; approach]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-10/msg01463.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|When full page writes are off, write CRC to WAL and check file system blocks on recovery&lt;br /&gt;
|If CRC check fails during recovery, remember the page in case a later CRC for that page properly matches.  The difficulty is that hint bits are not WAL logged, meaning a valid page might not match the earlier CRC.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Write full pages during file system write and not when the page is modified in the buffer cache&lt;br /&gt;
|This allows most full page writes to happen in the background writer.  It might cause problems for applying WAL on recovery into a partially-written page, but later the full page will be replaced from WAL.&lt;br /&gt;
* [http://archives.postgresql.org/message-id/CAGvK12UST-tPhyLrSLuSpwFxZbAO79yYrhV2xaLmS2MkUxNUVQ@mail.gmail.com Page Checksums + Double Writes]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce WAL traffic so only modified values are written rather than entire rows&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg01589.php &amp;lt;nowiki&amp;gt;Reduction in WAL for UPDATEs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow WAL information to recover corrupted pg_controldata&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-06/msg00025.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] pg_resetxlog -r flag&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Find a way to reduce rotational delay when repeatedly writing last WAL page&lt;br /&gt;
|Currently fsync of WAL requires the disk platter to perform a full rotation to fsync again. One idea is to write the WAL to different offsets that might reduce the rotational delay. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2002-11/msg00483.php &amp;lt;nowiki&amp;gt;500 tpsQL + WAL log implementation&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Speed WAL recovery by allowing more than one page to be prefetched&lt;br /&gt;
|This should be done utilizing the same infrastructure used for prefetching in general to avoid introducing complex error-prone code in WAL replay. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-12/msg00683.php &amp;lt;nowiki&amp;gt;Slow PITR restore&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00497.php &amp;lt;nowiki&amp;gt;Re: [GENERAL] Slow PITR restore&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg01279.php &amp;lt;nowiki&amp;gt;Read-ahead and parallelism in redo recovery&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve WAL concurrency by increasing lock granularity&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00556.php &amp;lt;nowiki&amp;gt;Reworking WAL locking&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Be more aggressive about creating WAL files&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg01325.php &amp;lt;nowiki&amp;gt;Re: PANIC caused by open_sync on Linux&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-07/msg01075.php &amp;lt;nowiki&amp;gt;PreallocXlogFiles&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-04/msg00556.php &amp;lt;nowiki&amp;gt;WAL/PITR additional items&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have resource managers report the duration of their status changes&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg01468.php &amp;lt;nowiki&amp;gt;Recovery of Multi-stage WAL actions&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Move pgfoundry's xlogdump to /contrib and have it rely more closely on the WAL backend code&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00035.php &amp;lt;nowiki&amp;gt;xlogdump&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Close deleted WAL files held open in *nix by long-lived read-only backends&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-11/msg01754.php &amp;lt;nowiki&amp;gt;Deleted WAL files held open by backends in Linux&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-12/msg00060.php &amp;lt;nowiki&amp;gt;Re: Deleted WAL files held open by backends in Linux&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Optimizer / Executor ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve selectivity functions for geometric operators}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider increasing the default values of from_collapse_limit, join_collapse_limit, and/or geqo_threshold&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4136ffa0905210551u22eeb31bn5655dbe7c9a3aed5@mail.gmail.com from_collapse_limit vs. geqo_threshold]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve ability to display optimizer analysis using OPTIMIZER_DEBUG&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-08/msg00597.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Log statements where the optimizer row estimates were dramatically different from the number of rows actually found?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider compressed annealing to search for query plans&lt;br /&gt;
|This might replace GEQO.&lt;br /&gt;
* http://archives.postgresql.org/message-id/15658.1241278636%40sss.pgh.pa.us&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve use of expression indexes for ORDER BY &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-08/msg01553.php &amp;lt;nowiki&amp;gt;Resjunk sort columns, Heikki's index-only quals patch, and bug #5000&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Modify the planner to better estimate caching effects&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2010-11/msg00117.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow shared buffer cache contents to affect index cost computations&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-06/msg01140.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow the CTE (Common Table Expression) optimization fence to be optionally disabled&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-09/msg00700.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2012-11/msg00161.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Hashing ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider using a hash for joining to a large IN (VALUES ...) list&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-05/msg00450.php &amp;lt;nowiki&amp;gt;Planning large IN lists&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow single batch hash joins to preserve outer pathkeys&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-09/msg00806.php Re: Potential Join Performance Issue]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-04/msg00153.php a few crazy ideas about hash joins]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|&amp;quot;lazy&amp;quot; hash tables - look up only the tuples that are actually requested&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-04/msg00153.php a few crazy ideas about hash joins]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Avoid building the same hash table more than once during the same query&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-04/msg00153.php a few crazy ideas about hash joins]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Avoid hashing for distinct and then re-hashing for hash join&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4136ffa0902191346g62081081v8607f0b92c206f0a@mail.gmail.com Re: Fixing Grittner's planner issues]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-04/msg00153.php a few crazy ideas about hash joins]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Background Writer ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider having the background writer update the transaction status hint bits before writing out the page&lt;br /&gt;
|Implementing this requires the background writer to have access to system catalogs and the transaction status log.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider adding buffers the background writer finds reusable to the free list &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-04/msg00781.php &amp;lt;nowiki&amp;gt;Background LRU Writer/free list&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/CA+U5nMKtvyDcV4zTr7bq7t6cA2nBfLxCJ8tQgVBnc5ddRPO+Bg@mail.gmail.com our buffer replacement strategy is kind of lame]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Automatically tune bgwriter_delay based on activity rather then using a fixed interval&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-04/msg00781.php &amp;lt;nowiki&amp;gt;Background LRU Writer/free list&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/CA+U5nMKtvyDcV4zTr7bq7t6cA2nBfLxCJ8tQgVBnc5ddRPO+Bg@mail.gmail.com our buffer replacement strategy is kind of lame]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider whether increasing BM_MAX_USAGE_COUNT improves performance&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-06/msg01007.php &amp;lt;nowiki&amp;gt;Bgwriter LRU cleaning: we've been going at this all wrong&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Test to see if calling PreallocXlogFiles() from the background writer will help with WAL segment creation latency&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-06/msg00340.php &amp;lt;nowiki&amp;gt;Re: Load Distributed Checkpoints, final patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Concurrent Use of Resources ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Do async I/O for faster random read-ahead of data&lt;br /&gt;
|Async I/O allows multiple I/O requests to be sent to the disk with results coming back asynchronously.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-10/msg00820.php &amp;lt;nowiki&amp;gt;Asynchronous I/O Support&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2007-09/msg00255.php &amp;lt;nowiki&amp;gt;Re: random_page_costs - are defaults of 4.0 realistic for SCSI RAID 1&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00027.php &amp;lt;nowiki&amp;gt;There's random access and then there's random access&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-01/msg00170.php &amp;lt;nowiki&amp;gt;Bitmap index scan preread using posix_fadvise (Was: There's random access and then there's random access)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
The above patch is already applied as of 8.4, but it still remains to figure out how to handle plain indexscans effectively.&lt;br /&gt;
* [http://archives.postgresql.org//pgsql-hackers/2009-01/msg00806.php Problems with the patch submitted for posix_fadvise in index scans]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Experiment with multi-threaded backend for better I/O utilization&lt;br /&gt;
|This would allow a single query to make use of multiple I/O channels simultaneously.  One idea is to create a background reader that can pre-fetch sequential and index scan pages needed by other backends. This could be expanded to allow concurrent reads from multiple devices in a partitioned table.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2011-02/msg00123.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-10/msg01139.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Experiment with multi-threaded backend for better CPU utilization&lt;br /&gt;
|This would allow several CPUs to be used for a single query, such as for sorting or query execution.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-10/msg00945.php &amp;lt;nowiki&amp;gt;Multi CPU Queries - Feedback and/or suggestions wanted!&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|SMP scalability improvements&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00439.php &amp;lt;nowiki&amp;gt;Straightforward changes for increased SMP scalability&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-09/msg00206.php &amp;lt;nowiki&amp;gt;Re: Reducing Transaction Start/End Contention&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00361.php &amp;lt;nowiki&amp;gt;Re: Reducing Transaction Start/End Contention&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== TOAST ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow user configuration of TOAST thresholds&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-02/msg00213.php &amp;lt;nowiki&amp;gt;Re: Proposed adjustments in MaxTupleSize and toastthresholds&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00082.php &amp;lt;nowiki&amp;gt;pg_lzcompress strategy parameters&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce unnecessary cases of deTOASTing&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-09/msg00895.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] Eliminate more detoast copies for packed varlenas&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce costs of repeat de-TOASTing of values&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg01096.php &amp;lt;nowiki&amp;gt;WIP patch: reducing overhead for repeat de-TOASTing&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Monitoring ==&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Expand pg_stat_activity for easier integration with monitoring tools&lt;br /&gt;
|* http://archives.postgresql.org/message-id/4DFA13A5.2060200@2ndQuadrant.com&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add column to pg_stat_activity that shows the progress of long-running commands like CREATE INDEX and VACUUM&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-04/msg00203.php &amp;lt;nowiki&amp;gt;EXPLAIN progress info&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* The CLUSTER/VACUUM FULL implementation would also be useful to track this way&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have pg_stat_activity display query strings in the correct client encoding&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-01/msg00131.php &amp;lt;nowiki&amp;gt;pg_stats queries versus per-database encodings&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Expose pg_controldata via an SQL interface&lt;br /&gt;
|Helpful for monitoring replicated databases&lt;br /&gt;
* http://archives.postgresql.org/message-id/4B901D73.8030003@agliodbs.com&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4B959D7A.6010907@joeconway.com initial patch]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Add entry creation timestamp column to pg_stat_replication&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-08/msg00694.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Allow reporting of stalls due to wal_buffer wrap-around&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-02/msg00826.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Restructure pg_stat_database columns tup_returned and tup_fetched to return meaningful values&lt;br /&gt;
* http://www.postgresql.org/message-id/20121012060345.GA29214@toroid.org&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Performance ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Use mmap() rather than SYSV for shared buffers?&lt;br /&gt;
|This would remove the requirement for SYSV SHM but would introduce portability issues. Anonymous mmap (or mmap to /dev/zero) is required to prevent I/O overhead. We could also consider mmap() for writing WAL.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-11/msg00750.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-04/msg00756.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Rather than consider mmap()-ing in 8k pages, consider mmap()'ing entire files into a backend?&lt;br /&gt;
|Doing I/O to large tables would consume a lot of address space or require frequent mapping/unmapping.  Extending the file also causes mapping problems that might require mapping only individual pages, leading to thousands of mappings.  Another problem is that there is no way to _prevent_ I/O to disk from the dirty shared buffers so changes could hit disk before WAL is written.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-03/msg01239.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider ways of storing rows more compactly on disk:&lt;br /&gt;
* Reduce the row header size?&lt;br /&gt;
* Consider reducing on-disk varlena length from four bytes to two because a heap row cannot be more than 64k in length}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider transaction start/end performance improvements&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00948.php &amp;lt;nowiki&amp;gt;Reducing Transaction Start/End Contention&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00361.php &amp;lt;nowiki&amp;gt;Re: Reducing Transaction Start/End Contention&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow configuration of backend priorities via the operating system&lt;br /&gt;
|Though backend priorities make priority inversion during lock waits possible, research shows that this is not a huge problem.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-02/msg00493.php &amp;lt;nowiki&amp;gt;Priorities for users or queries?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider increasing the minimum allowed number of shared buffers&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2008-02/msg00157.php &amp;lt;nowiki&amp;gt;Re: [PATCH] Don't bail with legitimate -N/-B options&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider if CommandCounterIncrement() can avoid its AcceptInvalidationMessages() call&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-committers/2007-11/msg00585.php &amp;lt;nowiki&amp;gt;pgsql: Avoid incrementing the CommandCounter when&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider Cartesian joins when both relations are needed to form an indexscan qualification for a third relation&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2007-12/msg00090.php &amp;lt;nowiki&amp;gt;Re: TB-sized databases&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider not storing a NULL bitmap on disk if all the NULLs are trailing&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00624.php &amp;lt;nowiki&amp;gt;Proposal for Null Bitmap Optimization(for Trailing NULLs)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-12/msg00109.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] Proposal for Null Bitmap Optimization(for TrailingNULLs)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Sort large UPDATE/DELETEs so it is done in heap order&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg01119.php &amp;lt;nowiki&amp;gt;Possible future performance improvement: sort updates/deletes by ctid&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider decreasing the I/O caused by updating tuple hint bits&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00847.php &amp;lt;nowiki&amp;gt;Hint Bits and Write I/O&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-07/msg00199.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] Hint Bits and Write I/O&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-10/msg00695.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-11/msg00792.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-01/msg01063.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-03/msg01408.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-03/msg01453.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Avoid the requirement of freezing pages that are infrequently modified &lt;br /&gt;
|If all rows on a page are visible, it is possible to set a bit in the visibility map (once the visibility map is 100% reliable) and not need to freeze the page, avoiding a page rewrite&lt;br /&gt;
*  http://archives.postgresql.org/message-id/4BF701CF.2090205@agliodbs.com&lt;br /&gt;
*  http://archives.postgresql.org/pgsql-hackers/2010-06/msg00082.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Avoid reading in b-tree pages when replaying vacuum records in hot standby mode&lt;br /&gt;
* [http://archives.postgresql.org/message-id/1272571938.4161.14739.camel@ebony &amp;lt;nowiki&amp;gt;Hot Standby tuning for btree_xlog_vacuum()&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Restructure truncation logic to be more resistant to failure&lt;br /&gt;
|This also involves not writing dirty buffers for a truncated or dropped relation&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-08/msg01032.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider adding logic to increase large tables by more than 8k&lt;br /&gt;
|This would reduce file system fragmentation&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2011-03/msg00337.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Other ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Deal with encoding issues for filenames in the server filesystem&lt;br /&gt;
* {{MessageLink|20090413184335.39BE.52131E4D@oss.ntt.co.jp|a proposed patch here}}&lt;br /&gt;
* {{MessageLink|8484.1244655656@sss.pgh.pa.us|some issues about it here}}&lt;br /&gt;
* {{MessageLink|20100107103740.97A5.52131E4D@oss.ntt.co.jp|Windows-specific patch here}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Deal with encoding issues in the output of localeconv()&lt;br /&gt;
* [http://archives.postgresql.org/message-id/40c6d9160904210658y590377cfw6dbbecb53d2b8be0@mail.gmail.com bug report]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/49EF8DA0.90008@tpf.co.jp draft patch]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/21710.1243620986@sss.pgh.pa.us review of patch]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide schema name and other fields available from SQL GET DIAGNOSTICS in error reports&lt;br /&gt;
* [http://archives.postgresql.org/message-id/dcc563d10810211907n3c59a920ia9eb7cd2a6d5ea58@mail.gmail.com &amp;lt;nowiki&amp;gt;How to get schema name which violates fk constraint&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-11/msg00846.php &amp;lt;nowiki&amp;gt;patch - Report the schema along table name in a referential failure 	error message&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* {{MessageLink|3191.1263306359@sss.pgh.pa.us|Re: NOT NULL violation and error-message}}&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-08/msg00213.php &amp;lt;nowiki&amp;gt;the case for machine-readable error fields&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
| Provide [http://developer.postgresql.org/pgdocs/postgres/libpq-connect.html#LIBPQ-CONNECT-FALLBACK-APPLICATION-NAME fallback_application_name] in contrib/pgbench, oid2name, and dblink.&lt;br /&gt;
* {{MessageLink|w2g9837222c1004070216u3bc46b3ahbddfdffdbfb46212@mail.gmail.com|fallback_application_name and pgbench}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add 64-bit support to /contrib/pgbench&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-07/msg00153.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-02/msg00705.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Remove warnings created by -Wcast-align}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Move platform-specific ps status display info from ps_status.c to ports}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add optional CRC checksum to heap and index pages&lt;br /&gt;
|One difficulty is how to prevent hint bit changes from affecting the computed CRC checksum.&lt;br /&gt;
* http://archives.postgresql.org/message-id/19934.1226601952%40sss.pgh.pa.us&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-10/msg00002.php &amp;lt;nowiki&amp;gt;Re: Block-level CRC checks&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-10/msg01028.php &amp;lt;nowiki&amp;gt;double-buffering page writes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-11/msg00524.php &amp;lt;nowiki&amp;gt;Re: Block-level CRC checks&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-12/msg01101.php &amp;lt;nowiki&amp;gt;Re: Block-level CRC checks&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-12/msg00011.php &amp;lt;nowiki&amp;gt;Re: Block-level CRC checks&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-11/msg00249.php&lt;br /&gt;
* http://archives.postgresql.org/message-id/20111221215913.GA4536@fetter.org&lt;br /&gt;
* http://archives.postgresql.org/message-id/CA+U5nMJzQyxcObkpNAf1SYTX-gO_Mom3O9JXHnGpxRo1kXJ7ww@mail.gmail.com&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-01/msg00128.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-01/msg00113.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-02/msg00172.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-03/msg00001.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-03/msg00188.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider a faster CRC32 algorithm&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-05/msg01112.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow cross-compiling by generating the zic database on the target system}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve NLS maintenance of libpgport messages linked onto applications}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Use UTF8 encoding for NLS messages so all server encodings can read them properly}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow creation of universal binaries for Darwin&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-07/msg00884.php &amp;lt;nowiki&amp;gt;Getting to universal binaries for Darwin&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider GnuTLS if OpenSSL license becomes a problem&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-02/msg00892.php&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-05/msg00040.php &amp;lt;nowiki&amp;gt;[PATCH] Add support for GnuTLS&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg01213.php &amp;lt;nowiki&amp;gt;TODO: GNU TLS&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider making NAMEDATALEN more configurable in future releases}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Research use of signals and sleep wake ups&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00003.php &amp;lt;nowiki&amp;gt;Restartable signals 'n all that&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow C++ code to more easily access backend code&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-12/msg00302.php &amp;lt;nowiki&amp;gt;Mostly Harmless: Welcoming our C++ friends&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider simplifying how memory context resets handle child contexts&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-08/msg00067.php &amp;lt;nowiki&amp;gt;Re: Memory leak in nodeAgg&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Create three versions of libpgport to simplify client code&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg00154.php &amp;lt;nowiki&amp;gt;8.4 TODO item: make src/port support libpq and ecpg directly&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve detection of shared memory segments being used by others by checking the SysV shared memory field 'nattch'&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00656.php &amp;lt;nowiki&amp;gt;postgresql in FreeBSD jails: proposal&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00673.php &amp;lt;nowiki&amp;gt;Re: postgresql in FreeBSD jails: proposal&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement the non-threaded Avahi service discovery protocol&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00939.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] Avahi support for Postgresql&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-02/msg00097.php &amp;lt;nowiki&amp;gt;Re: Avahi support for Postgresql&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg01211.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] Avahi support for Postgresql&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-04/msg00001.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] Avahi support for Postgresql&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce data row alignment requirements on some 64-bit systems&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-10/msg00369.php &amp;lt;nowiki&amp;gt;[WIP] Reduce alignment requirements on 64-bit systems.&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Restructure TOAST internal storage format for greater flexibility&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-11/msg00049.php &amp;lt;nowiki&amp;gt;Re: PG_PAGE_LAYOUT_VERSION 5 - time for change&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Add regression tests for pg_dump/restore&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg01967.php &amp;lt;nowiki&amp;gt;&amp;quot;make install-check-pg_dump&amp;quot; target in src/regress]&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Research different memory allocation methods for lists&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-04/msg01467.php &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Consider removing the attribute options cache&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-03/msg00039.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Restructure /contrib section&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2011-06/msg00705.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Consider adding explicit huge page support&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-07/msg00123.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== /contrib/pg_upgrade ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Handle large object comments&lt;br /&gt;
|This is difficult to do because the large object doesn't exist when --schema-only is loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider using pg_depend for checking object usage in version.c&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|If reindex is necessary, allow it to be done in parallel with pg_dump custom format&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Migrate pg_statistic by dumping it out as a flat file, so analyze is not necessary&lt;br /&gt;
|pg_class.oid is not preserved so schema.tablename must be used.&lt;br /&gt;
* [http://archives.postgresql.org/message-id/CAAZKuFaWdLkK8eozSAooZBets9y_mfo2HS6urPAKXEPbd-JLCA@mail.gmail.com pg_upgrade and statistics]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve testing, perhaps using the buildfarm&lt;br /&gt;
|The buildfarm has access to multiple versions of PostgreSQL.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Create machine-readable output of pg_controldata&lt;br /&gt;
|This would avoid parsing its output.  The problem is we need pg_controldata output from both the old and new clusters so we would need to support both formats.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Find cleaner way to start/stop dedicated servers for upgrades&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-08/msg00275.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider a way to run pg_upgrade on standby servers&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-07/msg00453.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-09/msg00056.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Remove configure.in check for link failure when cause is found}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Remove readdir() errno patch when runtime/mingwex/dirent.c rev 1.4 is released}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow psql to use readline once non-US code pages work with backslashes}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix problem with shared memory on the Win32 Terminal Server}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve signal handling&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-06/msg00027.php &amp;lt;nowiki&amp;gt;Simplify Win32 Signaling code&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Convert MSVC build system to remove most batch files&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00961.php &amp;lt;nowiki&amp;gt;MSVC build system&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support pgxs when using MSVC}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix MSVC NLS support, like for to_char()&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00485.php &amp;lt;nowiki&amp;gt;NLS on MSVC  strikes back!&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-02/msg00038.php &amp;lt;nowiki&amp;gt;Fix for 8.3 MSVC locale (Was  [HACKERS] NLS on MSVC strikes back!)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Find a correct rint() substitute on Windows&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00808.php &amp;lt;nowiki&amp;gt;Minor bug in src/port/rint.c&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix global namespace issues when using multiple terminal server sessions&lt;br /&gt;
* [http://archives.postgresql.org/message-id/48F3BFCC.8030107@dunslane.net problems with Windows global namespace]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change from the current autoconf/gmake build system to cmake&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-12/msg01869.php &amp;lt;nowiki&amp;gt;About CMake (was Re: [COMMITTERS] pgsql: Append major version number and for libraries soname major)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve consistency of path separator usage&lt;br /&gt;
* http://archives.postgresql.org/message-id/49C0BDC5.4010002@hagander.net&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix cross-compiling on Windows&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2010-10/msg00110.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce file statistics overhead on directory reads&lt;br /&gt;
* http://www.postgresql.org/message-id/1338325561.82125.YahooMailNeo@web39304.mail.mud.yahoo.com&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Wire Protocol Changes ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow dynamic character set handling}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add decoded type, length, precision}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Mark result columns as known-not-null when possible&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-11/msg01029.php &amp;lt;nowiki&amp;gt;Adding nullable indicator to Describe&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide more control over planner treatment of statements being prepared}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Use compression&lt;br /&gt;
|If SSL is used, hopefully avoid the overhead of key negotiation and encryption&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2012-06/msg00793.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Update clients to use data types, typmod, schema.table.column names of result sets using new statement protocol}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Set protocol for wire format negotiation&lt;br /&gt;
* [http://archives.postgresql.org/message-id/CACMqXCKkGrGXxQhjHCKCe0B8hn6sTt-1sdgHZOSGQMxrusOsQA@mail.gmail.com GUC_REPORT for protocol tunables]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make sure upgrading to a 4.1 protocol version will actually work smoothly&lt;br /&gt;
* [http://archives.postgresql.org/message-id/28307.1318255008@sss.pgh.pa.us Re: libpq, PQdescribePrepared -&amp;gt; PQftype, PQfmod, no PQnullable]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy &lt;br /&gt;
| Add contrib functions to the index&lt;br /&gt;
* Add the functions and GUCs in the contrib modules to [http://www.postgresql.org/docs/current/static/sql-createindex.html the documentation index]: [http://archives.postgresql.org/message-id/50A2E173.6030404@2ndQuadrant.com per list discussion]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Convert single quotes to apostrophes in the PDF documentation&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-docs/2007-12/msg00059.php &amp;lt;nowiki&amp;gt;SGML docs and pdf single-quotes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide a manpage for postgresql.conf&lt;br /&gt;
* {{messageLink|20080819194311.GH4428@alvh.no-ip.org|A smaller default postgresql.conf}}&lt;br /&gt;
* {{messageLink|200808211910.37524.peter_e@gmx.net|A smaller default postgresql.conf}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change the manpage-generating toolchain to use the new XML-based docbook2x tools&lt;br /&gt;
* {{messageLink|200808211910.37524.peter_e@gmx.net|A smaller default postgresql.conf}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider changing documentation format from SGML to XML&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-docs/2006-12/msg00152.php &amp;lt;nowiki&amp;gt;Re: Authoring Tools WAS: Switching to XML&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-docs/2011-04/msg00020.php&lt;br /&gt;
* http://wiki.postgresql.org/wiki/Switching_PostgreSQL_documentation_from_SGML_to_XML&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Document support for N&amp;lt;nowiki&amp;gt;' '&amp;lt;/nowiki&amp;gt; national character string literals, if it matches the SQL standard&lt;br /&gt;
* http://archives.postgresql.org/message-id/1275895438.1849.1.camel@fsopti579.F-Secure.com&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add diagrams to the documentation&lt;br /&gt;
* http://archives.postgresql.org/pgsql-docs/2010-07/msg00001.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Exotic Features ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add pre-parsing phase that converts non-ISO syntax to supported syntax&lt;br /&gt;
|This could allow SQL written for other databases to run without modification.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow plug-in modules to emulate features from other databases}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add features of Oracle-style packages&lt;br /&gt;
|A package would be a schema with session-local variables, public/private functions, and initialization functions.  It is also possible to implement these capabilities in any schema and not use a separate &amp;amp;quot;packages&amp;amp;quot; syntax at all.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-08/msg00384.php &amp;lt;nowiki&amp;gt;proposal for PL packages for 8.3.&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider allowing control of upper/lower case folding of unquoted identifiers&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-04/msg00818.php &amp;lt;nowiki&amp;gt;Bringing PostgreSQL torwards the standard regarding case folding&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-10/msg01527.php &amp;lt;nowiki&amp;gt;Re: [SQL] Case Preservation disregarding case sensitivity?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00849.php &amp;lt;nowiki&amp;gt;TODO Item: Consider allowing control of upper/lower case folding of unquoted,  identifiers&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-07/msg00415.php &amp;lt;nowiki&amp;gt;Identifier case folding notes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-07/msg00415.php &amp;lt;nowiki&amp;gt;Identifier case folding notes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add autonomous transactions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00893.php &amp;lt;nowiki&amp;gt;autonomous transactions&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Give query progress indication&lt;br /&gt;
* [[Query progress indication]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Rethink our type system&lt;br /&gt;
* [[Rethinking datatypes]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features We Do ''Not'' Want ==&lt;br /&gt;
&lt;br /&gt;
The following features have been discussed ad nauseum on the PostgreSQL mailing lists and the consensus has been that the project is not interested in them.  As such, if you are going to bring them up as potential features, you will want to be familiar with all of the arguments against these features which have been previously made over the years.  If you decide to work on such features anyway, you should be aware that you face a higher-than-normal barrier to get the Project to accept them.&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|All backends running as threads in a single process (not wanted)&lt;br /&gt;
|This eliminates the process protection we get from the current setup. Thread creation is usually the same overhead as process creation on modern systems, so it seems unwise to use a pure threaded model, and MySQL and DB2 have demonstrated that threads introduce as many issues as they solve.  Threading specific operations such as I/O, seq scans, and connection management has been discussed and will probably be implemented to enable specific performance features.  Moving to a threaded engine would also require halting all other work on PostgreSQL for one to two years.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|&amp;quot;Oracle-style&amp;quot; optimizer hints (not wanted)&lt;br /&gt;
|Optimizer hints, as implemented in Oracle and other RDBMSes, are used to work around problems in the optimizer and introduce upgrade and maintenance issues.  We would rather have such problems reported and fixed.  We have discussed a more sophisticated system of per-class cost adjustment instead, but a specification remains to be developed. See [[OptimizerHintsDiscussion|Optimizer Hints Discussion]] for further information.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Embedded server (not wanted)&lt;br /&gt;
|While PostgreSQL clients runs fine in limited-resource environments, the server requires multiple processes and a stable pool of resources to run reliably and efficiently. Stripping down the PostgreSQL server to run in the same process address space as the client application would add too much complexity and failure cases. Besides, there are several very mature embedded SQL databases already available.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Obfuscated function source code (not wanted)&lt;br /&gt;
|Obfuscating function source code has minimal protective benefits because anyone with super-user access can find a way to view the code. At the same time, it would greatly complicate backups and other administrative tasks. To prevent non-super-users from viewing function source code, remove SELECT permission on pg_proc.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2008-09/msg00668.php &amp;lt;nowiki&amp;gt;Obfuscated stored procedures (was Re: Oracle and Postgresql)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Indeterminate behavior for the GROUP BY clause (not wanted)&lt;br /&gt;
|At least one other database product allows specification of a subset of the result columns which GROUP BY would need to be able to provide predictable results; the server is free to return any value from the group.  This is not viewed as a desirable feature.  PostgreSQL 9.1 allows result columns that are not referenced by GROUP BY if a primary key for the same table is referenced in GROUP BY.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-03/msg00297.php &amp;lt;nowiki&amp;gt;Re: SQL compatibility reminder: MySQL vs PostgreSQL&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Todo]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PGDay_FOSDEM_2013</id>
		<title>PGDay FOSDEM 2013</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGDay_FOSDEM_2013"/>
				<updated>2013-01-07T19:21:47Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;/* Dinner */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= PGDay FOSDEM 2013 =&lt;br /&gt;
&lt;br /&gt;
This is the first PgDay we hold in Belgium. FOSDEM PGDay 2013 will be held on Feb 1st in Brussels, Belgium, at the Radisson Blu Royal hotel. As an extension to the regular PostgreSQL devroom at FOSDEM, it will cover topics for PostgreSQL users, developers and contributors, and anybody else interested in PostgreSQL&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
* '''Date:''' Feb 01st, 2013 9am-5pm&lt;br /&gt;
* '''Venue:''': Radisson Blu Royal Hotel&lt;br /&gt;
* '''Coordinator:''': PostgreSQL Europe [mailto:contact@pgconf.eu contact@pgconf.eu]&lt;br /&gt;
* '''Website:''': http://fosdem2013.pgconf.eu/&lt;br /&gt;
&lt;br /&gt;
== Registration ==&lt;br /&gt;
&lt;br /&gt;
Free attendance, web registration required: http://fosdem2013.pgconf.eu/registration/ (limited seats)&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
Schedule is be published at:  http://fosdem2013.pgconf.eu/schedule/&lt;br /&gt;
&lt;br /&gt;
== Location and Venue ==&lt;br /&gt;
&lt;br /&gt;
http://fosdem2013.pgconf.eu/venue/&lt;br /&gt;
&lt;br /&gt;
Address: &lt;br /&gt;
&lt;br /&gt;
http://www.radissonblu.com/royalhotel-brussels/location&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dinner ==&lt;br /&gt;
&lt;br /&gt;
We are organizing a dinner after the event on Friday 1st, 2013 at Hard Rock Cafe Brussels. We have limited (30) number of seats, so please add your name to this list before going there.&lt;br /&gt;
&lt;br /&gt;
If you are bringing someone to the event, make sure you enter your name *twice* (or more) on the list, so the attendee count matches!&lt;br /&gt;
&lt;br /&gt;
Attendees:&lt;br /&gt;
&lt;br /&gt;
# Devrim Gündüz&lt;br /&gt;
# Devrim Gündüz +1&lt;br /&gt;
# Magnus Hagander&lt;br /&gt;
# Andreas Scherbaum&lt;br /&gt;
# Andreas Scherbaum +1&lt;br /&gt;
# Jean-Paul Argudo&lt;br /&gt;
# Patryk Kordylewski&lt;br /&gt;
# Patryk Kordylewski +1&lt;br /&gt;
# Dimitri Fontaine&lt;br /&gt;
# Julien Rouhaud&lt;br /&gt;
# Dave Page&lt;br /&gt;
# Marc Cousin&lt;br /&gt;
# Stéphane Schildknecht&lt;br /&gt;
# Stéphane Schildknecht +1&lt;br /&gt;
# Jehan-Guillaume de Rorthais&lt;br /&gt;
# Guillaume Lelarge&lt;br /&gt;
# Markus Winand&lt;br /&gt;
# Marc Balmer&lt;br /&gt;
# Marc Balmer +1&lt;br /&gt;
# Stefan Kaltenbrunner&lt;br /&gt;
&lt;br /&gt;
[[Category:PostgreSQL Events]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Infrastructure_team</id>
		<title>Infrastructure team</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Infrastructure_team"/>
				<updated>2013-01-02T18:01:05Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;add sfrost&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Infrastructure Team ==&lt;br /&gt;
&lt;br /&gt;
The Infrastructure team is responsible for running all of the postgresql.org infrastructure. This includes a wide variety of public and non-public services.  PostgreSQL website development is discussed on the [http://archives.postgresql.org/pgsql-www/ pgsql-www mailing list]. Source code for the postgresql.org web site is stored in a public GIT repository, and is available on [http://git.postgresql.org/gitweb/?p=pgweb.git;a=summary]&lt;br /&gt;
&lt;br /&gt;
== Infrastructure Team Members ==&lt;br /&gt;
&lt;br /&gt;
The following people are part of the sysadmin team running the postgresql.org infrastructure. Note that not all of those people do have root-level access on all servers.&lt;br /&gt;
&lt;br /&gt;
* Joshua Drake&lt;br /&gt;
* Marc Fournier&lt;br /&gt;
* Stephen Frost&lt;br /&gt;
* Magnus Hagander&lt;br /&gt;
* Álvaro Herrera&lt;br /&gt;
* Stefan Kaltenbrunner&lt;br /&gt;
* Greg Sabino Mullane&lt;br /&gt;
* Dave Page&lt;br /&gt;
* Robert Treat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Community]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Infrastructure_team</id>
		<title>Infrastructure team</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Infrastructure_team"/>
				<updated>2012-08-18T19:39:07Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;we have been on GIT for ages now&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Infrastructure Team ==&lt;br /&gt;
&lt;br /&gt;
The Infrastructure team is responsible for running all of the postgresql.org infrastructure. This includes a wide variety of public and non-public services.  PostgreSQL website development is discussed on the [http://archives.postgresql.org/pgsql-www/ pgsql-www mailing list]. Source code for the postgresql.org web site is stored in a public GIT repository, and is available on [http://git.postgresql.org/gitweb/?p=pgweb.git;a=summary]&lt;br /&gt;
&lt;br /&gt;
== Infrastructure Team Members ==&lt;br /&gt;
&lt;br /&gt;
The following people are part of the sysadmin team running the postgresql.org infrastructure. Note that not all of those people do have root-level access on all servers.&lt;br /&gt;
&lt;br /&gt;
* Joshua Drake&lt;br /&gt;
* Marc Fournier&lt;br /&gt;
* Magnus Hagander&lt;br /&gt;
* Álvaro Herrera&lt;br /&gt;
* Stefan Kaltenbrunner&lt;br /&gt;
* Greg Sabino Mullane&lt;br /&gt;
* Dave Page&lt;br /&gt;
* Robert Treat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Community]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/FAQ/de</id>
		<title>FAQ/de</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/FAQ/de"/>
				<updated>2011-12-06T18:43:11Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;correct url&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Was ist PostgreSQL? Wie wird es ausgesprochen? ===&lt;br /&gt;
  &lt;br /&gt;
Die (englische) Aussprache ist &amp;quot;Post-Gres-Q-L&amp;quot;. Im allgemeinen&lt;br /&gt;
Sprachgebrauch hat sich die Kurzform &amp;quot;Postgres&amp;quot; auch durchgesetzt.&lt;br /&gt;
(Für diejenigen, die es interessiert: eine MP3-Datei mit der&lt;br /&gt;
amerikanischen Aussprache befindet sich hier:&lt;br /&gt;
http://www.postgresql.org/files/postgresql.mp3&lt;br /&gt;
&lt;br /&gt;
PostgreSQL ist ein objektrelationales Datenbanksystem, das die Vorzüge&lt;br /&gt;
von kommerziellen Datenbanksystemen mit zukunftsweisenden Innovationen&lt;br /&gt;
kombiniert. PostgreSQL ist freie Software und dessen kompletter&lt;br /&gt;
Quellcode ist öffentlich verfügbar.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Entwicklung wird von einem Team von meist freiwilligen&lt;br /&gt;
Entwicklern durchgeführt. Dieses Team ist für die Gesamtentwicklung&lt;br /&gt;
von PostgreSQL verantwortlich. Es handelt sich um ein&lt;br /&gt;
Gemeinschaftsprojekt, das nicht von einer bestimmten Firma&lt;br /&gt;
kontrolliert wird. Lesen Sie die Entwickler-FAQ:&lt;br /&gt;
http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn Sie an einer&lt;br /&gt;
Mitarbeit interessiert sind.&lt;br /&gt;
&lt;br /&gt;
=== Wer kontrolliert PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Falls Sie nach dem Namen eines etwaigen Inhabers bzw. nach einem&lt;br /&gt;
allmächtigen Zentralkommittee suchen - sparen Sie sich die Mühe, sowas&lt;br /&gt;
existiert gar nicht. Es gibt zwar das &amp;quot;Core Committee&amp;quot; sowie&lt;br /&gt;
Entwickler, die CVS-Schreibberechtigung haben, jedoch haben diese&lt;br /&gt;
Gruppen eher nur eine administrative Rolle. Das Projekt wird durch die&lt;br /&gt;
Community gesteuert, die aus den Entwicklern sowie natürlich auch den&lt;br /&gt;
Nutzern besteht - jeder kann daran teilnehmen. (Lesen Sie die&lt;br /&gt;
Entwickler-FAQ: http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn&lt;br /&gt;
Sie an der PostgreSQL-Entwicklung teilnehmen möchten).&lt;br /&gt;
&lt;br /&gt;
=== Welchem Copyright unterliegt PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL wird unter der klassischen BSD-Lizenz herausgegeben. Im&lt;br /&gt;
Grunde genommen erlaubt diese den Nutzern, beliebig mit dem Code&lt;br /&gt;
umzugehen, auch der Weiterverkauf von Binärversionen ohne Quellcode&lt;br /&gt;
ist erlaubt. Die einzige Einschränkung besteht darin, dass PostgreSQL&lt;br /&gt;
auf keinen Fall für etwaige Probleme mit der Software haftet. Außerdem&lt;br /&gt;
muß der Copyright- Text in allen Kopien der Software enthalten sein.&lt;br /&gt;
Dies ist der Originaltext der BSD-Lizenz:&lt;br /&gt;
 &lt;br /&gt;
 PostgreSQL Data Base Management System&lt;br /&gt;
 &lt;br /&gt;
 Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group&lt;br /&gt;
 Portions Copyright (c) 1994-6 Regents of the University of California&lt;br /&gt;
 &lt;br /&gt;
 Permission to use, copy, modify, and distribute this software and its&lt;br /&gt;
 documentation for any purpose, without fee, and without a written&lt;br /&gt;
 agreement is hereby granted, provided that the above copyright notice&lt;br /&gt;
 and this paragraph and the following two paragraphs appear in all&lt;br /&gt;
 copies.&lt;br /&gt;
 &lt;br /&gt;
 IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY&lt;br /&gt;
 FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,&lt;br /&gt;
 INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND&lt;br /&gt;
 ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN&lt;br /&gt;
 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 &lt;br /&gt;
 THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,&lt;br /&gt;
 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF&lt;br /&gt;
 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE&lt;br /&gt;
 PROVIDED HEREUNDER IS ON AN &amp;quot;AS IS&amp;quot; BASIS, AND THE UNIVERSITY OF&lt;br /&gt;
 CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,&lt;br /&gt;
 UPDATES, ENHANCEMENTS, OR MODIFICATIONS.&lt;br /&gt;
&lt;br /&gt;
Es gilt die Copyright-Klausel im Original!&lt;br /&gt;
&lt;br /&gt;
=== Auf welchen Plattformen läuft PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Normalerweise kann PostgreSQL auf jeder modernen UNIX-kompatiblen&lt;br /&gt;
Plattform eingesetzt werden. Diejenigen Plattformen, die bei der&lt;br /&gt;
jeweiligen Versionsfreigabe getestet wurden, sind in den&lt;br /&gt;
Installationsanleitungen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
PostgreSQL läuft auch auf Microsoft NT-basierten Betriebssystemen wie&lt;br /&gt;
Windows 2000 SP4, XP und Server 2003. Ein vorgefertigtes&lt;br /&gt;
Installationspaket kann von http://pgfoundry.org/projects/pginstaller&lt;br /&gt;
heruntergeladen werden. DOS-basierte Windows-Versionen (Win95, Win98,&lt;br /&gt;
WinMe) können PostgreSQL nur mit Hilfe der Cygwin-Umgebung ausführen.&lt;br /&gt;
&lt;br /&gt;
=== Woher bekomme ich PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Per Web-Browser hier: http://www.postgresql.org/ftp/ und per FTP hier:&lt;br /&gt;
ftp://ftp.postgresql.org/pub/.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die neueste Version von PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die neueste Version von PostgreSQL kann auf der [http://www.postgresql.org/ Website] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Die Freigabe einer neuen Hauptversion erfolgt in der Regel jährlich, kleinere Korrekturversionen alle paar Monaten. Die kleineren Updates werden &amp;quot;Minor&amp;quot;-Updates, die großen jährlich erscheinenden &amp;quot;Major&amp;quot;-Updates genannt. &amp;quot;Minor&amp;quot;-Update erscheinen in der Regel gleichzeitig für alle unterstützten &amp;quot;Major&amp;quot;-Versionen. [http://www.postgresql.org/support/versioning Falls Sie dieses Thema interessiert sollten Sie hier weiterlesen.]&lt;br /&gt;
&lt;br /&gt;
=== Wo bekomme ich Support für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Community bietet Unterstützung per Mailing-Liste. Die&lt;br /&gt;
Web-Seite http://www.postgresql.org/community/lists/ bietet einen&lt;br /&gt;
Überblick. Die Listen general und bugs bieten einen guten Einstieg.&lt;br /&gt;
&lt;br /&gt;
Eine deutschsprachige Mailing-Liste gibt es hier:&lt;br /&gt;
http://archives.postgresql.org/pgsql-de-allgemein/.&lt;br /&gt;
&lt;br /&gt;
Der wichtigsten IRC-Channel ist #postgresql auf Freenode&lt;br /&gt;
(irc.freenode.net). Unter UNIX/Linux können Sie mit z.B. irc -c&lt;br /&gt;
'#postgresql' &amp;quot;$USER&amp;quot; irc.freenode.net. daran teilnehmen. Auf Freenode&lt;br /&gt;
gibt es folgende Channels:&lt;br /&gt;
* #postgresql-es (spanisch)&lt;br /&gt;
* #postgresqlfr (französischen)&lt;br /&gt;
* #postgresql-br (brasilianischen) &lt;br /&gt;
&lt;br /&gt;
Es gibt außerdem einen PostgreSQL-Channel bei EFNet.&lt;br /&gt;
&lt;br /&gt;
Eine Liste von Unternehmen, die Support für PostgreSQL auf kommerzieller Basis leisten, kann unter http://www.postgresql.org/support/professional_support eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich einen Fehlerbericht abgeben? ===&lt;br /&gt;
  &lt;br /&gt;
Nutzen Sie das Formular unter&lt;br /&gt;
http://www.postgresql.org/support/submitbug. Schauen Sie aber vorher&lt;br /&gt;
unter ftp://ftp.postgresql.org/pub/ nach, ob es mittlerweile eine&lt;br /&gt;
neuere PostgreSQL-Version gibt, in der der Fehler behoben wurde.&lt;br /&gt;
&lt;br /&gt;
Bugs, die über das Formular bzw. eine der Mailing-Listen&lt;br /&gt;
bekanntgegeben wurden, erhalten typischerweise einer der folgenden&lt;br /&gt;
Reaktionen:&lt;br /&gt;
&lt;br /&gt;
* es ist kein Bug, der Grund wird benannt&lt;br /&gt;
* es ist ein bereits bekannter Bug, der bereits auf der TODO-Liste aufgenommen wurde&lt;br /&gt;
* der Bug wurde in der aktuellen Version behoben&lt;br /&gt;
* der Bug wurde bereits behoben, befindet sich aber noch nicht in einer offiziell veröffentlichten Version&lt;br /&gt;
* es wird um eingehendere Informationen gebeten, z.B.:&lt;br /&gt;
** Betriebssystem&lt;br /&gt;
** PostgreSQL-Version&lt;br /&gt;
** reproduzierbares Fallbeispiel&lt;br /&gt;
** Debugging-Information&lt;br /&gt;
** Debugger-Backtrace-Ausgabe&lt;br /&gt;
* der Bug ist neu. Folgendes könnte passieren:&lt;br /&gt;
** ein Patch wird erstellt und in der nächsten Version eingebaut&lt;br /&gt;
** der Bug kann nicht sofort behoben werden und wird auf die TODO-Liste gesetzt&lt;br /&gt;
    &lt;br /&gt;
=== Wie erfahre ich von bekannten Bugs oder fehlenden Features? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt eine erweiterte Teilmenge von SQL:2003. Siehe&lt;br /&gt;
unsere TODO-Liste unter http://www.postgresql.org/docs/faqs.TODO.html&lt;br /&gt;
für eine Auflistung der bekannten Bugs, fehlenden Features und&lt;br /&gt;
zukünftigen Pläne.&lt;br /&gt;
&lt;br /&gt;
Eine Anfrage nach einem neuen Feature führt normalerweise zu einer der&lt;br /&gt;
folgenden Antworten:&lt;br /&gt;
&lt;br /&gt;
* das Feature ist bereits auf der TODO-Liste&lt;br /&gt;
* das Feature ist nicht wünschenswert, weil:&lt;br /&gt;
** es vorhandene Funktionalität dupliziert, welche bereits dem SQL-Standard folgt&lt;br /&gt;
** es würde die Komplexität der Code-Basis erhöhen, ohne nennenswerte Vorteile zu bringen&lt;br /&gt;
** es wäre unsicher bzw. unzuverlässig&lt;br /&gt;
* das neue Feature wird der TODO-Liste hinzugefügt&lt;br /&gt;
    &lt;br /&gt;
PostgreSQL verwendet kein Bugtracking-System, da es sich als effizienter erwiesen hat, E-Mails direkt zu beantworten und die TODO-Liste aktuell zu halten. In der Praxis werden Bugs sehr schnell beseitigt, und diejenigen Bugs, die Auswirkungen auf eine große Anzahl von Nutzern haben, werden meist kurzfristig korrigiert. Der einzige Überblick über alle Änderungen, Verbesserungen und Korrekturen in einer PostgreSQL-Version befindet sich in den CVS-Log-Meldungen. Auch die Release-Notes listen nicht jede Änderung in der Software auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Dokumentation ist für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet umfangreiche Dokumentation, darunter ein großes&lt;br /&gt;
Handbuch, man-Pages und einige kleine Testprogramme. Siehe das /doc-&lt;br /&gt;
Verzeichnis. Ausserdem sind alle Handbücher online unter&lt;br /&gt;
http://www.postgresql.org/docs/ verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Bücher zu PostgreSQL sind online verfügbar unter&lt;br /&gt;
http://www.postgresql.org/docs/books/awbook.html und&lt;br /&gt;
http://www.commandprompt.com/ppbook/ .&lt;br /&gt;
&lt;br /&gt;
Eine Liste lieferbarer PostgreSQL-Bücher befindet sich unter&lt;br /&gt;
http://www.postgresql.org/docs/books Diverse technische Artikel&lt;br /&gt;
befinden sich unter http://www.postgresql.org/docs/techdocs .&lt;br /&gt;
&lt;br /&gt;
psql hat einige nützliche \d-Befehle, um Informationen über Typen,&lt;br /&gt;
Operatoren, Funktionen, Aggregate, usw. zu zeigen.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Website enthält noch mehr Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich SQL lernen? ===&lt;br /&gt;
  &lt;br /&gt;
Die oben erwähnten PostgreSQL-spezifische Bücher bieten einen guten&lt;br /&gt;
Einstieg. Viele PostgreSQL-Anwender mögen &amp;quot;The Practical SQL Handbook&amp;quot;&lt;br /&gt;
(Bowman et al., Addison Wesley). Andere dagegen mögen &amp;quot;The Complete&lt;br /&gt;
Reference SQL&amp;quot; (Groff et al., McGraw-Hill).&lt;br /&gt;
&lt;br /&gt;
Es gibt ausserdem einige nützliche Online-Tutorials:&lt;br /&gt;
&lt;br /&gt;
* http://www.intermedia.net/support/sql/sqltut.shtm&lt;br /&gt;
* http://sqlcourse.com&lt;br /&gt;
* http://www.w3schools.com/sql/default.asp&lt;br /&gt;
* http://mysite.verizon.net/Graeme_Birchall/id1.html&lt;br /&gt;
    &lt;br /&gt;
=== Wie kann ich im Entwicklerteam mitarbeiten? ===&lt;br /&gt;
  &lt;br /&gt;
Lesen Sie in der Entwickler-FAQ unter&lt;br /&gt;
[[Developer_FAQ | Developer FAQ]] nach.&lt;br /&gt;
&lt;br /&gt;
=== Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt verschiedene Methoden, Software zu messen: Eigenschaften,&lt;br /&gt;
Performanz, Zuverlässigkeit, Support und Preis.&lt;br /&gt;
&lt;br /&gt;
==== Eigenschaften ====&lt;br /&gt;
&lt;br /&gt;
       PostgreSQL besitzt die meisten Eigenschaften - wie&lt;br /&gt;
       Transaktionen, Unterabfragen (Subqueries), Trigger, Views,&lt;br /&gt;
       referenzielle Integrität bei Fremdschlüsseln und verfeinertes&lt;br /&gt;
       Locking - die bei großen kommerziellen DBMS vorhanden sind. Es&lt;br /&gt;
       bietet außerdem einige anderen Eigenschaften, die diese nicht&lt;br /&gt;
       immer haben, wie benutzerbestimmte Typen, Vererbung, Regeln,&lt;br /&gt;
       und die Multi-Versionen-Steuerung zum Verringern&lt;br /&gt;
       konkurrierender Locks.&lt;br /&gt;
       &lt;br /&gt;
==== Performanz ====&lt;br /&gt;
       Die Performanz von PostgreSQL ist mit der von kommerziellen und&lt;br /&gt;
       anderen Open-Source-Datenbanken vergleichbar. In manchen&lt;br /&gt;
       Bereichen ist es schneller, in anderen langsamer. In der Regel&lt;br /&gt;
       beträgt der Unterschied +/-10%.&lt;br /&gt;
       &lt;br /&gt;
==== Zuverlässigkeit ====&lt;br /&gt;
       Es ist selbstredend, dass ein DBMS wertlos ist, wenn es nicht&lt;br /&gt;
       zuverlässig arbeitet. Daher bemühen wir uns, nur streng&lt;br /&gt;
       geprüften und beständigen Code freizugeben, der nur ein Minimum&lt;br /&gt;
       an Programmfehlern aufweist. Jede Freigabe hat mindestens einen&lt;br /&gt;
       Monat Betatest-Phase hinter sich, und unsere Freigabehistorie&lt;br /&gt;
       beweist, dass wir stabile und solide Versionen freigeben, die&lt;br /&gt;
       im Produktionsbetrieb genutzt werden können. Wir glauben, dass&lt;br /&gt;
       wir im Vergleich mit anderer Datenbanksoftware vorteilhaft&lt;br /&gt;
       dastehen.&lt;br /&gt;
       &lt;br /&gt;
==== Support ====&lt;br /&gt;
       Unsere Mailinglisten bieten die Möglichkeit, gemeinsam mit&lt;br /&gt;
       einer großen Gruppe von Entwicklern und Benutzern mögliche&lt;br /&gt;
       Probleme zu lösen. Wir können nicht immer eine Fehlerbehebung&lt;br /&gt;
       garantieren, kommerzielle DBMS tun dies aber auch nicht. Der&lt;br /&gt;
       direkte Kontakt zur Entwickler- und Benutzergemeinschaft und&lt;br /&gt;
       der Zugriff auf die Handbücher und den Quellcode ermöglicht&lt;br /&gt;
       einen im Vergleich zu anderen DBMS höherwertigeren Support. Es&lt;br /&gt;
       gibt jedoch auch Anbieter von kommerziellen Support-Leistungen&lt;br /&gt;
       (siehe FAQ-Punkt 1.7).&lt;br /&gt;
       &lt;br /&gt;
==== Preis ====&lt;br /&gt;
       PostgreSQL ist frei verfügbar, sowohl für die kommerzielle wie&lt;br /&gt;
       auch für die nicht-kommerzielle Nutzung. Sie können den&lt;br /&gt;
       PostgreSQL-Code ohne Einschränkungen (außer denjenigen, die in&lt;br /&gt;
       der oben angegebene BSD-artigen Lizenz erwähnt werden) in Ihr&lt;br /&gt;
       Produkt integrieren.&lt;br /&gt;
&lt;br /&gt;
=== Kann PostgreSQL eingebettet (embedded) werden? ===&lt;br /&gt;
PostgreSQL basiert auf einer Server/Client-Architektur, diese benötigt separate Prozesse für jeden Klient und Server, hinzukommen auch noch weitere &amp;quot;Helfer-Prozesse&amp;quot; (z. B. für autovacuum und stats-collector). Zwar können einige &amp;quot;embedded-Architekturen&amp;quot; diese Anforderungen erfüllen, aber wenn der Datenbank-Prozess innerhalb des Applikations-Prozesses laufen muss, kann PostgreSQL nicht verwendet werden. Dazu sollte man leichtere Datenbanken nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mich von einer Maillingliste abmelden? Wie verhindere ich es, dass ich doppelte E-Mails bekomme? ===&lt;br /&gt;
Majordomo ermöglicht es sich von allen Maillinglisten an- und abzumelden, ggf. müssen Sie sich zuerst ihr Majordomo-Passwort zuschicken lassen.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Maillinglisten sind so konfiguriert, dass Antworten an den ursprünglichen Autor und an die Maillingliste verschickt werden. Somit soll erreicht werden dass Benutzer immer schnellstmöglichst eine Antwort erhalten können. Diese Einstellungen können Sie auch über die Konfiguration von Majordomo ändern, ändern Sie dafür die Einstellung für ''eliminatecc''. Sie können auch einstellen dass Sie selbst keine Antwort auf Ihre eigenen E-Mails bekommen, ändern sie dafür die Einstellung für ''selfcopy''.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
&lt;br /&gt;
== Fragen zu Benutzerprogrammen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Welche Schnittstellen gibt es für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Installation stellt nur Schnittstellen für C und&lt;br /&gt;
Embedded C bereit. Alle weitere Schnittstellen sind unabhängige&lt;br /&gt;
Projekte, die einzeln heruntergeladen werden werden müssen. Diese&lt;br /&gt;
Trennung ermöglicht individuelle Entwickler-Teams und&lt;br /&gt;
Entwicklungszyklen für die jeweiligen Projekte.&lt;br /&gt;
&lt;br /&gt;
Einige Programmiersprachen wie PHP haben eine PostgreSQL-&lt;br /&gt;
Schnittstelle bereits eingebaut. Schnittstellen für Sprachen wie Perl,&lt;br /&gt;
TCL, Python und viele anderen sind unter http://gborg.postgresql.org&lt;br /&gt;
im Bereich Drivers/Interfaces verfügbar sowie per Internet-Suche.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann man PostgreSQL in einer Website nutzen? ===&lt;br /&gt;
  &lt;br /&gt;
Eine nette Einführung zu datenbank-gestützten Webseiten kann unter&lt;br /&gt;
http://www.webreview.com (engl.) eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Für die Web-Integration ist PHP eine ausgezeichnete Schnittstelle. PHP&lt;br /&gt;
gibt es bei http://www.php.net&lt;br /&gt;
&lt;br /&gt;
Desweiteren bietet sich die Perl-Schnittstelle mit CGI.pm&lt;br /&gt;
oder mod_perl auch an.&lt;br /&gt;
&lt;br /&gt;
=== Hat PostgreSQL eine grafische Benutzerschnittstelle? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt eine große Anzahl von GUI-Programmen für PostgreSQL - sowohl&lt;br /&gt;
kommerziell als auch Open-Source. [http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools Eine englische Liste befindet sich hier.]&lt;br /&gt;
&lt;br /&gt;
== Administrative Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql? ===&lt;br /&gt;
  &lt;br /&gt;
Bei der Ausführung von configure die Option --prefix mit dem Zielverzeichnis angeben.&lt;br /&gt;
&lt;br /&gt;
=== Wie regle ich Zugriffe von anderen Rechnern? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL ist standardmäßig so eingestellt, dass Verbindungen nur vom&lt;br /&gt;
lokalen Rechner über Unix Domain Sockets bzw. TCP/IP möglich sind.&lt;br /&gt;
Verbindungen von anderen Rechnern werden erst dann ermöglicht, wenn&lt;br /&gt;
Sie in der Datei postgresql.conf die Einstellung listen_addresses&lt;br /&gt;
anpassen, in der Datei $PGDATA/pg_hba.conf host-basierte&lt;br /&gt;
Authentifizierung einschalten und den Server neu starten.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine bessere Performanz erreichen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt drei große Bereiche, in denen Performanzverbesserungen erzielt&lt;br /&gt;
werden können:&lt;br /&gt;
&lt;br /&gt;
==== Abfrageoptimierung ====&lt;br /&gt;
Die Modifizierung von Abfragen kann eine bessere Performanz erzielen:&lt;br /&gt;
       &lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/indexes.html Erstellung von Indexen, einschliesslich partieller Indexe sowie Expressionsindexe]&lt;br /&gt;
* Einsatz von COPY anstelle multipler INSERT-Anweisungen&lt;br /&gt;
* Gruppierung von mehreren Abfragen innerhalb einer Transaktion, um Aufwand beim Abschluss von Transaktionen    einzusparen&lt;br /&gt;
* Einsatz von CLUSTER beim Holen von einer großen Anzahl von Datenreihen aus einem Index&lt;br /&gt;
* Einsatz von LIMIT, um eine Untermenge der Abfragenergebnisse zurückzuliefern&lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/sql-prepare.html Einsatz von vorbereiteten Befehlen (prepared queries)]&lt;br /&gt;
* Einsatz von ANALYZE, um die Datenbankstatistik für den Abfragenplaner aktuell zu halten&lt;br /&gt;
* [http://www.postgresql.org/docs/current/static/routine-vacuuming.html Regelmäßiger Einsatz von VACUUM bzw. pg_autovacuum (autovacuum ist seit Version 8.3 standardmäßig aktiviert)]&lt;br /&gt;
* Bei großen Datenveränderungen die Löschung von Indexen&lt;br /&gt;
&lt;br /&gt;
==== Server-Konfiguration ====&lt;br /&gt;
Einige Einstellungen in der Datei postgresql.conf wirken sich auf die Performanz aus. Das Handbuch enthält unter      http://www.postgresql.org/docs/current/static/runtime-config.html eine komplette Auflistung. &lt;br /&gt;
&lt;br /&gt;
Kommentare zu den jeweiligen Einstellungen gibt es unter http://www.varlena.com/varlena/GeneralBits/Tidbitsannotated_conf_e.html und http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.&lt;br /&gt;
       &lt;br /&gt;
==== Hardware-Auswahl ====&lt;br /&gt;
Die Auswirkung von Hardware auf Performanz wird unter http://momjian.us/main/writings/pgsql/hw_performance/index.html und http://www.powerpostgresql.com/PerfList/ erläutert.&lt;br /&gt;
       &lt;br /&gt;
=== Welche Debugging-Funktionen sind für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
Unter den Optionen für die Server-Konfigurierung gibt es zahlreiche&lt;br /&gt;
log_*-Variablen, die die Ausgabe von Abfrage- und Prozessstatistiken&lt;br /&gt;
ermöglichen. Diese können für Debugging-Zwecke sowie Performanz-Tests&lt;br /&gt;
sehr nützlich sein.&lt;br /&gt;
&lt;br /&gt;
=== Ich bekomme die Meldung &amp;quot;Sorry, too many clients&amp;quot;, wenn ich eine Verbindung aufzubauen versuche. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Ihr System hat die maximal zulässige Anzahl von Datenbankverbindungen&lt;br /&gt;
erreicht (Voreinstellung 100). Sie müssen die maximale Anzahl der&lt;br /&gt;
gleichzeitig ausführbaren Backend-Prozesse hochsetzen, indem Sie in&lt;br /&gt;
postgresql.conf den Wert max_connections ändern und den Server&lt;br /&gt;
neustarten.&lt;br /&gt;
&lt;br /&gt;
=== Wie wird PostgreSQL aktualisiert? ===&lt;br /&gt;
  &lt;br /&gt;
Allgemeine Informationen zur Aktualisierung von PostgreSQL gibt es auf&lt;br /&gt;
der Seite http://www.postgresql.org/support/versioning. Detaillierte&lt;br /&gt;
technische Informationen gibt es auf der Seite&lt;br /&gt;
http://www.postgresql.org/docs/current/static/install-upgrading.html&lt;br /&gt;
&lt;br /&gt;
=== Kommt PostgreSQL mit den Anpassungen der Sommerzeit in verschiedenen Ländern klar? ===&lt;br /&gt;
  &lt;br /&gt;
Für die Berücksichtigung der Sommerzeit verwendet PostgreSQL Seit dem Release 8.0 die weiterverbreitete tzdata-Datenbank (auch bekannt als &amp;quot;zoneinfo database&amp;quot; oder &amp;quot;[http://www.twinsun.com/tz/tz-link.htm Olzen timezone database]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jedes Update von PostgreSQL beinhaltet die aktuellen tzdata Dateien, daher sollte es reichen die Minor-Updates der eingesetzten Major Version im Auge zu behalten.&lt;br /&gt;
&lt;br /&gt;
Unter der Vorraussetzung dass das Betriebssystem diese Dateien schon in einer stets aktuellen Version vorbehält, ist es üblich, dass man diese Dateien verwendet. PostgreSQL bietet dazu eine compile-option an.&lt;br /&gt;
&lt;br /&gt;
=== Welche Hardware eignet sich für den Betrieb mit PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL läuft auf fast jeder Hardware-Kombination. Im PC-Bereich&lt;br /&gt;
gibt es allerdings sehr große Abweichungen in der Qualität. Für einen&lt;br /&gt;
Arbeitsplatz- oder Entwicklungsrechner mag dies nicht so bedeutend&lt;br /&gt;
sein, im Server-Betrieb jedoch lohnt sich auf jeden Fall die&lt;br /&gt;
Investition in teurere Bestandteile (Stichwörter ECC-Speicher, SCSI,&lt;br /&gt;
Hauptplatinen und Netzteile von namhaften Herstellern). Nutzen Sie&lt;br /&gt;
unsere Mailing-Listen, um Hardware-Optionen zu diskutieren.&lt;br /&gt;
&lt;br /&gt;
== Fragen zum Betrieb ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie wähle ich per SELECT-Anweisung nur die ersten paar Zeilen bzw. eine beliebige Zeile in einer Abfrage aus? ===&lt;br /&gt;
  &lt;br /&gt;
Wenn Sie bei der Ausführung der Abfrage die Anzahl der anzufordenden&lt;br /&gt;
Reihen bereits kennen, nutzen Sie LIMIT. Wenn die ORDER BY- Anweisung&lt;br /&gt;
mit einem Index verwendet wird, ist es möglich, dass die gesamte&lt;br /&gt;
Abfrage nicht ausgeführt werden muss. Wenn Sie die Anzahl der der&lt;br /&gt;
anzufordenden Reihen nicht kennen, verwenden Sie einen Cursor und&lt;br /&gt;
FETCH.&lt;br /&gt;
&lt;br /&gt;
Um eine beliebige Zeile auszuwählen, nutzen Sie ORDER BY random():&lt;br /&gt;
    SELECT spalte&lt;br /&gt;
      FROM tabelle&lt;br /&gt;
  ORDER BY random()&lt;br /&gt;
     LIMIT 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Wie finde ich heraus, welche Tabellen, Indexe, Datenbanken oder Benutzer in der Datenbank definiert sind? Wie bekomme ich die von psql verwendeten Abfragen? ===&lt;br /&gt;
  &lt;br /&gt;
In psql zeigt der Befehl \dt eine Liste der Datenbanktabellen. Weitere&lt;br /&gt;
psql-Befehle lassen sich mit \? anzeigen. Sie können sich die Datei&lt;br /&gt;
pgsql/src/bin/psql/describe.c mit dem Quellcode für psql ansehen. Sie&lt;br /&gt;
enthält die SQL-Abfragen, die die Backslash-Kommandos (\) ausführen.&lt;br /&gt;
Sie können psql auch mit der -E Option starten. Danach gibt psql die&lt;br /&gt;
Abfragen aus, die es bei der Ausführung der Befehle benutzt. Außerdem&lt;br /&gt;
biete PostgreSQL ein SQL-kompatibles INFORMATION SCHEMA, das&lt;br /&gt;
Metainformation über die Datenbank zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
Mit psql -l können Sie alle Datenbanken anzeigen lassen.&lt;br /&gt;
&lt;br /&gt;
Die Datei pgsql/src/tutorial/syscat.source enthält außerdem viele&lt;br /&gt;
SELECT- Abfragen, mit deren Hilfe man Information über die&lt;br /&gt;
Systemtabellen erhalten kann.&lt;br /&gt;
&lt;br /&gt;
=== Wie ändere ich den Datentyp einer Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Ab Version 8.0 kann der Datentyp einer Spalte mit ALTER TABLE ALTER&lt;br /&gt;
COLUMN TYPE geändert werden, sofern der neue Datentyp die Werte des&lt;br /&gt;
alten Datentype aufnehmen kann.&lt;br /&gt;
&lt;br /&gt;
Bei früheren Versionen gehen Sie wie folgt vor:&lt;br /&gt;
    BEGIN;&lt;br /&gt;
    ALTER TABLE tabelle ADD COLUMN neue_spalte neuer_datentyp;&lt;br /&gt;
    UPDATE tabelle SET neue_spalte = CAST(alte_spalte AS neuer_datentyp);&lt;br /&gt;
    ALTER TABLE tabelle DROP COLUMN alte_spalte;&lt;br /&gt;
    COMMIT;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Speicherplatz freizugeben, der von der gelöschten Spalte&lt;br /&gt;
verwendet wurde, führen Sie VACUUM FULL aus.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank? ===&lt;br /&gt;
  &lt;br /&gt;
Es bestehen folgende Obergrenzen:&lt;br /&gt;
 Maximale Größe eine Datenbank?           unbeschränkt (es existieren&lt;br /&gt;
                                            Datenbanken mit 32 TB)&lt;br /&gt;
 Maximale Größe einer Tabelle?            32 TB&lt;br /&gt;
 Maximale Größe einer Zeile?              400 GB&lt;br /&gt;
 Maximale Größe einer Spalte?             1 GB&lt;br /&gt;
 Maximale Anzahl von Zeilen in einer Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
 Maximale Anzahl von Spalten in einer Tabelle?&lt;br /&gt;
                                          250-1600 je nach Spaltentyp&lt;br /&gt;
 Maximale Anzahl von Indexen für eine Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich sind dies theoretische Werte, die oft durch die&lt;br /&gt;
verfügbaren Platten- und Speicherressourcen beschränkt werden. Extreme&lt;br /&gt;
Größen können zu Leistungseinbußen führen.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße von 32 TB benötigt keine&lt;br /&gt;
Large-File-Unterstützung im Betriebssystem. Große Tabellen werden in&lt;br /&gt;
Dateien mit einer Größe von je 1 GB aufgeteilt, wodurch etwaige&lt;br /&gt;
dateisystem-bedingte Beschränkungen nicht relevant sind.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße und die maximale Anzahl von Spalten können&lt;br /&gt;
vervierfacht werden, indem man die Default-Blockgröße auf 32 KB&lt;br /&gt;
heraufsetzt. Die Tabellengröße kann auch durch Tabellenpartitionierung&lt;br /&gt;
vergrößert werden.&lt;br /&gt;
&lt;br /&gt;
Eine Einschränkung ist, dass Indexe nur auf Spalten erstellt werden&lt;br /&gt;
können, die bis etwa 2.000 Zeichen groß sind. Um auf größere Spalten&lt;br /&gt;
eine UNIQUE-Constraint setzen zu können, nutzen Sie einen funktionalen&lt;br /&gt;
Index mit dem MD5-Hash-Wert der Spalte. Um innerhalb einer großen, mit&lt;br /&gt;
Text belegten Spalte suchen zu können, verwenden Sie einen&lt;br /&gt;
Volltext-Index.&lt;br /&gt;
&lt;br /&gt;
=== Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen Textdatei abzuspeichern? ===&lt;br /&gt;
  &lt;br /&gt;
Eine PostgreSQL-Datenbank kann beim Abspeichern einer einfachen&lt;br /&gt;
Textdatei bis zu fünfmal mehr Platz gegenüber der eigentlichen Größe&lt;br /&gt;
der Datei beanspruchen.&lt;br /&gt;
&lt;br /&gt;
Betrachten wir eine Datei mit 100.000 Zeilen mit einem Integer und&lt;br /&gt;
einer Textbeschreibung pro Zeile. Gehen wir davon aus, dass die&lt;br /&gt;
durchschnittliche Länge der Textbeschreibung 20 Byte beträgt. Die&lt;br /&gt;
einfache Datei würde 2,8 MB groß sein. Die Größe der&lt;br /&gt;
PostgreSQL-Datenbankdatei, die diese Daten enthält, liegt ungefähr bei&lt;br /&gt;
5,2 MB:&lt;br /&gt;
 24 Bytes: jeder Zeilenkopf (ungefähr)&lt;br /&gt;
+24 Bytes: ein Integer-Feld und ein Textfeld&lt;br /&gt;
+ 4 Bytes: Zeiger auf der Datenseite auf den Tupel&lt;br /&gt;
-----------------------------------------------&lt;br /&gt;
 52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
Die Größe einer Datenseite in PostgreSQL beträgt 8192 Bytes (8 KB),&lt;br /&gt;
also:&lt;br /&gt;
8192 Bytes pro Seite&lt;br /&gt;
---------------------   =  146 Zeilen pro Seite (abgerundet)&lt;br /&gt;
  52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
100.000 Datenzeilen&lt;br /&gt;
------------------------  =  685 Datenbankseiten (aufgerundet)&lt;br /&gt;
    158 Zeilen pro Seite&lt;br /&gt;
&lt;br /&gt;
633 Datenbankseiten * 8192 Bytes pro Seite  =  5,185,536 bytes (5,2 MB)&lt;br /&gt;
&lt;br /&gt;
Indexe beanspruchen nicht so viel Platz. Da sie jedoch die Daten&lt;br /&gt;
beinhalten, die sie indizieren, können auch sie sehr groß werden.&lt;br /&gt;
&lt;br /&gt;
NULL-Werte werden als Bitmaps gespeichert, wodurch sie sehr wenig&lt;br /&gt;
Platz in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Meine Abfragen sind langsam oder benutzen die Indexe nicht. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Indexe werden nicht automatisch bei jeder Abfrage verwendet. Indexe&lt;br /&gt;
werden nur dann verwendet, wenn die abzufragende Tabelle eine&lt;br /&gt;
bestimmte Größe übersteigt, und die Abfrage nur eine kleine&lt;br /&gt;
Prozentzahl der Tabellenzeilen abfragt. Der Grund hierfür ist der,&lt;br /&gt;
dass die durch einen Index verursachten Festplattenzugriffe manchmal&lt;br /&gt;
länger dauern würden als ein einfaches Auslesen aller Tabellenzeilen&lt;br /&gt;
(sequentieller Scan).&lt;br /&gt;
&lt;br /&gt;
Um festzustellen, ob ein Index verwendet werden soll, braucht&lt;br /&gt;
PostgreSQL Statistiken über die Tabelle. Diese Statistiken werden&lt;br /&gt;
durch die Anweisungen VACUUM ANALYZE bzw. ANALYZE berechnet. Anhand&lt;br /&gt;
der Statistiken kennt der Abfragenoptimierer die Anzahl der&lt;br /&gt;
Tabellenzeilen und kann besser entscheiden, ob Indexe verwendet werden&lt;br /&gt;
sollen. Statistiken sind auch bei der Ermittlung der optimalen&lt;br /&gt;
JOIN-Reihenfolgen und -Methoden wertvoll. Daher sollten diese&lt;br /&gt;
regelmässig durchgeführt werden, da sich der Inhalt einer Tabelle ja&lt;br /&gt;
auch verändert.&lt;br /&gt;
&lt;br /&gt;
Indexe werden normalerweise nicht in ORDER BY-Abfrage oder in JOINs&lt;br /&gt;
verwendet. Ein sequentieller Scan mit anschließendem explizitem&lt;br /&gt;
Sortiervorgang ist normalerweise schneller als ein Index-Scan einer&lt;br /&gt;
großen Tabelle. Jedoch wird bei einer Abfrage, in der LIMIT zusammen&lt;br /&gt;
mit ORDER BY verwendet wird, oftmals ein Index verwendet, da nur ein&lt;br /&gt;
kleiner Abschnitt der Tabelle zurückgeliefert wird.&lt;br /&gt;
&lt;br /&gt;
Sollte es danach aussehen, also ob der Optimierer irrtümlich einen&lt;br /&gt;
sequentiellen Scan ausführt, führen Sie SET enable_seqscan TO 'off'&lt;br /&gt;
aus und prüfen Sie, ob die Indexabfrage dadurch scheller geworden ist.&lt;br /&gt;
&lt;br /&gt;
Bei der Nutzung von Wildcard-Operatoren wie LIKE oder ~, können Indexe&lt;br /&gt;
nur unter bestimmten Umständen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
* Das Suchmuster muss sich an Anfang des Strings befinden, d.h.:&lt;br /&gt;
** LIKE-Suchmuster dürfen nicht mit % anfangen;&lt;br /&gt;
** ~ (reguläre Ausdrücke) müssen mit ^ anfangen.&lt;br /&gt;
* Das Suchmuster darf nicht mit einer Zeichenklasse (z.B. [a-e]) beginnen.&lt;br /&gt;
* Suchmuster, die Gross- und Kleinschreibung nicht berücksichtigen (z.B. ILIKE bzw. ~*), verwenden keine Indexe. Stattdessen können funktionale Indexe verwendet werden, die im Punkt 4.8 beschrieben werden.&lt;br /&gt;
* Die Standard-Locale &amp;quot;C&amp;quot; muss während der Datenbank-Initialisierung mit initdb verwendet worden sein, da andere locales den nächstgrößten Wert nicht ermitteln können. Es ist allerdings möglich, einen besonderen text_pattern_ops-Index für solche Fälle zu erstellen.&lt;br /&gt;
    &lt;br /&gt;
In Versionen vor 8.0 werden Indexe oft nicht benutzt, wenn die&lt;br /&gt;
jeweiligen Datentypen nicht genau übereinstimmen. Dies gilt besonders&lt;br /&gt;
für Indexe auf Spalten mit den Datentypen INT2, INT8 und NUMERIC&lt;br /&gt;
&lt;br /&gt;
=== Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine Abfrage auswertet? ===&lt;br /&gt;
  &lt;br /&gt;
Eine ausführliche Erklärung zu diesem Thema findet sich in der [http://www.postgresql.org/docs/current/static/sql-explain.html EXPLAIN] Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie änder ich das Sortierverhalten von textähnlichen Daten? ===&lt;br /&gt;
PostgreSQL sortiert Daten anhand dem bei initdb gesetzten Locale. (Ab 8.4 wird es es möglich sein pro Datenbank ein eigenes Locale zu definieren)&lt;br /&gt;
&lt;br /&gt;
Entspricht das Sortierverhalten nicht dem gewünschten muss man die Locale ändern. Die meisten Locales, außer &amp;quot;C&amp;quot;, sortieren anhand der Reihenfolge des entsprechenden Wörterbuches. Das Locale &amp;quot;C&amp;quot; ignoriert jegliche Punktuation und Zwischenraum.&lt;br /&gt;
&lt;br /&gt;
=== Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei einer Suche, bei der Groß- und Kleinschreibweisen ignoriert werden? Wie verwende ich einen Index bei solchen Suchabfragen? ===&lt;br /&gt;
  &lt;br /&gt;
Der Operator ~ wendet einen regulären Ausdruck an und ~* wendet ihn&lt;br /&gt;
an, ohne die Groß- und Kleinschreibung zu beachten. Ebenso beachtet&lt;br /&gt;
LIKE die Groß- und Kleinschreibung, und ILIKE nicht.&lt;br /&gt;
&lt;br /&gt;
Gleichheitsvergleiche, die Groß- und Kleinschreibung ignorieren,&lt;br /&gt;
werden in der Regel so ausgedruckt:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle&lt;br /&gt;
    WHERE LOWER(spalte) = 'abc'&lt;br /&gt;
&lt;br /&gt;
Hier wird kein normaler Index benutzt. Legt man hingegen einen&lt;br /&gt;
funktionalen Index an, so wird er auf jeden Fall verwendet:&lt;br /&gt;
   CREATE INDEX tabelle_index ON tabelle (LOWER(spalte))&lt;br /&gt;
&lt;br /&gt;
Falls der obige Index als einen UNIQUE-Index angelegt wird, können&lt;br /&gt;
keine Werte in die Spalte eingefügt werden, die sich nur durch ihre&lt;br /&gt;
Groß- und Kleinschreibung unterscheiden. Um Fehler zu vermeiden muß&lt;br /&gt;
ein CHECK-Constraint oder ein Trigger eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist? Kann nach der NULL-Belegung sortiert werden? ===&lt;br /&gt;
  &lt;br /&gt;
Testen Sie die Spalte mit IS NULL bzw. IS NOT NULL.&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   WHERE &lt;br /&gt;
      spalte IS NULL&lt;br /&gt;
&lt;br /&gt;
Beim konkatenieren mit einen NULL-Wert wir das Ergebnis auch NULL. Um dies zu verhindern verwenden Sie am besten [http://www.postgresql.org/docs/current/static/functions-conditional.html COALESCE()]&lt;br /&gt;
   SELECT &lt;br /&gt;
      COALESCE(col1, '') || COALESCE(col2, '')&lt;br /&gt;
   FROM tab;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um die Spalte danach zu sortieren, ob sie mit NULL belegt ist oder nicht, verwenden Sie die Bedingungen IS NULL bzw. IS NOT NULL in der ORDER BY-Klausel. Da Bedingungen, die wahr sind, höher als das Gegenteil sortiert werden, bewirkt die folgende Abfrage, dass die NULL-Spalten zuerst gelistet werden:&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      (spalte IS NOT NULL)&lt;br /&gt;
&lt;br /&gt;
Ab PostreSQL 8.3 und höher, ist es möglich das standardisierte NULLS FIRST/NULLS LAST zu verwenden um die Position der NULL-Werte im Ergebnis zu bestimmen. (bei FIRST stehen diese zu erst, bei LAST am Ende)&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tab&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      col NULLS FIRST;&lt;br /&gt;
&lt;br /&gt;
=== Was ist der Unterschied zwischen den verschiedenen CHAR-Typen? ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Typ&lt;br /&gt;
!interner Name&lt;br /&gt;
!Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
|VARCHAR(n) &lt;br /&gt;
|varchar&lt;br /&gt;
|die Größe legt die Maximallänge fest; kein Auffüllen mit Leerzeichen&lt;br /&gt;
|-  &lt;br /&gt;
|CHAR(n)&lt;br /&gt;
|bpchar&lt;br /&gt;
|mit Leerzeichen gefüllt bis zur angegebenen Länge&lt;br /&gt;
|-&lt;br /&gt;
|TEXT&lt;br /&gt;
|text&lt;br /&gt;
|keine obere Grenze für die Länge&lt;br /&gt;
|-&lt;br /&gt;
|BYTEA&lt;br /&gt;
|bytea&lt;br /&gt;
|Bytearray mit variabler Länge (auch für '\0'-Bytes geeignet)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;char&amp;quot; (with the quotes)&lt;br /&gt;
|char&lt;br /&gt;
|ein Zeichen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der interne Name kommt vor allem in den Systemkatalogen und in manchen&lt;br /&gt;
Fehlermeldungen vor.&lt;br /&gt;
&lt;br /&gt;
Die ersten vier Typen sind &amp;quot;varlena&amp;quot;-Typen (d.h. die ersten vier Bytes&lt;br /&gt;
geben die Länge an, gefolgt von den Daten). Daher ist der tatsächlich&lt;br /&gt;
belegte Platz immer etwas mehr als die deklarierte Feldgröße.&lt;br /&gt;
Allerdings wird unter Umständen auf diese Datentypen Datenkompression&lt;br /&gt;
durch das TOAST- Verfahren angewendet, womit der tatsächlich belegte&lt;br /&gt;
Platz auch geringer als erwartet ausfallen kann.&lt;br /&gt;
&lt;br /&gt;
Für die Speicherung von Zeichenketten variabler Länge empfiehlt sich&lt;br /&gt;
VARCHAR(n). Die maximale Länge eines VARCHAR(n)-Felds wird bei der&lt;br /&gt;
Tabellendefinition festgelegt. TEXT setzt keine Längengrenze,&lt;br /&gt;
allerdings gibt es eine systembedingte Obergrenze von 1 GB.&lt;br /&gt;
&lt;br /&gt;
CHAR(n) ist geeignet für die Speicherung von Zeichenketten, die alle&lt;br /&gt;
die gleiche Länge haben. Bitte beachten Sie, dass CHAR(n) automatisch&lt;br /&gt;
Zeichenketten bis zur definierten Feldlänge mit Leerzeichen ausfüllt,&lt;br /&gt;
während bei VARCHAR(n) nur die tatsächlich eingegebene Zeichenkette&lt;br /&gt;
gespeichert wird.&lt;br /&gt;
&lt;br /&gt;
BYTEA ist für binäre Daten, besonders für Werte, die NULL-Bytes haben.&lt;br /&gt;
&lt;br /&gt;
Alle der hier erwähnten Typen weisen ähnliche Performanzeigenschaften&lt;br /&gt;
auf.&lt;br /&gt;
&lt;br /&gt;
=== Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Wert? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet einen SERIAL-Datentyp. Dies ist zwar kein richtiger Datentyp. Es ist die Kurzform für das Erstellen einer Spalte vom Typ Integer, die von einer Sequenz befüllt wird. &lt;br /&gt;
&lt;br /&gt;
Zum Beispiel:&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
       id   SERIAL,&lt;br /&gt;
       name TEXT&lt;br /&gt;
   )&lt;br /&gt;
&lt;br /&gt;
wird automatisch in:&lt;br /&gt;
   CREATE SEQUENCE person_id_seq;&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
     id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),&lt;br /&gt;
     name TEXT&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Die automatisch generierte Sequenz besitzt immer folgenden Namen:&lt;br /&gt;
''tabellederspalte''-''namederspalte''_seq&lt;br /&gt;
&lt;br /&gt;
Die Man-Page zu CREATE SEQUENCE beinhaltet mehr Informationen zu Sequenzen.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einen Typ BIGSERIAL, dieser unterscheidet sich aber nur darin dass die Spalte den Typ BIGINTEGER bekommt. BIGSERIAL sollte verwendet werden wenn es zu erwarten ist, dass mehr als 2 Milliarden Sequenz-Werte verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie bekomme ich den Wert einer SERIAL-Sequenz? ===&lt;br /&gt;
  &lt;br /&gt;
Eine Möglichkeit wäre, mit der nextval()-Funktion den nächsten SERIAL-Wert von dem Sequenzobjekt vor der Auszuführung einer INSERT-Anweisung anzufordern und ihn dann explizit in die INSERT-Anweisung einzubinden. Anhand der Beispieltabelle in 4.11.1 könnte dieser Vorgang in einer Pseudosprache so aussehen:&lt;br /&gt;
&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT nextval('person_id_seq')&amp;quot;);&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Danach stünde der neue Wert in der Variablen new_id für die Verwendung in weiteren Abfragen zur Verfügung, zum Beispiel als Fremdschlüssel zur Tabelle 'person'). Bitte beachten Sie, dass der Name des automatisch erstellten SEQUENCE-Objektes folgenden Name hat: «table»_«serialcolumn»_seq wobei 'table' und 'serialcolumn' die Namen&lt;br /&gt;
der jeweils betreffenden Tabelle / Spalte darstellen.&lt;br /&gt;
&lt;br /&gt;
Als weitere Möglichkeit können Sie nach einer INSERT-Anweisung den automatisch eingefügten SERIAL-Wert mit der currval()-Funktion zurückgeben lassen:&lt;br /&gt;
&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT currval('person_id_seq')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Die einfachste Möglichkeit ist es RETURNING zu verwenden. Ein einfaches Beispiel sähe so aus:&lt;br /&gt;
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;&lt;br /&gt;
&lt;br /&gt;
=== Führt currval() zu einer Race-Condition mit anderen Nutzern? ===&lt;br /&gt;
  &lt;br /&gt;
Nein. currval() liefert einen Wert zurück, der von Ihrer&lt;br /&gt;
Datenbank-Session bestimmt wird, und der anderen Sessionen nicht zur&lt;br /&gt;
Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner Sequenz-/SERIAL-Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Um die gleichzeitige Abarbeitung von Transaktionen zu verbessern,&lt;br /&gt;
werden Sequenzen gerade nicht für andere Transaktionen gesperrt,&lt;br /&gt;
sondern die Sequenznummern werden den laufenden Transaktionen sofort&lt;br /&gt;
zugeteilt. Lücken in der Sequenznummerierung werden durch abgebrochene&lt;br /&gt;
Transaktionen verursacht.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein OID? ===&lt;br /&gt;
  &lt;br /&gt;
Jede Zeile, die in PostgreSQL erzeugt wird, bekommt eine eindeutige OID, sofern die Tabelle nicht mit der Option WITHOUT OIDS angelegt wurde. OIDs sind automatisch zugewiesene 4-Byte-Integer, die innerhalb der gesamten Datenbank einmalig sind. Allerdings laufen sie bei einem Wert von ungefähr 4 Milliarden über. PostgreSQL verwendet OIDs, um&lt;br /&gt;
seine interne Systemtabellen zu verbinden.&lt;br /&gt;
&lt;br /&gt;
Um einmalige Idenfikatoren in Datentabellen zu erstellen, wird allerdings empfohlen, statt OIDs Werte zu verwenden, die von SERIAL-Sequenzen erzeugt werden. SERIAL-Sequenzen sind innerhalb einer Tabelle einmalig und daher weniger anfällig für Überläufe. Außerdem können 8-Byte-Sequenzwerte mit BIGSERIAL (SERIAL8) erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein CTID? ===&lt;br /&gt;
&lt;br /&gt;
CTIDs werden benutzt, um bestimmte physikalische Zeilen durch Block und Offset Werte zu identifizieren. CTIDs verändern sich, sobald Zeilen verändert oder zurückgeladen werden. Sie werden in Indexeinträgen benutzt um auf die physikalischen Zeilen zu zeigen.&lt;br /&gt;
&lt;br /&gt;
=== Wieso bekomme ich einen Fehler: &amp;quot;ERROR: Memory exhausted in AllocSetAlloc()&amp;quot;? ===&lt;br /&gt;
  &lt;br /&gt;
Wahrscheinlich gibt es keinen virtuellen Speicher mehr in Ihrem System&lt;br /&gt;
oder Ihr Kernel hat niedrige Höchstgrenzen für bestimmte Ressourcen.&lt;br /&gt;
Probieren Sie vor dem Start von postmaster folgendes:&lt;br /&gt;
   ulimit -d 262144&lt;br /&gt;
   limit datasize 256m&lt;br /&gt;
&lt;br /&gt;
Je nach benutzter Shell wird nur einer dieser Befehle erfolgreich&lt;br /&gt;
ausgeführt werden. Auf jedem Fall wird die Grenze des Datensegments&lt;br /&gt;
für Prozesse erhöht werden und eventuell die erfolgreiche Ausführung&lt;br /&gt;
der Abfrage ermöglichen. Falls Sie ein Problem mit dem SQL-Client&lt;br /&gt;
haben, weil das Backend zu viele Daten zurückliefert, versuchen Sie&lt;br /&gt;
dies vor dem Start des SQL-Clients.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft? ===&lt;br /&gt;
  &lt;br /&gt;
Geben Sie in psql SELECT VERSION(); ein.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine Spalte erstellen, deren Default-Wert immer die aktuelle Uhrzeit enthalten soll? ===&lt;br /&gt;
  &lt;br /&gt;
Dazu verwenden Sie CURRENT_TIMESTAMP:&lt;br /&gt;
   CREATE TABLE test (x INT, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );&lt;br /&gt;
&lt;br /&gt;
=== Wie führe ich eine OUTER JOIN durch? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt OUTER JOINs nach dem SQL- Standardsyntax. Hier&lt;br /&gt;
zwei Beispiele:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 ON (t1.spalte = t2.spalte)&lt;br /&gt;
&lt;br /&gt;
bzw.:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 USING (spalte)&lt;br /&gt;
&lt;br /&gt;
Diese identischen Abfragen verknüpfen tabelle_1 mit tabelle_2 über die&lt;br /&gt;
Spalte 'spalte' und geben außerdem alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_1 (diejenigen, die keine Entsprechung in tabelle_2 haben)&lt;br /&gt;
zurück. Ein RIGHT JOIN würde hingegen alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_2 hinzufügen und ein FULL JOIN würde alle verknüpften Zeilen&lt;br /&gt;
sowie jeweils alle unverknüpften Zeilen aus den beiden Tabellen&lt;br /&gt;
zurückliefern. Die Angabe von OUTER ist nicht zwingend und kann in&lt;br /&gt;
LEFT, RIGHT und FULL-Verknüpfungen weggelassen werden. Normale&lt;br /&gt;
Verknüpfungen sind INNER JOINs.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt keinen Weg, innerhalb einer Abfrage auf mehr als eine&lt;br /&gt;
Datenbank zuzugreifen. Da PostgreSQL datenbank-spezifische&lt;br /&gt;
Systemkataloge lädt, ist eine datenbankübergreifende Abfrage nicht&lt;br /&gt;
möglich.&lt;br /&gt;
&lt;br /&gt;
contrib/dblink ist eine Erweiterung, die datenbankübergreifende&lt;br /&gt;
Abfragen über Funktionsaufrufe ermöglicht.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion zurückgeben lassen? ===&lt;br /&gt;
  &lt;br /&gt;
Funktionen können mehrere Zeilen und Spalten zurückgeben, vgl.:&lt;br /&gt;
http://www.postgresql.org/docs/techdocs.17.&lt;br /&gt;
&lt;br /&gt;
=== Warum bekomme ich eine Fehlermeldung wie &amp;quot;relation with OID ##### does not exist&amp;quot; wenn ich temporäre Tabellen in PL/PgSQL-Funktionen benutze? ===&lt;br /&gt;
  &lt;br /&gt;
In PostgreSQL-Versionen vor 8.3 verarbeitet PL/PgSQL Funktionen in&lt;br /&gt;
einer Cache. Dies hat eine unangenehme Nebenwirkung, nämlich dass wenn&lt;br /&gt;
eine PL/PgSQL-Funktion auf eine temporäre Tabelle zugreift, und diese&lt;br /&gt;
Tabelle anschließend gelöscht bzw. neu erstellt wird, die Funktion&lt;br /&gt;
fehlschlagen wird, da die gecachten Funktionsinhalte noch auf die alte&lt;br /&gt;
temporäre Tabelle zeigen. Die Lösung für diese Probleme besteht darin,&lt;br /&gt;
in der PL/PgSQL- Funktion mittels EXECUTE auf temporäre Tabellen&lt;br /&gt;
zuzugreifen. Dies bewirkt, dass bei jedem Funktionsruf die betreffende&lt;br /&gt;
Abfrage neu geparst wird.&lt;br /&gt;
&lt;br /&gt;
Dieses Problem taucht in PostgreSQL 8.3 und späteren Versionen nicht&lt;br /&gt;
mehr auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Replikationslösungen gibt es? ===&lt;br /&gt;
  &lt;br /&gt;
Der Begriff &amp;quot;replikation&amp;quot; umfasst mehrere verschiedene Technologien,&lt;br /&gt;
jede mit eigenen Vor- und Nachteilen. [http://www.postgresql.org/docs/8.3/static/high-availability.html Die Dokumentation enthält eine gute Einführung in das Thema Replikation]&lt;br /&gt;
&lt;br /&gt;
Mit &amp;quot;Master/slave&amp;quot;-Replikation werden Änderungen in einer&lt;br /&gt;
Hauptdatenbank durchgeführt und an &amp;quot;Sklaven&amp;quot; verteilt, die im&lt;br /&gt;
Nur-Lese-Modus arbeiten. Die populärste Lösung für PostgreSQL ist&lt;br /&gt;
Slony-I.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Multi-master replication&amp;quot; ermöglicht sowohl lesende als auch&lt;br /&gt;
schreibende Zugriffe über mehrere Datenbank-Server hinweg. Allerdings&lt;br /&gt;
hat diese Art von Replikation eine negative Auswirkung auf die&lt;br /&gt;
Performanz durch die Notwendigkeit, Änderungen zwischen Servern zu&lt;br /&gt;
synchronisieren. Pgcluster ist die populärste freie Lösung für&lt;br /&gt;
PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einige kommerzielle und hardware-basierte&lt;br /&gt;
Replikationslösungen für verschiedene Arten der Replikation.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Tabellen- und Spaltennamen in meiner Abfrage nicht erkannt? Warum werden Großbuchstaben umgewandelt? ===&lt;br /&gt;
  &lt;br /&gt;
Die häufigste Ursache ist die Verwendung von Gänsefüßchen bei der&lt;br /&gt;
Anlegung von Tabellen, z.B.:&lt;br /&gt;
    CREATE TABLE &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
                (&amp;quot;SPALTE1&amp;quot; INT)&lt;br /&gt;
&lt;br /&gt;
Dadurch werden Tabellen- und Spaltennamen (sog. Identifikatoren) in&lt;br /&gt;
genau der Schreibweise gespeichert (vgl. Dokumentation), was dazu&lt;br /&gt;
führt, dass man sie danach immer in Gänsefüßchen angeben muss. Im&lt;br /&gt;
obigen Beispiel muss man also immer etwa SELECT * FROM &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
verwenden. Um dieses Problem zu vermeiden, müssen Sie immer eines der&lt;br /&gt;
folgenden Punkte beachten:&lt;br /&gt;
&lt;br /&gt;
* bei der Tabellenanlegung keine Gänsefüßchen verwenden;&lt;br /&gt;
* in Identifikatoren nur Kleinschreibung verwenden;&lt;br /&gt;
* immer Identifikatoren mit Gänsefüßchen versehen&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen des Übersetzers ==&lt;br /&gt;
  &lt;br /&gt;
Die englische Vorlage dieser FAQ wird ständig überarbeitet. Daher&lt;br /&gt;
liegt die Übersetzung nicht immer auf dem aktuellsten Stand.&lt;br /&gt;
&lt;br /&gt;
Die aktuellste Version der deutschen Übersetzung befindet sich immer&lt;br /&gt;
unter http://sql-info.de/postgresql/FAQ_german.html. Diese&lt;br /&gt;
&amp;quot;Arbeitsversion&amp;quot; enthält eventuell Änderungen, die noch nicht auf der&lt;br /&gt;
PostgreSQL-Website eingebunden worden sind.&lt;br /&gt;
&lt;br /&gt;
Über Verbesserungshinweise und Korrekturvorschläge sowie&lt;br /&gt;
Verständnisfragen zum Inhalt der FAQ freue ich mich. Ich nehme auch&lt;br /&gt;
allgemeine Fragen zu PostgreSQL gerne entgegen, verweise jedoch auf&lt;br /&gt;
die Mailing-Listen als schnelle und zuverlässige Anlaufstellen.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/FAQ/de</id>
		<title>FAQ/de</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/FAQ/de"/>
				<updated>2011-12-06T18:41:51Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;/* Welche Replikationslösungen gibt es? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Was ist PostgreSQL? Wie wird es ausgesprochen? ===&lt;br /&gt;
  &lt;br /&gt;
Die (englische) Aussprache ist &amp;quot;Post-Gres-Q-L&amp;quot;. Im allgemeinen&lt;br /&gt;
Sprachgebrauch hat sich die Kurzform &amp;quot;Postgres&amp;quot; auch durchgesetzt.&lt;br /&gt;
(Für diejenigen, die es interessiert: eine MP3-Datei mit der&lt;br /&gt;
amerikanischen Aussprache befindet sich hier:&lt;br /&gt;
http://www.postgresql.org/files/postgresql.mp3&lt;br /&gt;
&lt;br /&gt;
PostgreSQL ist ein objektrelationales Datenbanksystem, das die Vorzüge&lt;br /&gt;
von kommerziellen Datenbanksystemen mit zukunftsweisenden Innovationen&lt;br /&gt;
kombiniert. PostgreSQL ist freie Software und dessen kompletter&lt;br /&gt;
Quellcode ist öffentlich verfügbar.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Entwicklung wird von einem Team von meist freiwilligen&lt;br /&gt;
Entwicklern durchgeführt. Dieses Team ist für die Gesamtentwicklung&lt;br /&gt;
von PostgreSQL verantwortlich. Es handelt sich um ein&lt;br /&gt;
Gemeinschaftsprojekt, das nicht von einer bestimmten Firma&lt;br /&gt;
kontrolliert wird. Lesen Sie die Entwickler-FAQ:&lt;br /&gt;
http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn Sie an einer&lt;br /&gt;
Mitarbeit interessiert sind.&lt;br /&gt;
&lt;br /&gt;
=== Wer kontrolliert PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Falls Sie nach dem Namen eines etwaigen Inhabers bzw. nach einem&lt;br /&gt;
allmächtigen Zentralkommittee suchen - sparen Sie sich die Mühe, sowas&lt;br /&gt;
existiert gar nicht. Es gibt zwar das &amp;quot;Core Committee&amp;quot; sowie&lt;br /&gt;
Entwickler, die CVS-Schreibberechtigung haben, jedoch haben diese&lt;br /&gt;
Gruppen eher nur eine administrative Rolle. Das Projekt wird durch die&lt;br /&gt;
Community gesteuert, die aus den Entwicklern sowie natürlich auch den&lt;br /&gt;
Nutzern besteht - jeder kann daran teilnehmen. (Lesen Sie die&lt;br /&gt;
Entwickler-FAQ: http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn&lt;br /&gt;
Sie an der PostgreSQL-Entwicklung teilnehmen möchten).&lt;br /&gt;
&lt;br /&gt;
=== Welchem Copyright unterliegt PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL wird unter der klassischen BSD-Lizenz herausgegeben. Im&lt;br /&gt;
Grunde genommen erlaubt diese den Nutzern, beliebig mit dem Code&lt;br /&gt;
umzugehen, auch der Weiterverkauf von Binärversionen ohne Quellcode&lt;br /&gt;
ist erlaubt. Die einzige Einschränkung besteht darin, dass PostgreSQL&lt;br /&gt;
auf keinen Fall für etwaige Probleme mit der Software haftet. Außerdem&lt;br /&gt;
muß der Copyright- Text in allen Kopien der Software enthalten sein.&lt;br /&gt;
Dies ist der Originaltext der BSD-Lizenz:&lt;br /&gt;
 &lt;br /&gt;
 PostgreSQL Data Base Management System&lt;br /&gt;
 &lt;br /&gt;
 Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group&lt;br /&gt;
 Portions Copyright (c) 1994-6 Regents of the University of California&lt;br /&gt;
 &lt;br /&gt;
 Permission to use, copy, modify, and distribute this software and its&lt;br /&gt;
 documentation for any purpose, without fee, and without a written&lt;br /&gt;
 agreement is hereby granted, provided that the above copyright notice&lt;br /&gt;
 and this paragraph and the following two paragraphs appear in all&lt;br /&gt;
 copies.&lt;br /&gt;
 &lt;br /&gt;
 IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY&lt;br /&gt;
 FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,&lt;br /&gt;
 INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND&lt;br /&gt;
 ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN&lt;br /&gt;
 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 &lt;br /&gt;
 THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,&lt;br /&gt;
 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF&lt;br /&gt;
 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE&lt;br /&gt;
 PROVIDED HEREUNDER IS ON AN &amp;quot;AS IS&amp;quot; BASIS, AND THE UNIVERSITY OF&lt;br /&gt;
 CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,&lt;br /&gt;
 UPDATES, ENHANCEMENTS, OR MODIFICATIONS.&lt;br /&gt;
&lt;br /&gt;
Es gilt die Copyright-Klausel im Original!&lt;br /&gt;
&lt;br /&gt;
=== Auf welchen Plattformen läuft PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Normalerweise kann PostgreSQL auf jeder modernen UNIX-kompatiblen&lt;br /&gt;
Plattform eingesetzt werden. Diejenigen Plattformen, die bei der&lt;br /&gt;
jeweiligen Versionsfreigabe getestet wurden, sind in den&lt;br /&gt;
Installationsanleitungen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
PostgreSQL läuft auch auf Microsoft NT-basierten Betriebssystemen wie&lt;br /&gt;
Windows 2000 SP4, XP und Server 2003. Ein vorgefertigtes&lt;br /&gt;
Installationspaket kann von http://pgfoundry.org/projects/pginstaller&lt;br /&gt;
heruntergeladen werden. DOS-basierte Windows-Versionen (Win95, Win98,&lt;br /&gt;
WinMe) können PostgreSQL nur mit Hilfe der Cygwin-Umgebung ausführen.&lt;br /&gt;
&lt;br /&gt;
=== Woher bekomme ich PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Per Web-Browser hier: http://www.postgresql.org/ftp/ und per FTP hier:&lt;br /&gt;
ftp://ftp.postgresql.org/pub/.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die neueste Version von PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die neueste Version von PostgreSQL kann auf der [http://www.postgresql.org/ Website] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Die Freigabe einer neuen Hauptversion erfolgt in der Regel jährlich, kleinere Korrekturversionen alle paar Monaten. Die kleineren Updates werden &amp;quot;Minor&amp;quot;-Updates, die großen jährlich erscheinenden &amp;quot;Major&amp;quot;-Updates genannt. &amp;quot;Minor&amp;quot;-Update erscheinen in der Regel gleichzeitig für alle unterstützten &amp;quot;Major&amp;quot;-Versionen. [http://www.postgresql.org/support/versioning Falls Sie dieses Thema interessiert sollten Sie hier weiterlesen.]&lt;br /&gt;
&lt;br /&gt;
=== Wo bekomme ich Support für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Community bietet Unterstützung per Mailing-Liste. Die&lt;br /&gt;
Web-Seite http://www.postgresql.org/community/lists/ bietet einen&lt;br /&gt;
Überblick. Die Listen general und bugs bieten einen guten Einstieg.&lt;br /&gt;
&lt;br /&gt;
Eine deutschsprachige Mailing-Liste gibt es hier:&lt;br /&gt;
http://archives.postgresql.org/pgsql-de-allgemein/.&lt;br /&gt;
&lt;br /&gt;
Der wichtigsten IRC-Channel ist #postgresql auf Freenode&lt;br /&gt;
(irc.freenode.net). Unter UNIX/Linux können Sie mit z.B. irc -c&lt;br /&gt;
'#postgresql' &amp;quot;$USER&amp;quot; irc.freenode.net. daran teilnehmen. Auf Freenode&lt;br /&gt;
gibt es folgende Channels:&lt;br /&gt;
* #postgresql-es (spanisch)&lt;br /&gt;
* #postgresqlfr (französischen)&lt;br /&gt;
* #postgresql-br (brasilianischen) &lt;br /&gt;
&lt;br /&gt;
Es gibt außerdem einen PostgreSQL-Channel bei EFNet.&lt;br /&gt;
&lt;br /&gt;
Eine Liste von Unternehmen, die Support für PostgreSQL auf kommerzieller Basis leisten, kann unter http://www.postgresql.org/support/professional_support eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich einen Fehlerbericht abgeben? ===&lt;br /&gt;
  &lt;br /&gt;
Nutzen Sie das Formular unter&lt;br /&gt;
http://www.postgresql.org/support/submitbug. Schauen Sie aber vorher&lt;br /&gt;
unter ftp://ftp.postgresql.org/pub/ nach, ob es mittlerweile eine&lt;br /&gt;
neuere PostgreSQL-Version gibt, in der der Fehler behoben wurde.&lt;br /&gt;
&lt;br /&gt;
Bugs, die über das Formular bzw. eine der Mailing-Listen&lt;br /&gt;
bekanntgegeben wurden, erhalten typischerweise einer der folgenden&lt;br /&gt;
Reaktionen:&lt;br /&gt;
&lt;br /&gt;
* es ist kein Bug, der Grund wird benannt&lt;br /&gt;
* es ist ein bereits bekannter Bug, der bereits auf der TODO-Liste aufgenommen wurde&lt;br /&gt;
* der Bug wurde in der aktuellen Version behoben&lt;br /&gt;
* der Bug wurde bereits behoben, befindet sich aber noch nicht in einer offiziell veröffentlichten Version&lt;br /&gt;
* es wird um eingehendere Informationen gebeten, z.B.:&lt;br /&gt;
** Betriebssystem&lt;br /&gt;
** PostgreSQL-Version&lt;br /&gt;
** reproduzierbares Fallbeispiel&lt;br /&gt;
** Debugging-Information&lt;br /&gt;
** Debugger-Backtrace-Ausgabe&lt;br /&gt;
* der Bug ist neu. Folgendes könnte passieren:&lt;br /&gt;
** ein Patch wird erstellt und in der nächsten Version eingebaut&lt;br /&gt;
** der Bug kann nicht sofort behoben werden und wird auf die TODO-Liste gesetzt&lt;br /&gt;
    &lt;br /&gt;
=== Wie erfahre ich von bekannten Bugs oder fehlenden Features? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt eine erweiterte Teilmenge von SQL:2003. Siehe&lt;br /&gt;
unsere TODO-Liste unter http://www.postgresql.org/docs/faqs.TODO.html&lt;br /&gt;
für eine Auflistung der bekannten Bugs, fehlenden Features und&lt;br /&gt;
zukünftigen Pläne.&lt;br /&gt;
&lt;br /&gt;
Eine Anfrage nach einem neuen Feature führt normalerweise zu einer der&lt;br /&gt;
folgenden Antworten:&lt;br /&gt;
&lt;br /&gt;
* das Feature ist bereits auf der TODO-Liste&lt;br /&gt;
* das Feature ist nicht wünschenswert, weil:&lt;br /&gt;
** es vorhandene Funktionalität dupliziert, welche bereits dem SQL-Standard folgt&lt;br /&gt;
** es würde die Komplexität der Code-Basis erhöhen, ohne nennenswerte Vorteile zu bringen&lt;br /&gt;
** es wäre unsicher bzw. unzuverlässig&lt;br /&gt;
* das neue Feature wird der TODO-Liste hinzugefügt&lt;br /&gt;
    &lt;br /&gt;
PostgreSQL verwendet kein Bugtracking-System, da es sich als effizienter erwiesen hat, E-Mails direkt zu beantworten und die TODO-Liste aktuell zu halten. In der Praxis werden Bugs sehr schnell beseitigt, und diejenigen Bugs, die Auswirkungen auf eine große Anzahl von Nutzern haben, werden meist kurzfristig korrigiert. Der einzige Überblick über alle Änderungen, Verbesserungen und Korrekturen in einer PostgreSQL-Version befindet sich in den CVS-Log-Meldungen. Auch die Release-Notes listen nicht jede Änderung in der Software auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Dokumentation ist für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet umfangreiche Dokumentation, darunter ein großes&lt;br /&gt;
Handbuch, man-Pages und einige kleine Testprogramme. Siehe das /doc-&lt;br /&gt;
Verzeichnis. Ausserdem sind alle Handbücher online unter&lt;br /&gt;
http://www.postgresql.org/docs/ verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Bücher zu PostgreSQL sind online verfügbar unter&lt;br /&gt;
http://www.postgresql.org/docs/books/awbook.html und&lt;br /&gt;
http://www.commandprompt.com/ppbook/ .&lt;br /&gt;
&lt;br /&gt;
Eine Liste lieferbarer PostgreSQL-Bücher befindet sich unter&lt;br /&gt;
http://www.postgresql.org/docs/books Diverse technische Artikel&lt;br /&gt;
befinden sich unter http://www.postgresql.org/docs/techdocs .&lt;br /&gt;
&lt;br /&gt;
psql hat einige nützliche \d-Befehle, um Informationen über Typen,&lt;br /&gt;
Operatoren, Funktionen, Aggregate, usw. zu zeigen.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Website enthält noch mehr Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich SQL lernen? ===&lt;br /&gt;
  &lt;br /&gt;
Die oben erwähnten PostgreSQL-spezifische Bücher bieten einen guten&lt;br /&gt;
Einstieg. Viele PostgreSQL-Anwender mögen &amp;quot;The Practical SQL Handbook&amp;quot;&lt;br /&gt;
(Bowman et al., Addison Wesley). Andere dagegen mögen &amp;quot;The Complete&lt;br /&gt;
Reference SQL&amp;quot; (Groff et al., McGraw-Hill).&lt;br /&gt;
&lt;br /&gt;
Es gibt ausserdem einige nützliche Online-Tutorials:&lt;br /&gt;
&lt;br /&gt;
* http://www.intermedia.net/support/sql/sqltut.shtm&lt;br /&gt;
* http://sqlcourse.com&lt;br /&gt;
* http://www.w3schools.com/sql/default.asp&lt;br /&gt;
* http://mysite.verizon.net/Graeme_Birchall/id1.html&lt;br /&gt;
    &lt;br /&gt;
=== Wie kann ich im Entwicklerteam mitarbeiten? ===&lt;br /&gt;
  &lt;br /&gt;
Lesen Sie in der Entwickler-FAQ unter&lt;br /&gt;
[[Developer_FAQ | Developer FAQ]] nach.&lt;br /&gt;
&lt;br /&gt;
=== Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt verschiedene Methoden, Software zu messen: Eigenschaften,&lt;br /&gt;
Performanz, Zuverlässigkeit, Support und Preis.&lt;br /&gt;
&lt;br /&gt;
==== Eigenschaften ====&lt;br /&gt;
&lt;br /&gt;
       PostgreSQL besitzt die meisten Eigenschaften - wie&lt;br /&gt;
       Transaktionen, Unterabfragen (Subqueries), Trigger, Views,&lt;br /&gt;
       referenzielle Integrität bei Fremdschlüsseln und verfeinertes&lt;br /&gt;
       Locking - die bei großen kommerziellen DBMS vorhanden sind. Es&lt;br /&gt;
       bietet außerdem einige anderen Eigenschaften, die diese nicht&lt;br /&gt;
       immer haben, wie benutzerbestimmte Typen, Vererbung, Regeln,&lt;br /&gt;
       und die Multi-Versionen-Steuerung zum Verringern&lt;br /&gt;
       konkurrierender Locks.&lt;br /&gt;
       &lt;br /&gt;
==== Performanz ====&lt;br /&gt;
       Die Performanz von PostgreSQL ist mit der von kommerziellen und&lt;br /&gt;
       anderen Open-Source-Datenbanken vergleichbar. In manchen&lt;br /&gt;
       Bereichen ist es schneller, in anderen langsamer. In der Regel&lt;br /&gt;
       beträgt der Unterschied +/-10%.&lt;br /&gt;
       &lt;br /&gt;
==== Zuverlässigkeit ====&lt;br /&gt;
       Es ist selbstredend, dass ein DBMS wertlos ist, wenn es nicht&lt;br /&gt;
       zuverlässig arbeitet. Daher bemühen wir uns, nur streng&lt;br /&gt;
       geprüften und beständigen Code freizugeben, der nur ein Minimum&lt;br /&gt;
       an Programmfehlern aufweist. Jede Freigabe hat mindestens einen&lt;br /&gt;
       Monat Betatest-Phase hinter sich, und unsere Freigabehistorie&lt;br /&gt;
       beweist, dass wir stabile und solide Versionen freigeben, die&lt;br /&gt;
       im Produktionsbetrieb genutzt werden können. Wir glauben, dass&lt;br /&gt;
       wir im Vergleich mit anderer Datenbanksoftware vorteilhaft&lt;br /&gt;
       dastehen.&lt;br /&gt;
       &lt;br /&gt;
==== Support ====&lt;br /&gt;
       Unsere Mailinglisten bieten die Möglichkeit, gemeinsam mit&lt;br /&gt;
       einer großen Gruppe von Entwicklern und Benutzern mögliche&lt;br /&gt;
       Probleme zu lösen. Wir können nicht immer eine Fehlerbehebung&lt;br /&gt;
       garantieren, kommerzielle DBMS tun dies aber auch nicht. Der&lt;br /&gt;
       direkte Kontakt zur Entwickler- und Benutzergemeinschaft und&lt;br /&gt;
       der Zugriff auf die Handbücher und den Quellcode ermöglicht&lt;br /&gt;
       einen im Vergleich zu anderen DBMS höherwertigeren Support. Es&lt;br /&gt;
       gibt jedoch auch Anbieter von kommerziellen Support-Leistungen&lt;br /&gt;
       (siehe FAQ-Punkt 1.7).&lt;br /&gt;
       &lt;br /&gt;
==== Preis ====&lt;br /&gt;
       PostgreSQL ist frei verfügbar, sowohl für die kommerzielle wie&lt;br /&gt;
       auch für die nicht-kommerzielle Nutzung. Sie können den&lt;br /&gt;
       PostgreSQL-Code ohne Einschränkungen (außer denjenigen, die in&lt;br /&gt;
       der oben angegebene BSD-artigen Lizenz erwähnt werden) in Ihr&lt;br /&gt;
       Produkt integrieren.&lt;br /&gt;
&lt;br /&gt;
=== Kann PostgreSQL eingebettet (embedded) werden? ===&lt;br /&gt;
PostgreSQL basiert auf einer Server/Client-Architektur, diese benötigt separate Prozesse für jeden Klient und Server, hinzukommen auch noch weitere &amp;quot;Helfer-Prozesse&amp;quot; (z. B. für autovacuum und stats-collector). Zwar können einige &amp;quot;embedded-Architekturen&amp;quot; diese Anforderungen erfüllen, aber wenn der Datenbank-Prozess innerhalb des Applikations-Prozesses laufen muss, kann PostgreSQL nicht verwendet werden. Dazu sollte man leichtere Datenbanken nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mich von einer Maillingliste abmelden? Wie verhindere ich es, dass ich doppelte E-Mails bekomme? ===&lt;br /&gt;
Majordomo ermöglicht es sich von allen Maillinglisten an- und abzumelden, ggf. müssen Sie sich zuerst ihr Majordomo-Passwort zuschicken lassen.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Maillinglisten sind so konfiguriert, dass Antworten an den ursprünglichen Autor und an die Maillingliste verschickt werden. Somit soll erreicht werden dass Benutzer immer schnellstmöglichst eine Antwort erhalten können. Diese Einstellungen können Sie auch über die Konfiguration von Majordomo ändern, ändern Sie dafür die Einstellung für ''eliminatecc''. Sie können auch einstellen dass Sie selbst keine Antwort auf Ihre eigenen E-Mails bekommen, ändern sie dafür die Einstellung für ''selfcopy''.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
&lt;br /&gt;
== Fragen zu Benutzerprogrammen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Welche Schnittstellen gibt es für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Installation stellt nur Schnittstellen für C und&lt;br /&gt;
Embedded C bereit. Alle weitere Schnittstellen sind unabhängige&lt;br /&gt;
Projekte, die einzeln heruntergeladen werden werden müssen. Diese&lt;br /&gt;
Trennung ermöglicht individuelle Entwickler-Teams und&lt;br /&gt;
Entwicklungszyklen für die jeweiligen Projekte.&lt;br /&gt;
&lt;br /&gt;
Einige Programmiersprachen wie PHP haben eine PostgreSQL-&lt;br /&gt;
Schnittstelle bereits eingebaut. Schnittstellen für Sprachen wie Perl,&lt;br /&gt;
TCL, Python und viele anderen sind unter http://gborg.postgresql.org&lt;br /&gt;
im Bereich Drivers/Interfaces verfügbar sowie per Internet-Suche.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann man PostgreSQL in einer Website nutzen? ===&lt;br /&gt;
  &lt;br /&gt;
Eine nette Einführung zu datenbank-gestützten Webseiten kann unter&lt;br /&gt;
http://www.webreview.com (engl.) eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Für die Web-Integration ist PHP eine ausgezeichnete Schnittstelle. PHP&lt;br /&gt;
gibt es bei http://www.php.net&lt;br /&gt;
&lt;br /&gt;
Desweiteren bietet sich die Perl-Schnittstelle mit CGI.pm&lt;br /&gt;
oder mod_perl auch an.&lt;br /&gt;
&lt;br /&gt;
=== Hat PostgreSQL eine grafische Benutzerschnittstelle? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt eine große Anzahl von GUI-Programmen für PostgreSQL - sowohl&lt;br /&gt;
kommerziell als auch Open-Source. [http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools Eine englische Liste befindet sich hier.]&lt;br /&gt;
&lt;br /&gt;
== Administrative Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql? ===&lt;br /&gt;
  &lt;br /&gt;
Bei der Ausführung von configure die Option --prefix mit dem Zielverzeichnis angeben.&lt;br /&gt;
&lt;br /&gt;
=== Wie regle ich Zugriffe von anderen Rechnern? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL ist standardmäßig so eingestellt, dass Verbindungen nur vom&lt;br /&gt;
lokalen Rechner über Unix Domain Sockets bzw. TCP/IP möglich sind.&lt;br /&gt;
Verbindungen von anderen Rechnern werden erst dann ermöglicht, wenn&lt;br /&gt;
Sie in der Datei postgresql.conf die Einstellung listen_addresses&lt;br /&gt;
anpassen, in der Datei $PGDATA/pg_hba.conf host-basierte&lt;br /&gt;
Authentifizierung einschalten und den Server neu starten.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine bessere Performanz erreichen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt drei große Bereiche, in denen Performanzverbesserungen erzielt&lt;br /&gt;
werden können:&lt;br /&gt;
&lt;br /&gt;
==== Abfrageoptimierung ====&lt;br /&gt;
Die Modifizierung von Abfragen kann eine bessere Performanz erzielen:&lt;br /&gt;
       &lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/indexes.html Erstellung von Indexen, einschliesslich partieller Indexe sowie Expressionsindexe]&lt;br /&gt;
* Einsatz von COPY anstelle multipler INSERT-Anweisungen&lt;br /&gt;
* Gruppierung von mehreren Abfragen innerhalb einer Transaktion, um Aufwand beim Abschluss von Transaktionen    einzusparen&lt;br /&gt;
* Einsatz von CLUSTER beim Holen von einer großen Anzahl von Datenreihen aus einem Index&lt;br /&gt;
* Einsatz von LIMIT, um eine Untermenge der Abfragenergebnisse zurückzuliefern&lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/sql-prepare.html Einsatz von vorbereiteten Befehlen (prepared queries)]&lt;br /&gt;
* Einsatz von ANALYZE, um die Datenbankstatistik für den Abfragenplaner aktuell zu halten&lt;br /&gt;
* [http://www.postgresql.org/docs/current/static/routine-vacuuming.html Regelmäßiger Einsatz von VACUUM bzw. pg_autovacuum (autovacuum ist seit Version 8.3 standardmäßig aktiviert)]&lt;br /&gt;
* Bei großen Datenveränderungen die Löschung von Indexen&lt;br /&gt;
&lt;br /&gt;
==== Server-Konfiguration ====&lt;br /&gt;
Einige Einstellungen in der Datei postgresql.conf wirken sich auf die Performanz aus. Das Handbuch enthält unter      http://www.postgresql.org/docs/current/static/runtime-config.html eine komplette Auflistung. &lt;br /&gt;
&lt;br /&gt;
Kommentare zu den jeweiligen Einstellungen gibt es unter http://www.varlena.com/varlena/GeneralBits/Tidbitsannotated_conf_e.html und http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.&lt;br /&gt;
       &lt;br /&gt;
==== Hardware-Auswahl ====&lt;br /&gt;
Die Auswirkung von Hardware auf Performanz wird unter http://momjian.us/main/writings/pgsql/hw_performance/index.html und http://www.powerpostgresql.com/PerfList/ erläutert.&lt;br /&gt;
       &lt;br /&gt;
=== Welche Debugging-Funktionen sind für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
Unter den Optionen für die Server-Konfigurierung gibt es zahlreiche&lt;br /&gt;
log_*-Variablen, die die Ausgabe von Abfrage- und Prozessstatistiken&lt;br /&gt;
ermöglichen. Diese können für Debugging-Zwecke sowie Performanz-Tests&lt;br /&gt;
sehr nützlich sein.&lt;br /&gt;
&lt;br /&gt;
=== Ich bekomme die Meldung &amp;quot;Sorry, too many clients&amp;quot;, wenn ich eine Verbindung aufzubauen versuche. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Ihr System hat die maximal zulässige Anzahl von Datenbankverbindungen&lt;br /&gt;
erreicht (Voreinstellung 100). Sie müssen die maximale Anzahl der&lt;br /&gt;
gleichzeitig ausführbaren Backend-Prozesse hochsetzen, indem Sie in&lt;br /&gt;
postgresql.conf den Wert max_connections ändern und den Server&lt;br /&gt;
neustarten.&lt;br /&gt;
&lt;br /&gt;
=== Wie wird PostgreSQL aktualisiert? ===&lt;br /&gt;
  &lt;br /&gt;
Allgemeine Informationen zur Aktualisierung von PostgreSQL gibt es auf&lt;br /&gt;
der Seite http://www.postgresql.org/support/versioning. Detaillierte&lt;br /&gt;
technische Informationen gibt es auf der Seite&lt;br /&gt;
http://www.postgresql.org/docs/current/static/install-upgrading.html&lt;br /&gt;
&lt;br /&gt;
=== Kommt PostgreSQL mit den Anpassungen der Sommerzeit in verschiedenen Ländern klar? ===&lt;br /&gt;
  &lt;br /&gt;
Für die Berücksichtigung der Sommerzeit verwendet PostgreSQL Seit dem Release 8.0 die weiterverbreitete tzdata-Datenbank (auch bekannt als &amp;quot;zoneinfo database&amp;quot; oder &amp;quot;[http://www.twinsun.com/tz/tz-link.htm Olzen timezone database]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jedes Update von PostgreSQL beinhaltet die aktuellen tzdata Dateien, daher sollte es reichen die Minor-Updates der eingesetzten Major Version im Auge zu behalten.&lt;br /&gt;
&lt;br /&gt;
Unter der Vorraussetzung dass das Betriebssystem diese Dateien schon in einer stets aktuellen Version vorbehält, ist es üblich, dass man diese Dateien verwendet. PostgreSQL bietet dazu eine compile-option an.&lt;br /&gt;
&lt;br /&gt;
=== Welche Hardware eignet sich für den Betrieb mit PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL läuft auf fast jeder Hardware-Kombination. Im PC-Bereich&lt;br /&gt;
gibt es allerdings sehr große Abweichungen in der Qualität. Für einen&lt;br /&gt;
Arbeitsplatz- oder Entwicklungsrechner mag dies nicht so bedeutend&lt;br /&gt;
sein, im Server-Betrieb jedoch lohnt sich auf jeden Fall die&lt;br /&gt;
Investition in teurere Bestandteile (Stichwörter ECC-Speicher, SCSI,&lt;br /&gt;
Hauptplatinen und Netzteile von namhaften Herstellern). Nutzen Sie&lt;br /&gt;
unsere Mailing-Listen, um Hardware-Optionen zu diskutieren.&lt;br /&gt;
&lt;br /&gt;
== Fragen zum Betrieb ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie wähle ich per SELECT-Anweisung nur die ersten paar Zeilen bzw. eine beliebige Zeile in einer Abfrage aus? ===&lt;br /&gt;
  &lt;br /&gt;
Wenn Sie bei der Ausführung der Abfrage die Anzahl der anzufordenden&lt;br /&gt;
Reihen bereits kennen, nutzen Sie LIMIT. Wenn die ORDER BY- Anweisung&lt;br /&gt;
mit einem Index verwendet wird, ist es möglich, dass die gesamte&lt;br /&gt;
Abfrage nicht ausgeführt werden muss. Wenn Sie die Anzahl der der&lt;br /&gt;
anzufordenden Reihen nicht kennen, verwenden Sie einen Cursor und&lt;br /&gt;
FETCH.&lt;br /&gt;
&lt;br /&gt;
Um eine beliebige Zeile auszuwählen, nutzen Sie ORDER BY random():&lt;br /&gt;
    SELECT spalte&lt;br /&gt;
      FROM tabelle&lt;br /&gt;
  ORDER BY random()&lt;br /&gt;
     LIMIT 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Wie finde ich heraus, welche Tabellen, Indexe, Datenbanken oder Benutzer in der Datenbank definiert sind? Wie bekomme ich die von psql verwendeten Abfragen? ===&lt;br /&gt;
  &lt;br /&gt;
In psql zeigt der Befehl \dt eine Liste der Datenbanktabellen. Weitere&lt;br /&gt;
psql-Befehle lassen sich mit \? anzeigen. Sie können sich die Datei&lt;br /&gt;
pgsql/src/bin/psql/describe.c mit dem Quellcode für psql ansehen. Sie&lt;br /&gt;
enthält die SQL-Abfragen, die die Backslash-Kommandos (\) ausführen.&lt;br /&gt;
Sie können psql auch mit der -E Option starten. Danach gibt psql die&lt;br /&gt;
Abfragen aus, die es bei der Ausführung der Befehle benutzt. Außerdem&lt;br /&gt;
biete PostgreSQL ein SQL-kompatibles INFORMATION SCHEMA, das&lt;br /&gt;
Metainformation über die Datenbank zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
Mit psql -l können Sie alle Datenbanken anzeigen lassen.&lt;br /&gt;
&lt;br /&gt;
Die Datei pgsql/src/tutorial/syscat.source enthält außerdem viele&lt;br /&gt;
SELECT- Abfragen, mit deren Hilfe man Information über die&lt;br /&gt;
Systemtabellen erhalten kann.&lt;br /&gt;
&lt;br /&gt;
=== Wie ändere ich den Datentyp einer Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Ab Version 8.0 kann der Datentyp einer Spalte mit ALTER TABLE ALTER&lt;br /&gt;
COLUMN TYPE geändert werden, sofern der neue Datentyp die Werte des&lt;br /&gt;
alten Datentype aufnehmen kann.&lt;br /&gt;
&lt;br /&gt;
Bei früheren Versionen gehen Sie wie folgt vor:&lt;br /&gt;
    BEGIN;&lt;br /&gt;
    ALTER TABLE tabelle ADD COLUMN neue_spalte neuer_datentyp;&lt;br /&gt;
    UPDATE tabelle SET neue_spalte = CAST(alte_spalte AS neuer_datentyp);&lt;br /&gt;
    ALTER TABLE tabelle DROP COLUMN alte_spalte;&lt;br /&gt;
    COMMIT;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Speicherplatz freizugeben, der von der gelöschten Spalte&lt;br /&gt;
verwendet wurde, führen Sie VACUUM FULL aus.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank? ===&lt;br /&gt;
  &lt;br /&gt;
Es bestehen folgende Obergrenzen:&lt;br /&gt;
 Maximale Größe eine Datenbank?           unbeschränkt (es existieren&lt;br /&gt;
                                            Datenbanken mit 32 TB)&lt;br /&gt;
 Maximale Größe einer Tabelle?            32 TB&lt;br /&gt;
 Maximale Größe einer Zeile?              400 GB&lt;br /&gt;
 Maximale Größe einer Spalte?             1 GB&lt;br /&gt;
 Maximale Anzahl von Zeilen in einer Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
 Maximale Anzahl von Spalten in einer Tabelle?&lt;br /&gt;
                                          250-1600 je nach Spaltentyp&lt;br /&gt;
 Maximale Anzahl von Indexen für eine Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich sind dies theoretische Werte, die oft durch die&lt;br /&gt;
verfügbaren Platten- und Speicherressourcen beschränkt werden. Extreme&lt;br /&gt;
Größen können zu Leistungseinbußen führen.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße von 32 TB benötigt keine&lt;br /&gt;
Large-File-Unterstützung im Betriebssystem. Große Tabellen werden in&lt;br /&gt;
Dateien mit einer Größe von je 1 GB aufgeteilt, wodurch etwaige&lt;br /&gt;
dateisystem-bedingte Beschränkungen nicht relevant sind.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße und die maximale Anzahl von Spalten können&lt;br /&gt;
vervierfacht werden, indem man die Default-Blockgröße auf 32 KB&lt;br /&gt;
heraufsetzt. Die Tabellengröße kann auch durch Tabellenpartitionierung&lt;br /&gt;
vergrößert werden.&lt;br /&gt;
&lt;br /&gt;
Eine Einschränkung ist, dass Indexe nur auf Spalten erstellt werden&lt;br /&gt;
können, die bis etwa 2.000 Zeichen groß sind. Um auf größere Spalten&lt;br /&gt;
eine UNIQUE-Constraint setzen zu können, nutzen Sie einen funktionalen&lt;br /&gt;
Index mit dem MD5-Hash-Wert der Spalte. Um innerhalb einer großen, mit&lt;br /&gt;
Text belegten Spalte suchen zu können, verwenden Sie einen&lt;br /&gt;
Volltext-Index.&lt;br /&gt;
&lt;br /&gt;
=== Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen Textdatei abzuspeichern? ===&lt;br /&gt;
  &lt;br /&gt;
Eine PostgreSQL-Datenbank kann beim Abspeichern einer einfachen&lt;br /&gt;
Textdatei bis zu fünfmal mehr Platz gegenüber der eigentlichen Größe&lt;br /&gt;
der Datei beanspruchen.&lt;br /&gt;
&lt;br /&gt;
Betrachten wir eine Datei mit 100.000 Zeilen mit einem Integer und&lt;br /&gt;
einer Textbeschreibung pro Zeile. Gehen wir davon aus, dass die&lt;br /&gt;
durchschnittliche Länge der Textbeschreibung 20 Byte beträgt. Die&lt;br /&gt;
einfache Datei würde 2,8 MB groß sein. Die Größe der&lt;br /&gt;
PostgreSQL-Datenbankdatei, die diese Daten enthält, liegt ungefähr bei&lt;br /&gt;
5,2 MB:&lt;br /&gt;
 24 Bytes: jeder Zeilenkopf (ungefähr)&lt;br /&gt;
+24 Bytes: ein Integer-Feld und ein Textfeld&lt;br /&gt;
+ 4 Bytes: Zeiger auf der Datenseite auf den Tupel&lt;br /&gt;
-----------------------------------------------&lt;br /&gt;
 52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
Die Größe einer Datenseite in PostgreSQL beträgt 8192 Bytes (8 KB),&lt;br /&gt;
also:&lt;br /&gt;
8192 Bytes pro Seite&lt;br /&gt;
---------------------   =  146 Zeilen pro Seite (abgerundet)&lt;br /&gt;
  52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
100.000 Datenzeilen&lt;br /&gt;
------------------------  =  685 Datenbankseiten (aufgerundet)&lt;br /&gt;
    158 Zeilen pro Seite&lt;br /&gt;
&lt;br /&gt;
633 Datenbankseiten * 8192 Bytes pro Seite  =  5,185,536 bytes (5,2 MB)&lt;br /&gt;
&lt;br /&gt;
Indexe beanspruchen nicht so viel Platz. Da sie jedoch die Daten&lt;br /&gt;
beinhalten, die sie indizieren, können auch sie sehr groß werden.&lt;br /&gt;
&lt;br /&gt;
NULL-Werte werden als Bitmaps gespeichert, wodurch sie sehr wenig&lt;br /&gt;
Platz in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Meine Abfragen sind langsam oder benutzen die Indexe nicht. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Indexe werden nicht automatisch bei jeder Abfrage verwendet. Indexe&lt;br /&gt;
werden nur dann verwendet, wenn die abzufragende Tabelle eine&lt;br /&gt;
bestimmte Größe übersteigt, und die Abfrage nur eine kleine&lt;br /&gt;
Prozentzahl der Tabellenzeilen abfragt. Der Grund hierfür ist der,&lt;br /&gt;
dass die durch einen Index verursachten Festplattenzugriffe manchmal&lt;br /&gt;
länger dauern würden als ein einfaches Auslesen aller Tabellenzeilen&lt;br /&gt;
(sequentieller Scan).&lt;br /&gt;
&lt;br /&gt;
Um festzustellen, ob ein Index verwendet werden soll, braucht&lt;br /&gt;
PostgreSQL Statistiken über die Tabelle. Diese Statistiken werden&lt;br /&gt;
durch die Anweisungen VACUUM ANALYZE bzw. ANALYZE berechnet. Anhand&lt;br /&gt;
der Statistiken kennt der Abfragenoptimierer die Anzahl der&lt;br /&gt;
Tabellenzeilen und kann besser entscheiden, ob Indexe verwendet werden&lt;br /&gt;
sollen. Statistiken sind auch bei der Ermittlung der optimalen&lt;br /&gt;
JOIN-Reihenfolgen und -Methoden wertvoll. Daher sollten diese&lt;br /&gt;
regelmässig durchgeführt werden, da sich der Inhalt einer Tabelle ja&lt;br /&gt;
auch verändert.&lt;br /&gt;
&lt;br /&gt;
Indexe werden normalerweise nicht in ORDER BY-Abfrage oder in JOINs&lt;br /&gt;
verwendet. Ein sequentieller Scan mit anschließendem explizitem&lt;br /&gt;
Sortiervorgang ist normalerweise schneller als ein Index-Scan einer&lt;br /&gt;
großen Tabelle. Jedoch wird bei einer Abfrage, in der LIMIT zusammen&lt;br /&gt;
mit ORDER BY verwendet wird, oftmals ein Index verwendet, da nur ein&lt;br /&gt;
kleiner Abschnitt der Tabelle zurückgeliefert wird.&lt;br /&gt;
&lt;br /&gt;
Sollte es danach aussehen, also ob der Optimierer irrtümlich einen&lt;br /&gt;
sequentiellen Scan ausführt, führen Sie SET enable_seqscan TO 'off'&lt;br /&gt;
aus und prüfen Sie, ob die Indexabfrage dadurch scheller geworden ist.&lt;br /&gt;
&lt;br /&gt;
Bei der Nutzung von Wildcard-Operatoren wie LIKE oder ~, können Indexe&lt;br /&gt;
nur unter bestimmten Umständen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
* Das Suchmuster muss sich an Anfang des Strings befinden, d.h.:&lt;br /&gt;
** LIKE-Suchmuster dürfen nicht mit % anfangen;&lt;br /&gt;
** ~ (reguläre Ausdrücke) müssen mit ^ anfangen.&lt;br /&gt;
* Das Suchmuster darf nicht mit einer Zeichenklasse (z.B. [a-e]) beginnen.&lt;br /&gt;
* Suchmuster, die Gross- und Kleinschreibung nicht berücksichtigen (z.B. ILIKE bzw. ~*), verwenden keine Indexe. Stattdessen können funktionale Indexe verwendet werden, die im Punkt 4.8 beschrieben werden.&lt;br /&gt;
* Die Standard-Locale &amp;quot;C&amp;quot; muss während der Datenbank-Initialisierung mit initdb verwendet worden sein, da andere locales den nächstgrößten Wert nicht ermitteln können. Es ist allerdings möglich, einen besonderen text_pattern_ops-Index für solche Fälle zu erstellen.&lt;br /&gt;
    &lt;br /&gt;
In Versionen vor 8.0 werden Indexe oft nicht benutzt, wenn die&lt;br /&gt;
jeweiligen Datentypen nicht genau übereinstimmen. Dies gilt besonders&lt;br /&gt;
für Indexe auf Spalten mit den Datentypen INT2, INT8 und NUMERIC&lt;br /&gt;
&lt;br /&gt;
=== Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine Abfrage auswertet? ===&lt;br /&gt;
  &lt;br /&gt;
Eine ausführliche Erklärung zu diesem Thema findet sich in der [http://www.postgresql.org/docs/current/static/sql-explain.html EXPLAIN] Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie änder ich das Sortierverhalten von textähnlichen Daten? ===&lt;br /&gt;
PostgreSQL sortiert Daten anhand dem bei initdb gesetzten Locale. (Ab 8.4 wird es es möglich sein pro Datenbank ein eigenes Locale zu definieren)&lt;br /&gt;
&lt;br /&gt;
Entspricht das Sortierverhalten nicht dem gewünschten muss man die Locale ändern. Die meisten Locales, außer &amp;quot;C&amp;quot;, sortieren anhand der Reihenfolge des entsprechenden Wörterbuches. Das Locale &amp;quot;C&amp;quot; ignoriert jegliche Punktuation und Zwischenraum.&lt;br /&gt;
&lt;br /&gt;
=== Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei einer Suche, bei der Groß- und Kleinschreibweisen ignoriert werden? Wie verwende ich einen Index bei solchen Suchabfragen? ===&lt;br /&gt;
  &lt;br /&gt;
Der Operator ~ wendet einen regulären Ausdruck an und ~* wendet ihn&lt;br /&gt;
an, ohne die Groß- und Kleinschreibung zu beachten. Ebenso beachtet&lt;br /&gt;
LIKE die Groß- und Kleinschreibung, und ILIKE nicht.&lt;br /&gt;
&lt;br /&gt;
Gleichheitsvergleiche, die Groß- und Kleinschreibung ignorieren,&lt;br /&gt;
werden in der Regel so ausgedruckt:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle&lt;br /&gt;
    WHERE LOWER(spalte) = 'abc'&lt;br /&gt;
&lt;br /&gt;
Hier wird kein normaler Index benutzt. Legt man hingegen einen&lt;br /&gt;
funktionalen Index an, so wird er auf jeden Fall verwendet:&lt;br /&gt;
   CREATE INDEX tabelle_index ON tabelle (LOWER(spalte))&lt;br /&gt;
&lt;br /&gt;
Falls der obige Index als einen UNIQUE-Index angelegt wird, können&lt;br /&gt;
keine Werte in die Spalte eingefügt werden, die sich nur durch ihre&lt;br /&gt;
Groß- und Kleinschreibung unterscheiden. Um Fehler zu vermeiden muß&lt;br /&gt;
ein CHECK-Constraint oder ein Trigger eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist? Kann nach der NULL-Belegung sortiert werden? ===&lt;br /&gt;
  &lt;br /&gt;
Testen Sie die Spalte mit IS NULL bzw. IS NOT NULL.&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   WHERE &lt;br /&gt;
      spalte IS NULL&lt;br /&gt;
&lt;br /&gt;
Beim konkatenieren mit einen NULL-Wert wir das Ergebnis auch NULL. Um dies zu verhindern verwenden Sie am besten [http://www.postgresql.org/docs/current/static/functions-conditional.html COALESCE()]&lt;br /&gt;
   SELECT &lt;br /&gt;
      COALESCE(col1, '') || COALESCE(col2, '')&lt;br /&gt;
   FROM tab;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um die Spalte danach zu sortieren, ob sie mit NULL belegt ist oder nicht, verwenden Sie die Bedingungen IS NULL bzw. IS NOT NULL in der ORDER BY-Klausel. Da Bedingungen, die wahr sind, höher als das Gegenteil sortiert werden, bewirkt die folgende Abfrage, dass die NULL-Spalten zuerst gelistet werden:&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      (spalte IS NOT NULL)&lt;br /&gt;
&lt;br /&gt;
Ab PostreSQL 8.3 und höher, ist es möglich das standardisierte NULLS FIRST/NULLS LAST zu verwenden um die Position der NULL-Werte im Ergebnis zu bestimmen. (bei FIRST stehen diese zu erst, bei LAST am Ende)&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tab&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      col NULLS FIRST;&lt;br /&gt;
&lt;br /&gt;
=== Was ist der Unterschied zwischen den verschiedenen CHAR-Typen? ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Typ&lt;br /&gt;
!interner Name&lt;br /&gt;
!Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
|VARCHAR(n) &lt;br /&gt;
|varchar&lt;br /&gt;
|die Größe legt die Maximallänge fest; kein Auffüllen mit Leerzeichen&lt;br /&gt;
|-  &lt;br /&gt;
|CHAR(n)&lt;br /&gt;
|bpchar&lt;br /&gt;
|mit Leerzeichen gefüllt bis zur angegebenen Länge&lt;br /&gt;
|-&lt;br /&gt;
|TEXT&lt;br /&gt;
|text&lt;br /&gt;
|keine obere Grenze für die Länge&lt;br /&gt;
|-&lt;br /&gt;
|BYTEA&lt;br /&gt;
|bytea&lt;br /&gt;
|Bytearray mit variabler Länge (auch für '\0'-Bytes geeignet)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;char&amp;quot; (with the quotes)&lt;br /&gt;
|char&lt;br /&gt;
|ein Zeichen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der interne Name kommt vor allem in den Systemkatalogen und in manchen&lt;br /&gt;
Fehlermeldungen vor.&lt;br /&gt;
&lt;br /&gt;
Die ersten vier Typen sind &amp;quot;varlena&amp;quot;-Typen (d.h. die ersten vier Bytes&lt;br /&gt;
geben die Länge an, gefolgt von den Daten). Daher ist der tatsächlich&lt;br /&gt;
belegte Platz immer etwas mehr als die deklarierte Feldgröße.&lt;br /&gt;
Allerdings wird unter Umständen auf diese Datentypen Datenkompression&lt;br /&gt;
durch das TOAST- Verfahren angewendet, womit der tatsächlich belegte&lt;br /&gt;
Platz auch geringer als erwartet ausfallen kann.&lt;br /&gt;
&lt;br /&gt;
Für die Speicherung von Zeichenketten variabler Länge empfiehlt sich&lt;br /&gt;
VARCHAR(n). Die maximale Länge eines VARCHAR(n)-Felds wird bei der&lt;br /&gt;
Tabellendefinition festgelegt. TEXT setzt keine Längengrenze,&lt;br /&gt;
allerdings gibt es eine systembedingte Obergrenze von 1 GB.&lt;br /&gt;
&lt;br /&gt;
CHAR(n) ist geeignet für die Speicherung von Zeichenketten, die alle&lt;br /&gt;
die gleiche Länge haben. Bitte beachten Sie, dass CHAR(n) automatisch&lt;br /&gt;
Zeichenketten bis zur definierten Feldlänge mit Leerzeichen ausfüllt,&lt;br /&gt;
während bei VARCHAR(n) nur die tatsächlich eingegebene Zeichenkette&lt;br /&gt;
gespeichert wird.&lt;br /&gt;
&lt;br /&gt;
BYTEA ist für binäre Daten, besonders für Werte, die NULL-Bytes haben.&lt;br /&gt;
&lt;br /&gt;
Alle der hier erwähnten Typen weisen ähnliche Performanzeigenschaften&lt;br /&gt;
auf.&lt;br /&gt;
&lt;br /&gt;
=== Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Wert? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet einen SERIAL-Datentyp. Dies ist zwar kein richtiger Datentyp. Es ist die Kurzform für das Erstellen einer Spalte vom Typ Integer, die von einer Sequenz befüllt wird. &lt;br /&gt;
&lt;br /&gt;
Zum Beispiel:&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
       id   SERIAL,&lt;br /&gt;
       name TEXT&lt;br /&gt;
   )&lt;br /&gt;
&lt;br /&gt;
wird automatisch in:&lt;br /&gt;
   CREATE SEQUENCE person_id_seq;&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
     id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),&lt;br /&gt;
     name TEXT&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Die automatisch generierte Sequenz besitzt immer folgenden Namen:&lt;br /&gt;
''tabellederspalte''-''namederspalte''_seq&lt;br /&gt;
&lt;br /&gt;
Die Man-Page zu CREATE SEQUENCE beinhaltet mehr Informationen zu Sequenzen.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einen Typ BIGSERIAL, dieser unterscheidet sich aber nur darin dass die Spalte den Typ BIGINTEGER bekommt. BIGSERIAL sollte verwendet werden wenn es zu erwarten ist, dass mehr als 2 Milliarden Sequenz-Werte verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie bekomme ich den Wert einer SERIAL-Sequenz? ===&lt;br /&gt;
  &lt;br /&gt;
Eine Möglichkeit wäre, mit der nextval()-Funktion den nächsten SERIAL-Wert von dem Sequenzobjekt vor der Auszuführung einer INSERT-Anweisung anzufordern und ihn dann explizit in die INSERT-Anweisung einzubinden. Anhand der Beispieltabelle in 4.11.1 könnte dieser Vorgang in einer Pseudosprache so aussehen:&lt;br /&gt;
&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT nextval('person_id_seq')&amp;quot;);&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Danach stünde der neue Wert in der Variablen new_id für die Verwendung in weiteren Abfragen zur Verfügung, zum Beispiel als Fremdschlüssel zur Tabelle 'person'). Bitte beachten Sie, dass der Name des automatisch erstellten SEQUENCE-Objektes folgenden Name hat: «table»_«serialcolumn»_seq wobei 'table' und 'serialcolumn' die Namen&lt;br /&gt;
der jeweils betreffenden Tabelle / Spalte darstellen.&lt;br /&gt;
&lt;br /&gt;
Als weitere Möglichkeit können Sie nach einer INSERT-Anweisung den automatisch eingefügten SERIAL-Wert mit der currval()-Funktion zurückgeben lassen:&lt;br /&gt;
&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT currval('person_id_seq')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Die einfachste Möglichkeit ist es RETURNING zu verwenden. Ein einfaches Beispiel sähe so aus:&lt;br /&gt;
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;&lt;br /&gt;
&lt;br /&gt;
=== Führt currval() zu einer Race-Condition mit anderen Nutzern? ===&lt;br /&gt;
  &lt;br /&gt;
Nein. currval() liefert einen Wert zurück, der von Ihrer&lt;br /&gt;
Datenbank-Session bestimmt wird, und der anderen Sessionen nicht zur&lt;br /&gt;
Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner Sequenz-/SERIAL-Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Um die gleichzeitige Abarbeitung von Transaktionen zu verbessern,&lt;br /&gt;
werden Sequenzen gerade nicht für andere Transaktionen gesperrt,&lt;br /&gt;
sondern die Sequenznummern werden den laufenden Transaktionen sofort&lt;br /&gt;
zugeteilt. Lücken in der Sequenznummerierung werden durch abgebrochene&lt;br /&gt;
Transaktionen verursacht.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein OID? ===&lt;br /&gt;
  &lt;br /&gt;
Jede Zeile, die in PostgreSQL erzeugt wird, bekommt eine eindeutige OID, sofern die Tabelle nicht mit der Option WITHOUT OIDS angelegt wurde. OIDs sind automatisch zugewiesene 4-Byte-Integer, die innerhalb der gesamten Datenbank einmalig sind. Allerdings laufen sie bei einem Wert von ungefähr 4 Milliarden über. PostgreSQL verwendet OIDs, um&lt;br /&gt;
seine interne Systemtabellen zu verbinden.&lt;br /&gt;
&lt;br /&gt;
Um einmalige Idenfikatoren in Datentabellen zu erstellen, wird allerdings empfohlen, statt OIDs Werte zu verwenden, die von SERIAL-Sequenzen erzeugt werden. SERIAL-Sequenzen sind innerhalb einer Tabelle einmalig und daher weniger anfällig für Überläufe. Außerdem können 8-Byte-Sequenzwerte mit BIGSERIAL (SERIAL8) erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein CTID? ===&lt;br /&gt;
&lt;br /&gt;
CTIDs werden benutzt, um bestimmte physikalische Zeilen durch Block und Offset Werte zu identifizieren. CTIDs verändern sich, sobald Zeilen verändert oder zurückgeladen werden. Sie werden in Indexeinträgen benutzt um auf die physikalischen Zeilen zu zeigen.&lt;br /&gt;
&lt;br /&gt;
=== Wieso bekomme ich einen Fehler: &amp;quot;ERROR: Memory exhausted in AllocSetAlloc()&amp;quot;? ===&lt;br /&gt;
  &lt;br /&gt;
Wahrscheinlich gibt es keinen virtuellen Speicher mehr in Ihrem System&lt;br /&gt;
oder Ihr Kernel hat niedrige Höchstgrenzen für bestimmte Ressourcen.&lt;br /&gt;
Probieren Sie vor dem Start von postmaster folgendes:&lt;br /&gt;
   ulimit -d 262144&lt;br /&gt;
   limit datasize 256m&lt;br /&gt;
&lt;br /&gt;
Je nach benutzter Shell wird nur einer dieser Befehle erfolgreich&lt;br /&gt;
ausgeführt werden. Auf jedem Fall wird die Grenze des Datensegments&lt;br /&gt;
für Prozesse erhöht werden und eventuell die erfolgreiche Ausführung&lt;br /&gt;
der Abfrage ermöglichen. Falls Sie ein Problem mit dem SQL-Client&lt;br /&gt;
haben, weil das Backend zu viele Daten zurückliefert, versuchen Sie&lt;br /&gt;
dies vor dem Start des SQL-Clients.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft? ===&lt;br /&gt;
  &lt;br /&gt;
Geben Sie in psql SELECT VERSION(); ein.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine Spalte erstellen, deren Default-Wert immer die aktuelle Uhrzeit enthalten soll? ===&lt;br /&gt;
  &lt;br /&gt;
Dazu verwenden Sie CURRENT_TIMESTAMP:&lt;br /&gt;
   CREATE TABLE test (x INT, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );&lt;br /&gt;
&lt;br /&gt;
=== Wie führe ich eine OUTER JOIN durch? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt OUTER JOINs nach dem SQL- Standardsyntax. Hier&lt;br /&gt;
zwei Beispiele:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 ON (t1.spalte = t2.spalte)&lt;br /&gt;
&lt;br /&gt;
bzw.:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 USING (spalte)&lt;br /&gt;
&lt;br /&gt;
Diese identischen Abfragen verknüpfen tabelle_1 mit tabelle_2 über die&lt;br /&gt;
Spalte 'spalte' und geben außerdem alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_1 (diejenigen, die keine Entsprechung in tabelle_2 haben)&lt;br /&gt;
zurück. Ein RIGHT JOIN würde hingegen alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_2 hinzufügen und ein FULL JOIN würde alle verknüpften Zeilen&lt;br /&gt;
sowie jeweils alle unverknüpften Zeilen aus den beiden Tabellen&lt;br /&gt;
zurückliefern. Die Angabe von OUTER ist nicht zwingend und kann in&lt;br /&gt;
LEFT, RIGHT und FULL-Verknüpfungen weggelassen werden. Normale&lt;br /&gt;
Verknüpfungen sind INNER JOINs.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt keinen Weg, innerhalb einer Abfrage auf mehr als eine&lt;br /&gt;
Datenbank zuzugreifen. Da PostgreSQL datenbank-spezifische&lt;br /&gt;
Systemkataloge lädt, ist eine datenbankübergreifende Abfrage nicht&lt;br /&gt;
möglich.&lt;br /&gt;
&lt;br /&gt;
contrib/dblink ist eine Erweiterung, die datenbankübergreifende&lt;br /&gt;
Abfragen über Funktionsaufrufe ermöglicht.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion zurückgeben lassen? ===&lt;br /&gt;
  &lt;br /&gt;
Funktionen können mehrere Zeilen und Spalten zurückgeben, vgl.:&lt;br /&gt;
http://www.postgresql.org/docs/techdocs.17.&lt;br /&gt;
&lt;br /&gt;
=== Warum bekomme ich eine Fehlermeldung wie &amp;quot;relation with OID ##### does not exist&amp;quot; wenn ich temporäre Tabellen in PL/PgSQL-Funktionen benutze? ===&lt;br /&gt;
  &lt;br /&gt;
In PostgreSQL-Versionen vor 8.3 verarbeitet PL/PgSQL Funktionen in&lt;br /&gt;
einer Cache. Dies hat eine unangenehme Nebenwirkung, nämlich dass wenn&lt;br /&gt;
eine PL/PgSQL-Funktion auf eine temporäre Tabelle zugreift, und diese&lt;br /&gt;
Tabelle anschließend gelöscht bzw. neu erstellt wird, die Funktion&lt;br /&gt;
fehlschlagen wird, da die gecachten Funktionsinhalte noch auf die alte&lt;br /&gt;
temporäre Tabelle zeigen. Die Lösung für diese Probleme besteht darin,&lt;br /&gt;
in der PL/PgSQL- Funktion mittels EXECUTE auf temporäre Tabellen&lt;br /&gt;
zuzugreifen. Dies bewirkt, dass bei jedem Funktionsruf die betreffende&lt;br /&gt;
Abfrage neu geparst wird.&lt;br /&gt;
&lt;br /&gt;
Dieses Problem taucht in PostgreSQL 8.3 und späteren Versionen nicht&lt;br /&gt;
mehr auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Replikationslösungen gibt es? ===&lt;br /&gt;
  &lt;br /&gt;
Der Begriff &amp;quot;replikation&amp;quot; umfasst mehrere verschiedene Technologien,&lt;br /&gt;
jede mit eigenen Vor- und Nachteilen. [http://www.postgresql.org/docs/8.3/static/high-availability.html Die Dokumentation enthält eine gute Einführung in das Thema Replikation]&lt;br /&gt;
&lt;br /&gt;
Mit &amp;quot;Master/slave&amp;quot;-Replikation werden Änderungen in einer&lt;br /&gt;
Hauptdatenbank durchgeführt und an &amp;quot;Sklaven&amp;quot; verteilt, die im&lt;br /&gt;
Nur-Lese-Modus arbeiten. Die populärste Lösung für PostgreSQL ist&lt;br /&gt;
Slony-I.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Multi-master replication&amp;quot; ermöglicht sowohl lesende als auch&lt;br /&gt;
schreibende Zugriffe über mehrere Datenbank-Server hinweg. Allerdings&lt;br /&gt;
hat diese Art von Replikation eine negative Auswirkung auf die&lt;br /&gt;
Performanz durch die Notwendigkeit, Änderungen zwischen Servern zu&lt;br /&gt;
synchronisieren. Pgcluster ist die populärste freie Lösung für&lt;br /&gt;
PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einige kommerzielle und hardware-basierte&lt;br /&gt;
Replikationslösungen für verschiedene Arten der Replikation.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Tabellen- und Spaltennamen in meiner Abfrage nicht erkannt? Warum werden Großbuchstaben umgewandelt? ===&lt;br /&gt;
  &lt;br /&gt;
Die häufigste Ursache ist die Verwendung von Gänsefüßchen bei der&lt;br /&gt;
Anlegung von Tabellen, z.B.:&lt;br /&gt;
    CREATE TABLE &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
                (&amp;quot;SPALTE1&amp;quot; INT)&lt;br /&gt;
&lt;br /&gt;
Dadurch werden Tabellen- und Spaltennamen (sog. Identifikatoren) in&lt;br /&gt;
genau der Schreibweise gespeichert (vgl. Dokumentation), was dazu&lt;br /&gt;
führt, dass man sie danach immer in Gänsefüßchen angeben muss. Im&lt;br /&gt;
obigen Beispiel muss man also immer etwa SELECT * FROM &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
verwenden. Um dieses Problem zu vermeiden, müssen Sie immer eines der&lt;br /&gt;
folgenden Punkte beachten:&lt;br /&gt;
&lt;br /&gt;
* bei der Tabellenanlegung keine Gänsefüßchen verwenden;&lt;br /&gt;
* in Identifikatoren nur Kleinschreibung verwenden;&lt;br /&gt;
* immer Identifikatoren mit Gänsefüßchen versehen&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen des Übersetzers ==&lt;br /&gt;
  &lt;br /&gt;
Die englische Vorlage dieser FAQ wird ständig überarbeitet. Daher&lt;br /&gt;
liegt die Übersetzung nicht immer auf dem aktuellsten Stand.&lt;br /&gt;
&lt;br /&gt;
Die aktuellste Version der deutschen Übersetzung befindet sich immer&lt;br /&gt;
unter http://sql-info.de/de/postgresql/FAQ_german.html. Diese&lt;br /&gt;
&amp;quot;Arbeitsversion&amp;quot; enthält eventuell Änderungen, die noch nicht auf der&lt;br /&gt;
PostgreSQL-Website eingebunden worden sind.&lt;br /&gt;
&lt;br /&gt;
Über Verbesserungshinweise und Korrekturvorschläge sowie&lt;br /&gt;
Verständnisfragen zum Inhalt der FAQ freue ich mich. Ich nehme auch&lt;br /&gt;
allgemeine Fragen zu PostgreSQL gerne entgegen, verweise jedoch auf&lt;br /&gt;
die Mailing-Listen als schnelle und zuverlässige Anlaufstellen.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/FAQ/de</id>
		<title>FAQ/de</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/FAQ/de"/>
				<updated>2011-12-06T18:41:26Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;/* Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist? Kann nach der NULL-Belegung sortiert werden? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Was ist PostgreSQL? Wie wird es ausgesprochen? ===&lt;br /&gt;
  &lt;br /&gt;
Die (englische) Aussprache ist &amp;quot;Post-Gres-Q-L&amp;quot;. Im allgemeinen&lt;br /&gt;
Sprachgebrauch hat sich die Kurzform &amp;quot;Postgres&amp;quot; auch durchgesetzt.&lt;br /&gt;
(Für diejenigen, die es interessiert: eine MP3-Datei mit der&lt;br /&gt;
amerikanischen Aussprache befindet sich hier:&lt;br /&gt;
http://www.postgresql.org/files/postgresql.mp3&lt;br /&gt;
&lt;br /&gt;
PostgreSQL ist ein objektrelationales Datenbanksystem, das die Vorzüge&lt;br /&gt;
von kommerziellen Datenbanksystemen mit zukunftsweisenden Innovationen&lt;br /&gt;
kombiniert. PostgreSQL ist freie Software und dessen kompletter&lt;br /&gt;
Quellcode ist öffentlich verfügbar.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Entwicklung wird von einem Team von meist freiwilligen&lt;br /&gt;
Entwicklern durchgeführt. Dieses Team ist für die Gesamtentwicklung&lt;br /&gt;
von PostgreSQL verantwortlich. Es handelt sich um ein&lt;br /&gt;
Gemeinschaftsprojekt, das nicht von einer bestimmten Firma&lt;br /&gt;
kontrolliert wird. Lesen Sie die Entwickler-FAQ:&lt;br /&gt;
http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn Sie an einer&lt;br /&gt;
Mitarbeit interessiert sind.&lt;br /&gt;
&lt;br /&gt;
=== Wer kontrolliert PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Falls Sie nach dem Namen eines etwaigen Inhabers bzw. nach einem&lt;br /&gt;
allmächtigen Zentralkommittee suchen - sparen Sie sich die Mühe, sowas&lt;br /&gt;
existiert gar nicht. Es gibt zwar das &amp;quot;Core Committee&amp;quot; sowie&lt;br /&gt;
Entwickler, die CVS-Schreibberechtigung haben, jedoch haben diese&lt;br /&gt;
Gruppen eher nur eine administrative Rolle. Das Projekt wird durch die&lt;br /&gt;
Community gesteuert, die aus den Entwicklern sowie natürlich auch den&lt;br /&gt;
Nutzern besteht - jeder kann daran teilnehmen. (Lesen Sie die&lt;br /&gt;
Entwickler-FAQ: http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn&lt;br /&gt;
Sie an der PostgreSQL-Entwicklung teilnehmen möchten).&lt;br /&gt;
&lt;br /&gt;
=== Welchem Copyright unterliegt PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL wird unter der klassischen BSD-Lizenz herausgegeben. Im&lt;br /&gt;
Grunde genommen erlaubt diese den Nutzern, beliebig mit dem Code&lt;br /&gt;
umzugehen, auch der Weiterverkauf von Binärversionen ohne Quellcode&lt;br /&gt;
ist erlaubt. Die einzige Einschränkung besteht darin, dass PostgreSQL&lt;br /&gt;
auf keinen Fall für etwaige Probleme mit der Software haftet. Außerdem&lt;br /&gt;
muß der Copyright- Text in allen Kopien der Software enthalten sein.&lt;br /&gt;
Dies ist der Originaltext der BSD-Lizenz:&lt;br /&gt;
 &lt;br /&gt;
 PostgreSQL Data Base Management System&lt;br /&gt;
 &lt;br /&gt;
 Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group&lt;br /&gt;
 Portions Copyright (c) 1994-6 Regents of the University of California&lt;br /&gt;
 &lt;br /&gt;
 Permission to use, copy, modify, and distribute this software and its&lt;br /&gt;
 documentation for any purpose, without fee, and without a written&lt;br /&gt;
 agreement is hereby granted, provided that the above copyright notice&lt;br /&gt;
 and this paragraph and the following two paragraphs appear in all&lt;br /&gt;
 copies.&lt;br /&gt;
 &lt;br /&gt;
 IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY&lt;br /&gt;
 FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,&lt;br /&gt;
 INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND&lt;br /&gt;
 ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN&lt;br /&gt;
 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 &lt;br /&gt;
 THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,&lt;br /&gt;
 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF&lt;br /&gt;
 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE&lt;br /&gt;
 PROVIDED HEREUNDER IS ON AN &amp;quot;AS IS&amp;quot; BASIS, AND THE UNIVERSITY OF&lt;br /&gt;
 CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,&lt;br /&gt;
 UPDATES, ENHANCEMENTS, OR MODIFICATIONS.&lt;br /&gt;
&lt;br /&gt;
Es gilt die Copyright-Klausel im Original!&lt;br /&gt;
&lt;br /&gt;
=== Auf welchen Plattformen läuft PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Normalerweise kann PostgreSQL auf jeder modernen UNIX-kompatiblen&lt;br /&gt;
Plattform eingesetzt werden. Diejenigen Plattformen, die bei der&lt;br /&gt;
jeweiligen Versionsfreigabe getestet wurden, sind in den&lt;br /&gt;
Installationsanleitungen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
PostgreSQL läuft auch auf Microsoft NT-basierten Betriebssystemen wie&lt;br /&gt;
Windows 2000 SP4, XP und Server 2003. Ein vorgefertigtes&lt;br /&gt;
Installationspaket kann von http://pgfoundry.org/projects/pginstaller&lt;br /&gt;
heruntergeladen werden. DOS-basierte Windows-Versionen (Win95, Win98,&lt;br /&gt;
WinMe) können PostgreSQL nur mit Hilfe der Cygwin-Umgebung ausführen.&lt;br /&gt;
&lt;br /&gt;
=== Woher bekomme ich PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Per Web-Browser hier: http://www.postgresql.org/ftp/ und per FTP hier:&lt;br /&gt;
ftp://ftp.postgresql.org/pub/.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die neueste Version von PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die neueste Version von PostgreSQL kann auf der [http://www.postgresql.org/ Website] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Die Freigabe einer neuen Hauptversion erfolgt in der Regel jährlich, kleinere Korrekturversionen alle paar Monaten. Die kleineren Updates werden &amp;quot;Minor&amp;quot;-Updates, die großen jährlich erscheinenden &amp;quot;Major&amp;quot;-Updates genannt. &amp;quot;Minor&amp;quot;-Update erscheinen in der Regel gleichzeitig für alle unterstützten &amp;quot;Major&amp;quot;-Versionen. [http://www.postgresql.org/support/versioning Falls Sie dieses Thema interessiert sollten Sie hier weiterlesen.]&lt;br /&gt;
&lt;br /&gt;
=== Wo bekomme ich Support für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Community bietet Unterstützung per Mailing-Liste. Die&lt;br /&gt;
Web-Seite http://www.postgresql.org/community/lists/ bietet einen&lt;br /&gt;
Überblick. Die Listen general und bugs bieten einen guten Einstieg.&lt;br /&gt;
&lt;br /&gt;
Eine deutschsprachige Mailing-Liste gibt es hier:&lt;br /&gt;
http://archives.postgresql.org/pgsql-de-allgemein/.&lt;br /&gt;
&lt;br /&gt;
Der wichtigsten IRC-Channel ist #postgresql auf Freenode&lt;br /&gt;
(irc.freenode.net). Unter UNIX/Linux können Sie mit z.B. irc -c&lt;br /&gt;
'#postgresql' &amp;quot;$USER&amp;quot; irc.freenode.net. daran teilnehmen. Auf Freenode&lt;br /&gt;
gibt es folgende Channels:&lt;br /&gt;
* #postgresql-es (spanisch)&lt;br /&gt;
* #postgresqlfr (französischen)&lt;br /&gt;
* #postgresql-br (brasilianischen) &lt;br /&gt;
&lt;br /&gt;
Es gibt außerdem einen PostgreSQL-Channel bei EFNet.&lt;br /&gt;
&lt;br /&gt;
Eine Liste von Unternehmen, die Support für PostgreSQL auf kommerzieller Basis leisten, kann unter http://www.postgresql.org/support/professional_support eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich einen Fehlerbericht abgeben? ===&lt;br /&gt;
  &lt;br /&gt;
Nutzen Sie das Formular unter&lt;br /&gt;
http://www.postgresql.org/support/submitbug. Schauen Sie aber vorher&lt;br /&gt;
unter ftp://ftp.postgresql.org/pub/ nach, ob es mittlerweile eine&lt;br /&gt;
neuere PostgreSQL-Version gibt, in der der Fehler behoben wurde.&lt;br /&gt;
&lt;br /&gt;
Bugs, die über das Formular bzw. eine der Mailing-Listen&lt;br /&gt;
bekanntgegeben wurden, erhalten typischerweise einer der folgenden&lt;br /&gt;
Reaktionen:&lt;br /&gt;
&lt;br /&gt;
* es ist kein Bug, der Grund wird benannt&lt;br /&gt;
* es ist ein bereits bekannter Bug, der bereits auf der TODO-Liste aufgenommen wurde&lt;br /&gt;
* der Bug wurde in der aktuellen Version behoben&lt;br /&gt;
* der Bug wurde bereits behoben, befindet sich aber noch nicht in einer offiziell veröffentlichten Version&lt;br /&gt;
* es wird um eingehendere Informationen gebeten, z.B.:&lt;br /&gt;
** Betriebssystem&lt;br /&gt;
** PostgreSQL-Version&lt;br /&gt;
** reproduzierbares Fallbeispiel&lt;br /&gt;
** Debugging-Information&lt;br /&gt;
** Debugger-Backtrace-Ausgabe&lt;br /&gt;
* der Bug ist neu. Folgendes könnte passieren:&lt;br /&gt;
** ein Patch wird erstellt und in der nächsten Version eingebaut&lt;br /&gt;
** der Bug kann nicht sofort behoben werden und wird auf die TODO-Liste gesetzt&lt;br /&gt;
    &lt;br /&gt;
=== Wie erfahre ich von bekannten Bugs oder fehlenden Features? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt eine erweiterte Teilmenge von SQL:2003. Siehe&lt;br /&gt;
unsere TODO-Liste unter http://www.postgresql.org/docs/faqs.TODO.html&lt;br /&gt;
für eine Auflistung der bekannten Bugs, fehlenden Features und&lt;br /&gt;
zukünftigen Pläne.&lt;br /&gt;
&lt;br /&gt;
Eine Anfrage nach einem neuen Feature führt normalerweise zu einer der&lt;br /&gt;
folgenden Antworten:&lt;br /&gt;
&lt;br /&gt;
* das Feature ist bereits auf der TODO-Liste&lt;br /&gt;
* das Feature ist nicht wünschenswert, weil:&lt;br /&gt;
** es vorhandene Funktionalität dupliziert, welche bereits dem SQL-Standard folgt&lt;br /&gt;
** es würde die Komplexität der Code-Basis erhöhen, ohne nennenswerte Vorteile zu bringen&lt;br /&gt;
** es wäre unsicher bzw. unzuverlässig&lt;br /&gt;
* das neue Feature wird der TODO-Liste hinzugefügt&lt;br /&gt;
    &lt;br /&gt;
PostgreSQL verwendet kein Bugtracking-System, da es sich als effizienter erwiesen hat, E-Mails direkt zu beantworten und die TODO-Liste aktuell zu halten. In der Praxis werden Bugs sehr schnell beseitigt, und diejenigen Bugs, die Auswirkungen auf eine große Anzahl von Nutzern haben, werden meist kurzfristig korrigiert. Der einzige Überblick über alle Änderungen, Verbesserungen und Korrekturen in einer PostgreSQL-Version befindet sich in den CVS-Log-Meldungen. Auch die Release-Notes listen nicht jede Änderung in der Software auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Dokumentation ist für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet umfangreiche Dokumentation, darunter ein großes&lt;br /&gt;
Handbuch, man-Pages und einige kleine Testprogramme. Siehe das /doc-&lt;br /&gt;
Verzeichnis. Ausserdem sind alle Handbücher online unter&lt;br /&gt;
http://www.postgresql.org/docs/ verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Bücher zu PostgreSQL sind online verfügbar unter&lt;br /&gt;
http://www.postgresql.org/docs/books/awbook.html und&lt;br /&gt;
http://www.commandprompt.com/ppbook/ .&lt;br /&gt;
&lt;br /&gt;
Eine Liste lieferbarer PostgreSQL-Bücher befindet sich unter&lt;br /&gt;
http://www.postgresql.org/docs/books Diverse technische Artikel&lt;br /&gt;
befinden sich unter http://www.postgresql.org/docs/techdocs .&lt;br /&gt;
&lt;br /&gt;
psql hat einige nützliche \d-Befehle, um Informationen über Typen,&lt;br /&gt;
Operatoren, Funktionen, Aggregate, usw. zu zeigen.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Website enthält noch mehr Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich SQL lernen? ===&lt;br /&gt;
  &lt;br /&gt;
Die oben erwähnten PostgreSQL-spezifische Bücher bieten einen guten&lt;br /&gt;
Einstieg. Viele PostgreSQL-Anwender mögen &amp;quot;The Practical SQL Handbook&amp;quot;&lt;br /&gt;
(Bowman et al., Addison Wesley). Andere dagegen mögen &amp;quot;The Complete&lt;br /&gt;
Reference SQL&amp;quot; (Groff et al., McGraw-Hill).&lt;br /&gt;
&lt;br /&gt;
Es gibt ausserdem einige nützliche Online-Tutorials:&lt;br /&gt;
&lt;br /&gt;
* http://www.intermedia.net/support/sql/sqltut.shtm&lt;br /&gt;
* http://sqlcourse.com&lt;br /&gt;
* http://www.w3schools.com/sql/default.asp&lt;br /&gt;
* http://mysite.verizon.net/Graeme_Birchall/id1.html&lt;br /&gt;
    &lt;br /&gt;
=== Wie kann ich im Entwicklerteam mitarbeiten? ===&lt;br /&gt;
  &lt;br /&gt;
Lesen Sie in der Entwickler-FAQ unter&lt;br /&gt;
[[Developer_FAQ | Developer FAQ]] nach.&lt;br /&gt;
&lt;br /&gt;
=== Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt verschiedene Methoden, Software zu messen: Eigenschaften,&lt;br /&gt;
Performanz, Zuverlässigkeit, Support und Preis.&lt;br /&gt;
&lt;br /&gt;
==== Eigenschaften ====&lt;br /&gt;
&lt;br /&gt;
       PostgreSQL besitzt die meisten Eigenschaften - wie&lt;br /&gt;
       Transaktionen, Unterabfragen (Subqueries), Trigger, Views,&lt;br /&gt;
       referenzielle Integrität bei Fremdschlüsseln und verfeinertes&lt;br /&gt;
       Locking - die bei großen kommerziellen DBMS vorhanden sind. Es&lt;br /&gt;
       bietet außerdem einige anderen Eigenschaften, die diese nicht&lt;br /&gt;
       immer haben, wie benutzerbestimmte Typen, Vererbung, Regeln,&lt;br /&gt;
       und die Multi-Versionen-Steuerung zum Verringern&lt;br /&gt;
       konkurrierender Locks.&lt;br /&gt;
       &lt;br /&gt;
==== Performanz ====&lt;br /&gt;
       Die Performanz von PostgreSQL ist mit der von kommerziellen und&lt;br /&gt;
       anderen Open-Source-Datenbanken vergleichbar. In manchen&lt;br /&gt;
       Bereichen ist es schneller, in anderen langsamer. In der Regel&lt;br /&gt;
       beträgt der Unterschied +/-10%.&lt;br /&gt;
       &lt;br /&gt;
==== Zuverlässigkeit ====&lt;br /&gt;
       Es ist selbstredend, dass ein DBMS wertlos ist, wenn es nicht&lt;br /&gt;
       zuverlässig arbeitet. Daher bemühen wir uns, nur streng&lt;br /&gt;
       geprüften und beständigen Code freizugeben, der nur ein Minimum&lt;br /&gt;
       an Programmfehlern aufweist. Jede Freigabe hat mindestens einen&lt;br /&gt;
       Monat Betatest-Phase hinter sich, und unsere Freigabehistorie&lt;br /&gt;
       beweist, dass wir stabile und solide Versionen freigeben, die&lt;br /&gt;
       im Produktionsbetrieb genutzt werden können. Wir glauben, dass&lt;br /&gt;
       wir im Vergleich mit anderer Datenbanksoftware vorteilhaft&lt;br /&gt;
       dastehen.&lt;br /&gt;
       &lt;br /&gt;
==== Support ====&lt;br /&gt;
       Unsere Mailinglisten bieten die Möglichkeit, gemeinsam mit&lt;br /&gt;
       einer großen Gruppe von Entwicklern und Benutzern mögliche&lt;br /&gt;
       Probleme zu lösen. Wir können nicht immer eine Fehlerbehebung&lt;br /&gt;
       garantieren, kommerzielle DBMS tun dies aber auch nicht. Der&lt;br /&gt;
       direkte Kontakt zur Entwickler- und Benutzergemeinschaft und&lt;br /&gt;
       der Zugriff auf die Handbücher und den Quellcode ermöglicht&lt;br /&gt;
       einen im Vergleich zu anderen DBMS höherwertigeren Support. Es&lt;br /&gt;
       gibt jedoch auch Anbieter von kommerziellen Support-Leistungen&lt;br /&gt;
       (siehe FAQ-Punkt 1.7).&lt;br /&gt;
       &lt;br /&gt;
==== Preis ====&lt;br /&gt;
       PostgreSQL ist frei verfügbar, sowohl für die kommerzielle wie&lt;br /&gt;
       auch für die nicht-kommerzielle Nutzung. Sie können den&lt;br /&gt;
       PostgreSQL-Code ohne Einschränkungen (außer denjenigen, die in&lt;br /&gt;
       der oben angegebene BSD-artigen Lizenz erwähnt werden) in Ihr&lt;br /&gt;
       Produkt integrieren.&lt;br /&gt;
&lt;br /&gt;
=== Kann PostgreSQL eingebettet (embedded) werden? ===&lt;br /&gt;
PostgreSQL basiert auf einer Server/Client-Architektur, diese benötigt separate Prozesse für jeden Klient und Server, hinzukommen auch noch weitere &amp;quot;Helfer-Prozesse&amp;quot; (z. B. für autovacuum und stats-collector). Zwar können einige &amp;quot;embedded-Architekturen&amp;quot; diese Anforderungen erfüllen, aber wenn der Datenbank-Prozess innerhalb des Applikations-Prozesses laufen muss, kann PostgreSQL nicht verwendet werden. Dazu sollte man leichtere Datenbanken nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mich von einer Maillingliste abmelden? Wie verhindere ich es, dass ich doppelte E-Mails bekomme? ===&lt;br /&gt;
Majordomo ermöglicht es sich von allen Maillinglisten an- und abzumelden, ggf. müssen Sie sich zuerst ihr Majordomo-Passwort zuschicken lassen.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Maillinglisten sind so konfiguriert, dass Antworten an den ursprünglichen Autor und an die Maillingliste verschickt werden. Somit soll erreicht werden dass Benutzer immer schnellstmöglichst eine Antwort erhalten können. Diese Einstellungen können Sie auch über die Konfiguration von Majordomo ändern, ändern Sie dafür die Einstellung für ''eliminatecc''. Sie können auch einstellen dass Sie selbst keine Antwort auf Ihre eigenen E-Mails bekommen, ändern sie dafür die Einstellung für ''selfcopy''.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
&lt;br /&gt;
== Fragen zu Benutzerprogrammen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Welche Schnittstellen gibt es für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Installation stellt nur Schnittstellen für C und&lt;br /&gt;
Embedded C bereit. Alle weitere Schnittstellen sind unabhängige&lt;br /&gt;
Projekte, die einzeln heruntergeladen werden werden müssen. Diese&lt;br /&gt;
Trennung ermöglicht individuelle Entwickler-Teams und&lt;br /&gt;
Entwicklungszyklen für die jeweiligen Projekte.&lt;br /&gt;
&lt;br /&gt;
Einige Programmiersprachen wie PHP haben eine PostgreSQL-&lt;br /&gt;
Schnittstelle bereits eingebaut. Schnittstellen für Sprachen wie Perl,&lt;br /&gt;
TCL, Python und viele anderen sind unter http://gborg.postgresql.org&lt;br /&gt;
im Bereich Drivers/Interfaces verfügbar sowie per Internet-Suche.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann man PostgreSQL in einer Website nutzen? ===&lt;br /&gt;
  &lt;br /&gt;
Eine nette Einführung zu datenbank-gestützten Webseiten kann unter&lt;br /&gt;
http://www.webreview.com (engl.) eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Für die Web-Integration ist PHP eine ausgezeichnete Schnittstelle. PHP&lt;br /&gt;
gibt es bei http://www.php.net&lt;br /&gt;
&lt;br /&gt;
Desweiteren bietet sich die Perl-Schnittstelle mit CGI.pm&lt;br /&gt;
oder mod_perl auch an.&lt;br /&gt;
&lt;br /&gt;
=== Hat PostgreSQL eine grafische Benutzerschnittstelle? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt eine große Anzahl von GUI-Programmen für PostgreSQL - sowohl&lt;br /&gt;
kommerziell als auch Open-Source. [http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools Eine englische Liste befindet sich hier.]&lt;br /&gt;
&lt;br /&gt;
== Administrative Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql? ===&lt;br /&gt;
  &lt;br /&gt;
Bei der Ausführung von configure die Option --prefix mit dem Zielverzeichnis angeben.&lt;br /&gt;
&lt;br /&gt;
=== Wie regle ich Zugriffe von anderen Rechnern? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL ist standardmäßig so eingestellt, dass Verbindungen nur vom&lt;br /&gt;
lokalen Rechner über Unix Domain Sockets bzw. TCP/IP möglich sind.&lt;br /&gt;
Verbindungen von anderen Rechnern werden erst dann ermöglicht, wenn&lt;br /&gt;
Sie in der Datei postgresql.conf die Einstellung listen_addresses&lt;br /&gt;
anpassen, in der Datei $PGDATA/pg_hba.conf host-basierte&lt;br /&gt;
Authentifizierung einschalten und den Server neu starten.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine bessere Performanz erreichen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt drei große Bereiche, in denen Performanzverbesserungen erzielt&lt;br /&gt;
werden können:&lt;br /&gt;
&lt;br /&gt;
==== Abfrageoptimierung ====&lt;br /&gt;
Die Modifizierung von Abfragen kann eine bessere Performanz erzielen:&lt;br /&gt;
       &lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/indexes.html Erstellung von Indexen, einschliesslich partieller Indexe sowie Expressionsindexe]&lt;br /&gt;
* Einsatz von COPY anstelle multipler INSERT-Anweisungen&lt;br /&gt;
* Gruppierung von mehreren Abfragen innerhalb einer Transaktion, um Aufwand beim Abschluss von Transaktionen    einzusparen&lt;br /&gt;
* Einsatz von CLUSTER beim Holen von einer großen Anzahl von Datenreihen aus einem Index&lt;br /&gt;
* Einsatz von LIMIT, um eine Untermenge der Abfragenergebnisse zurückzuliefern&lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/sql-prepare.html Einsatz von vorbereiteten Befehlen (prepared queries)]&lt;br /&gt;
* Einsatz von ANALYZE, um die Datenbankstatistik für den Abfragenplaner aktuell zu halten&lt;br /&gt;
* [http://www.postgresql.org/docs/current/static/routine-vacuuming.html Regelmäßiger Einsatz von VACUUM bzw. pg_autovacuum (autovacuum ist seit Version 8.3 standardmäßig aktiviert)]&lt;br /&gt;
* Bei großen Datenveränderungen die Löschung von Indexen&lt;br /&gt;
&lt;br /&gt;
==== Server-Konfiguration ====&lt;br /&gt;
Einige Einstellungen in der Datei postgresql.conf wirken sich auf die Performanz aus. Das Handbuch enthält unter      http://www.postgresql.org/docs/current/static/runtime-config.html eine komplette Auflistung. &lt;br /&gt;
&lt;br /&gt;
Kommentare zu den jeweiligen Einstellungen gibt es unter http://www.varlena.com/varlena/GeneralBits/Tidbitsannotated_conf_e.html und http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.&lt;br /&gt;
       &lt;br /&gt;
==== Hardware-Auswahl ====&lt;br /&gt;
Die Auswirkung von Hardware auf Performanz wird unter http://momjian.us/main/writings/pgsql/hw_performance/index.html und http://www.powerpostgresql.com/PerfList/ erläutert.&lt;br /&gt;
       &lt;br /&gt;
=== Welche Debugging-Funktionen sind für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
Unter den Optionen für die Server-Konfigurierung gibt es zahlreiche&lt;br /&gt;
log_*-Variablen, die die Ausgabe von Abfrage- und Prozessstatistiken&lt;br /&gt;
ermöglichen. Diese können für Debugging-Zwecke sowie Performanz-Tests&lt;br /&gt;
sehr nützlich sein.&lt;br /&gt;
&lt;br /&gt;
=== Ich bekomme die Meldung &amp;quot;Sorry, too many clients&amp;quot;, wenn ich eine Verbindung aufzubauen versuche. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Ihr System hat die maximal zulässige Anzahl von Datenbankverbindungen&lt;br /&gt;
erreicht (Voreinstellung 100). Sie müssen die maximale Anzahl der&lt;br /&gt;
gleichzeitig ausführbaren Backend-Prozesse hochsetzen, indem Sie in&lt;br /&gt;
postgresql.conf den Wert max_connections ändern und den Server&lt;br /&gt;
neustarten.&lt;br /&gt;
&lt;br /&gt;
=== Wie wird PostgreSQL aktualisiert? ===&lt;br /&gt;
  &lt;br /&gt;
Allgemeine Informationen zur Aktualisierung von PostgreSQL gibt es auf&lt;br /&gt;
der Seite http://www.postgresql.org/support/versioning. Detaillierte&lt;br /&gt;
technische Informationen gibt es auf der Seite&lt;br /&gt;
http://www.postgresql.org/docs/current/static/install-upgrading.html&lt;br /&gt;
&lt;br /&gt;
=== Kommt PostgreSQL mit den Anpassungen der Sommerzeit in verschiedenen Ländern klar? ===&lt;br /&gt;
  &lt;br /&gt;
Für die Berücksichtigung der Sommerzeit verwendet PostgreSQL Seit dem Release 8.0 die weiterverbreitete tzdata-Datenbank (auch bekannt als &amp;quot;zoneinfo database&amp;quot; oder &amp;quot;[http://www.twinsun.com/tz/tz-link.htm Olzen timezone database]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jedes Update von PostgreSQL beinhaltet die aktuellen tzdata Dateien, daher sollte es reichen die Minor-Updates der eingesetzten Major Version im Auge zu behalten.&lt;br /&gt;
&lt;br /&gt;
Unter der Vorraussetzung dass das Betriebssystem diese Dateien schon in einer stets aktuellen Version vorbehält, ist es üblich, dass man diese Dateien verwendet. PostgreSQL bietet dazu eine compile-option an.&lt;br /&gt;
&lt;br /&gt;
=== Welche Hardware eignet sich für den Betrieb mit PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL läuft auf fast jeder Hardware-Kombination. Im PC-Bereich&lt;br /&gt;
gibt es allerdings sehr große Abweichungen in der Qualität. Für einen&lt;br /&gt;
Arbeitsplatz- oder Entwicklungsrechner mag dies nicht so bedeutend&lt;br /&gt;
sein, im Server-Betrieb jedoch lohnt sich auf jeden Fall die&lt;br /&gt;
Investition in teurere Bestandteile (Stichwörter ECC-Speicher, SCSI,&lt;br /&gt;
Hauptplatinen und Netzteile von namhaften Herstellern). Nutzen Sie&lt;br /&gt;
unsere Mailing-Listen, um Hardware-Optionen zu diskutieren.&lt;br /&gt;
&lt;br /&gt;
== Fragen zum Betrieb ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie wähle ich per SELECT-Anweisung nur die ersten paar Zeilen bzw. eine beliebige Zeile in einer Abfrage aus? ===&lt;br /&gt;
  &lt;br /&gt;
Wenn Sie bei der Ausführung der Abfrage die Anzahl der anzufordenden&lt;br /&gt;
Reihen bereits kennen, nutzen Sie LIMIT. Wenn die ORDER BY- Anweisung&lt;br /&gt;
mit einem Index verwendet wird, ist es möglich, dass die gesamte&lt;br /&gt;
Abfrage nicht ausgeführt werden muss. Wenn Sie die Anzahl der der&lt;br /&gt;
anzufordenden Reihen nicht kennen, verwenden Sie einen Cursor und&lt;br /&gt;
FETCH.&lt;br /&gt;
&lt;br /&gt;
Um eine beliebige Zeile auszuwählen, nutzen Sie ORDER BY random():&lt;br /&gt;
    SELECT spalte&lt;br /&gt;
      FROM tabelle&lt;br /&gt;
  ORDER BY random()&lt;br /&gt;
     LIMIT 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Wie finde ich heraus, welche Tabellen, Indexe, Datenbanken oder Benutzer in der Datenbank definiert sind? Wie bekomme ich die von psql verwendeten Abfragen? ===&lt;br /&gt;
  &lt;br /&gt;
In psql zeigt der Befehl \dt eine Liste der Datenbanktabellen. Weitere&lt;br /&gt;
psql-Befehle lassen sich mit \? anzeigen. Sie können sich die Datei&lt;br /&gt;
pgsql/src/bin/psql/describe.c mit dem Quellcode für psql ansehen. Sie&lt;br /&gt;
enthält die SQL-Abfragen, die die Backslash-Kommandos (\) ausführen.&lt;br /&gt;
Sie können psql auch mit der -E Option starten. Danach gibt psql die&lt;br /&gt;
Abfragen aus, die es bei der Ausführung der Befehle benutzt. Außerdem&lt;br /&gt;
biete PostgreSQL ein SQL-kompatibles INFORMATION SCHEMA, das&lt;br /&gt;
Metainformation über die Datenbank zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
Mit psql -l können Sie alle Datenbanken anzeigen lassen.&lt;br /&gt;
&lt;br /&gt;
Die Datei pgsql/src/tutorial/syscat.source enthält außerdem viele&lt;br /&gt;
SELECT- Abfragen, mit deren Hilfe man Information über die&lt;br /&gt;
Systemtabellen erhalten kann.&lt;br /&gt;
&lt;br /&gt;
=== Wie ändere ich den Datentyp einer Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Ab Version 8.0 kann der Datentyp einer Spalte mit ALTER TABLE ALTER&lt;br /&gt;
COLUMN TYPE geändert werden, sofern der neue Datentyp die Werte des&lt;br /&gt;
alten Datentype aufnehmen kann.&lt;br /&gt;
&lt;br /&gt;
Bei früheren Versionen gehen Sie wie folgt vor:&lt;br /&gt;
    BEGIN;&lt;br /&gt;
    ALTER TABLE tabelle ADD COLUMN neue_spalte neuer_datentyp;&lt;br /&gt;
    UPDATE tabelle SET neue_spalte = CAST(alte_spalte AS neuer_datentyp);&lt;br /&gt;
    ALTER TABLE tabelle DROP COLUMN alte_spalte;&lt;br /&gt;
    COMMIT;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Speicherplatz freizugeben, der von der gelöschten Spalte&lt;br /&gt;
verwendet wurde, führen Sie VACUUM FULL aus.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank? ===&lt;br /&gt;
  &lt;br /&gt;
Es bestehen folgende Obergrenzen:&lt;br /&gt;
 Maximale Größe eine Datenbank?           unbeschränkt (es existieren&lt;br /&gt;
                                            Datenbanken mit 32 TB)&lt;br /&gt;
 Maximale Größe einer Tabelle?            32 TB&lt;br /&gt;
 Maximale Größe einer Zeile?              400 GB&lt;br /&gt;
 Maximale Größe einer Spalte?             1 GB&lt;br /&gt;
 Maximale Anzahl von Zeilen in einer Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
 Maximale Anzahl von Spalten in einer Tabelle?&lt;br /&gt;
                                          250-1600 je nach Spaltentyp&lt;br /&gt;
 Maximale Anzahl von Indexen für eine Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich sind dies theoretische Werte, die oft durch die&lt;br /&gt;
verfügbaren Platten- und Speicherressourcen beschränkt werden. Extreme&lt;br /&gt;
Größen können zu Leistungseinbußen führen.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße von 32 TB benötigt keine&lt;br /&gt;
Large-File-Unterstützung im Betriebssystem. Große Tabellen werden in&lt;br /&gt;
Dateien mit einer Größe von je 1 GB aufgeteilt, wodurch etwaige&lt;br /&gt;
dateisystem-bedingte Beschränkungen nicht relevant sind.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße und die maximale Anzahl von Spalten können&lt;br /&gt;
vervierfacht werden, indem man die Default-Blockgröße auf 32 KB&lt;br /&gt;
heraufsetzt. Die Tabellengröße kann auch durch Tabellenpartitionierung&lt;br /&gt;
vergrößert werden.&lt;br /&gt;
&lt;br /&gt;
Eine Einschränkung ist, dass Indexe nur auf Spalten erstellt werden&lt;br /&gt;
können, die bis etwa 2.000 Zeichen groß sind. Um auf größere Spalten&lt;br /&gt;
eine UNIQUE-Constraint setzen zu können, nutzen Sie einen funktionalen&lt;br /&gt;
Index mit dem MD5-Hash-Wert der Spalte. Um innerhalb einer großen, mit&lt;br /&gt;
Text belegten Spalte suchen zu können, verwenden Sie einen&lt;br /&gt;
Volltext-Index.&lt;br /&gt;
&lt;br /&gt;
=== Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen Textdatei abzuspeichern? ===&lt;br /&gt;
  &lt;br /&gt;
Eine PostgreSQL-Datenbank kann beim Abspeichern einer einfachen&lt;br /&gt;
Textdatei bis zu fünfmal mehr Platz gegenüber der eigentlichen Größe&lt;br /&gt;
der Datei beanspruchen.&lt;br /&gt;
&lt;br /&gt;
Betrachten wir eine Datei mit 100.000 Zeilen mit einem Integer und&lt;br /&gt;
einer Textbeschreibung pro Zeile. Gehen wir davon aus, dass die&lt;br /&gt;
durchschnittliche Länge der Textbeschreibung 20 Byte beträgt. Die&lt;br /&gt;
einfache Datei würde 2,8 MB groß sein. Die Größe der&lt;br /&gt;
PostgreSQL-Datenbankdatei, die diese Daten enthält, liegt ungefähr bei&lt;br /&gt;
5,2 MB:&lt;br /&gt;
 24 Bytes: jeder Zeilenkopf (ungefähr)&lt;br /&gt;
+24 Bytes: ein Integer-Feld und ein Textfeld&lt;br /&gt;
+ 4 Bytes: Zeiger auf der Datenseite auf den Tupel&lt;br /&gt;
-----------------------------------------------&lt;br /&gt;
 52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
Die Größe einer Datenseite in PostgreSQL beträgt 8192 Bytes (8 KB),&lt;br /&gt;
also:&lt;br /&gt;
8192 Bytes pro Seite&lt;br /&gt;
---------------------   =  146 Zeilen pro Seite (abgerundet)&lt;br /&gt;
  52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
100.000 Datenzeilen&lt;br /&gt;
------------------------  =  685 Datenbankseiten (aufgerundet)&lt;br /&gt;
    158 Zeilen pro Seite&lt;br /&gt;
&lt;br /&gt;
633 Datenbankseiten * 8192 Bytes pro Seite  =  5,185,536 bytes (5,2 MB)&lt;br /&gt;
&lt;br /&gt;
Indexe beanspruchen nicht so viel Platz. Da sie jedoch die Daten&lt;br /&gt;
beinhalten, die sie indizieren, können auch sie sehr groß werden.&lt;br /&gt;
&lt;br /&gt;
NULL-Werte werden als Bitmaps gespeichert, wodurch sie sehr wenig&lt;br /&gt;
Platz in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Meine Abfragen sind langsam oder benutzen die Indexe nicht. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Indexe werden nicht automatisch bei jeder Abfrage verwendet. Indexe&lt;br /&gt;
werden nur dann verwendet, wenn die abzufragende Tabelle eine&lt;br /&gt;
bestimmte Größe übersteigt, und die Abfrage nur eine kleine&lt;br /&gt;
Prozentzahl der Tabellenzeilen abfragt. Der Grund hierfür ist der,&lt;br /&gt;
dass die durch einen Index verursachten Festplattenzugriffe manchmal&lt;br /&gt;
länger dauern würden als ein einfaches Auslesen aller Tabellenzeilen&lt;br /&gt;
(sequentieller Scan).&lt;br /&gt;
&lt;br /&gt;
Um festzustellen, ob ein Index verwendet werden soll, braucht&lt;br /&gt;
PostgreSQL Statistiken über die Tabelle. Diese Statistiken werden&lt;br /&gt;
durch die Anweisungen VACUUM ANALYZE bzw. ANALYZE berechnet. Anhand&lt;br /&gt;
der Statistiken kennt der Abfragenoptimierer die Anzahl der&lt;br /&gt;
Tabellenzeilen und kann besser entscheiden, ob Indexe verwendet werden&lt;br /&gt;
sollen. Statistiken sind auch bei der Ermittlung der optimalen&lt;br /&gt;
JOIN-Reihenfolgen und -Methoden wertvoll. Daher sollten diese&lt;br /&gt;
regelmässig durchgeführt werden, da sich der Inhalt einer Tabelle ja&lt;br /&gt;
auch verändert.&lt;br /&gt;
&lt;br /&gt;
Indexe werden normalerweise nicht in ORDER BY-Abfrage oder in JOINs&lt;br /&gt;
verwendet. Ein sequentieller Scan mit anschließendem explizitem&lt;br /&gt;
Sortiervorgang ist normalerweise schneller als ein Index-Scan einer&lt;br /&gt;
großen Tabelle. Jedoch wird bei einer Abfrage, in der LIMIT zusammen&lt;br /&gt;
mit ORDER BY verwendet wird, oftmals ein Index verwendet, da nur ein&lt;br /&gt;
kleiner Abschnitt der Tabelle zurückgeliefert wird.&lt;br /&gt;
&lt;br /&gt;
Sollte es danach aussehen, also ob der Optimierer irrtümlich einen&lt;br /&gt;
sequentiellen Scan ausführt, führen Sie SET enable_seqscan TO 'off'&lt;br /&gt;
aus und prüfen Sie, ob die Indexabfrage dadurch scheller geworden ist.&lt;br /&gt;
&lt;br /&gt;
Bei der Nutzung von Wildcard-Operatoren wie LIKE oder ~, können Indexe&lt;br /&gt;
nur unter bestimmten Umständen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
* Das Suchmuster muss sich an Anfang des Strings befinden, d.h.:&lt;br /&gt;
** LIKE-Suchmuster dürfen nicht mit % anfangen;&lt;br /&gt;
** ~ (reguläre Ausdrücke) müssen mit ^ anfangen.&lt;br /&gt;
* Das Suchmuster darf nicht mit einer Zeichenklasse (z.B. [a-e]) beginnen.&lt;br /&gt;
* Suchmuster, die Gross- und Kleinschreibung nicht berücksichtigen (z.B. ILIKE bzw. ~*), verwenden keine Indexe. Stattdessen können funktionale Indexe verwendet werden, die im Punkt 4.8 beschrieben werden.&lt;br /&gt;
* Die Standard-Locale &amp;quot;C&amp;quot; muss während der Datenbank-Initialisierung mit initdb verwendet worden sein, da andere locales den nächstgrößten Wert nicht ermitteln können. Es ist allerdings möglich, einen besonderen text_pattern_ops-Index für solche Fälle zu erstellen.&lt;br /&gt;
    &lt;br /&gt;
In Versionen vor 8.0 werden Indexe oft nicht benutzt, wenn die&lt;br /&gt;
jeweiligen Datentypen nicht genau übereinstimmen. Dies gilt besonders&lt;br /&gt;
für Indexe auf Spalten mit den Datentypen INT2, INT8 und NUMERIC&lt;br /&gt;
&lt;br /&gt;
=== Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine Abfrage auswertet? ===&lt;br /&gt;
  &lt;br /&gt;
Eine ausführliche Erklärung zu diesem Thema findet sich in der [http://www.postgresql.org/docs/current/static/sql-explain.html EXPLAIN] Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie änder ich das Sortierverhalten von textähnlichen Daten? ===&lt;br /&gt;
PostgreSQL sortiert Daten anhand dem bei initdb gesetzten Locale. (Ab 8.4 wird es es möglich sein pro Datenbank ein eigenes Locale zu definieren)&lt;br /&gt;
&lt;br /&gt;
Entspricht das Sortierverhalten nicht dem gewünschten muss man die Locale ändern. Die meisten Locales, außer &amp;quot;C&amp;quot;, sortieren anhand der Reihenfolge des entsprechenden Wörterbuches. Das Locale &amp;quot;C&amp;quot; ignoriert jegliche Punktuation und Zwischenraum.&lt;br /&gt;
&lt;br /&gt;
=== Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei einer Suche, bei der Groß- und Kleinschreibweisen ignoriert werden? Wie verwende ich einen Index bei solchen Suchabfragen? ===&lt;br /&gt;
  &lt;br /&gt;
Der Operator ~ wendet einen regulären Ausdruck an und ~* wendet ihn&lt;br /&gt;
an, ohne die Groß- und Kleinschreibung zu beachten. Ebenso beachtet&lt;br /&gt;
LIKE die Groß- und Kleinschreibung, und ILIKE nicht.&lt;br /&gt;
&lt;br /&gt;
Gleichheitsvergleiche, die Groß- und Kleinschreibung ignorieren,&lt;br /&gt;
werden in der Regel so ausgedruckt:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle&lt;br /&gt;
    WHERE LOWER(spalte) = 'abc'&lt;br /&gt;
&lt;br /&gt;
Hier wird kein normaler Index benutzt. Legt man hingegen einen&lt;br /&gt;
funktionalen Index an, so wird er auf jeden Fall verwendet:&lt;br /&gt;
   CREATE INDEX tabelle_index ON tabelle (LOWER(spalte))&lt;br /&gt;
&lt;br /&gt;
Falls der obige Index als einen UNIQUE-Index angelegt wird, können&lt;br /&gt;
keine Werte in die Spalte eingefügt werden, die sich nur durch ihre&lt;br /&gt;
Groß- und Kleinschreibung unterscheiden. Um Fehler zu vermeiden muß&lt;br /&gt;
ein CHECK-Constraint oder ein Trigger eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist? Kann nach der NULL-Belegung sortiert werden? ===&lt;br /&gt;
  &lt;br /&gt;
Testen Sie die Spalte mit IS NULL bzw. IS NOT NULL.&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   WHERE &lt;br /&gt;
      spalte IS NULL&lt;br /&gt;
&lt;br /&gt;
Beim konkatenieren mit einen NULL-Wert wir das Ergebnis auch NULL. Um dies zu verhindern verwenden Sie am besten [http://www.postgresql.org/docs/current/static/functions-conditional.html COALESCE()]&lt;br /&gt;
   SELECT &lt;br /&gt;
      COALESCE(col1, '') || COALESCE(col2, '')&lt;br /&gt;
   FROM tab;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um die Spalte danach zu sortieren, ob sie mit NULL belegt ist oder nicht, verwenden Sie die Bedingungen IS NULL bzw. IS NOT NULL in der ORDER BY-Klausel. Da Bedingungen, die wahr sind, höher als das Gegenteil sortiert werden, bewirkt die folgende Abfrage, dass die NULL-Spalten zuerst gelistet werden:&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      (spalte IS NOT NULL)&lt;br /&gt;
&lt;br /&gt;
Ab PostreSQL 8.3 und höher, ist es möglich das standardisierte NULLS FIRST/NULLS LAST zu verwenden um die Position der NULL-Werte im Ergebnis zu bestimmen. (bei FIRST stehen diese zu erst, bei LAST am Ende)&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tab&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      col NULLS FIRST;&lt;br /&gt;
&lt;br /&gt;
=== Was ist der Unterschied zwischen den verschiedenen CHAR-Typen? ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Typ&lt;br /&gt;
!interner Name&lt;br /&gt;
!Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
|VARCHAR(n) &lt;br /&gt;
|varchar&lt;br /&gt;
|die Größe legt die Maximallänge fest; kein Auffüllen mit Leerzeichen&lt;br /&gt;
|-  &lt;br /&gt;
|CHAR(n)&lt;br /&gt;
|bpchar&lt;br /&gt;
|mit Leerzeichen gefüllt bis zur angegebenen Länge&lt;br /&gt;
|-&lt;br /&gt;
|TEXT&lt;br /&gt;
|text&lt;br /&gt;
|keine obere Grenze für die Länge&lt;br /&gt;
|-&lt;br /&gt;
|BYTEA&lt;br /&gt;
|bytea&lt;br /&gt;
|Bytearray mit variabler Länge (auch für '\0'-Bytes geeignet)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;char&amp;quot; (with the quotes)&lt;br /&gt;
|char&lt;br /&gt;
|ein Zeichen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der interne Name kommt vor allem in den Systemkatalogen und in manchen&lt;br /&gt;
Fehlermeldungen vor.&lt;br /&gt;
&lt;br /&gt;
Die ersten vier Typen sind &amp;quot;varlena&amp;quot;-Typen (d.h. die ersten vier Bytes&lt;br /&gt;
geben die Länge an, gefolgt von den Daten). Daher ist der tatsächlich&lt;br /&gt;
belegte Platz immer etwas mehr als die deklarierte Feldgröße.&lt;br /&gt;
Allerdings wird unter Umständen auf diese Datentypen Datenkompression&lt;br /&gt;
durch das TOAST- Verfahren angewendet, womit der tatsächlich belegte&lt;br /&gt;
Platz auch geringer als erwartet ausfallen kann.&lt;br /&gt;
&lt;br /&gt;
Für die Speicherung von Zeichenketten variabler Länge empfiehlt sich&lt;br /&gt;
VARCHAR(n). Die maximale Länge eines VARCHAR(n)-Felds wird bei der&lt;br /&gt;
Tabellendefinition festgelegt. TEXT setzt keine Längengrenze,&lt;br /&gt;
allerdings gibt es eine systembedingte Obergrenze von 1 GB.&lt;br /&gt;
&lt;br /&gt;
CHAR(n) ist geeignet für die Speicherung von Zeichenketten, die alle&lt;br /&gt;
die gleiche Länge haben. Bitte beachten Sie, dass CHAR(n) automatisch&lt;br /&gt;
Zeichenketten bis zur definierten Feldlänge mit Leerzeichen ausfüllt,&lt;br /&gt;
während bei VARCHAR(n) nur die tatsächlich eingegebene Zeichenkette&lt;br /&gt;
gespeichert wird.&lt;br /&gt;
&lt;br /&gt;
BYTEA ist für binäre Daten, besonders für Werte, die NULL-Bytes haben.&lt;br /&gt;
&lt;br /&gt;
Alle der hier erwähnten Typen weisen ähnliche Performanzeigenschaften&lt;br /&gt;
auf.&lt;br /&gt;
&lt;br /&gt;
=== Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Wert? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet einen SERIAL-Datentyp. Dies ist zwar kein richtiger Datentyp. Es ist die Kurzform für das Erstellen einer Spalte vom Typ Integer, die von einer Sequenz befüllt wird. &lt;br /&gt;
&lt;br /&gt;
Zum Beispiel:&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
       id   SERIAL,&lt;br /&gt;
       name TEXT&lt;br /&gt;
   )&lt;br /&gt;
&lt;br /&gt;
wird automatisch in:&lt;br /&gt;
   CREATE SEQUENCE person_id_seq;&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
     id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),&lt;br /&gt;
     name TEXT&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Die automatisch generierte Sequenz besitzt immer folgenden Namen:&lt;br /&gt;
''tabellederspalte''-''namederspalte''_seq&lt;br /&gt;
&lt;br /&gt;
Die Man-Page zu CREATE SEQUENCE beinhaltet mehr Informationen zu Sequenzen.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einen Typ BIGSERIAL, dieser unterscheidet sich aber nur darin dass die Spalte den Typ BIGINTEGER bekommt. BIGSERIAL sollte verwendet werden wenn es zu erwarten ist, dass mehr als 2 Milliarden Sequenz-Werte verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie bekomme ich den Wert einer SERIAL-Sequenz? ===&lt;br /&gt;
  &lt;br /&gt;
Eine Möglichkeit wäre, mit der nextval()-Funktion den nächsten SERIAL-Wert von dem Sequenzobjekt vor der Auszuführung einer INSERT-Anweisung anzufordern und ihn dann explizit in die INSERT-Anweisung einzubinden. Anhand der Beispieltabelle in 4.11.1 könnte dieser Vorgang in einer Pseudosprache so aussehen:&lt;br /&gt;
&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT nextval('person_id_seq')&amp;quot;);&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Danach stünde der neue Wert in der Variablen new_id für die Verwendung in weiteren Abfragen zur Verfügung, zum Beispiel als Fremdschlüssel zur Tabelle 'person'). Bitte beachten Sie, dass der Name des automatisch erstellten SEQUENCE-Objektes folgenden Name hat: «table»_«serialcolumn»_seq wobei 'table' und 'serialcolumn' die Namen&lt;br /&gt;
der jeweils betreffenden Tabelle / Spalte darstellen.&lt;br /&gt;
&lt;br /&gt;
Als weitere Möglichkeit können Sie nach einer INSERT-Anweisung den automatisch eingefügten SERIAL-Wert mit der currval()-Funktion zurückgeben lassen:&lt;br /&gt;
&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT currval('person_id_seq')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Die einfachste Möglichkeit ist es RETURNING zu verwenden. Ein einfaches Beispiel sähe so aus:&lt;br /&gt;
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;&lt;br /&gt;
&lt;br /&gt;
=== Führt currval() zu einer Race-Condition mit anderen Nutzern? ===&lt;br /&gt;
  &lt;br /&gt;
Nein. currval() liefert einen Wert zurück, der von Ihrer&lt;br /&gt;
Datenbank-Session bestimmt wird, und der anderen Sessionen nicht zur&lt;br /&gt;
Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner Sequenz-/SERIAL-Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Um die gleichzeitige Abarbeitung von Transaktionen zu verbessern,&lt;br /&gt;
werden Sequenzen gerade nicht für andere Transaktionen gesperrt,&lt;br /&gt;
sondern die Sequenznummern werden den laufenden Transaktionen sofort&lt;br /&gt;
zugeteilt. Lücken in der Sequenznummerierung werden durch abgebrochene&lt;br /&gt;
Transaktionen verursacht.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein OID? ===&lt;br /&gt;
  &lt;br /&gt;
Jede Zeile, die in PostgreSQL erzeugt wird, bekommt eine eindeutige OID, sofern die Tabelle nicht mit der Option WITHOUT OIDS angelegt wurde. OIDs sind automatisch zugewiesene 4-Byte-Integer, die innerhalb der gesamten Datenbank einmalig sind. Allerdings laufen sie bei einem Wert von ungefähr 4 Milliarden über. PostgreSQL verwendet OIDs, um&lt;br /&gt;
seine interne Systemtabellen zu verbinden.&lt;br /&gt;
&lt;br /&gt;
Um einmalige Idenfikatoren in Datentabellen zu erstellen, wird allerdings empfohlen, statt OIDs Werte zu verwenden, die von SERIAL-Sequenzen erzeugt werden. SERIAL-Sequenzen sind innerhalb einer Tabelle einmalig und daher weniger anfällig für Überläufe. Außerdem können 8-Byte-Sequenzwerte mit BIGSERIAL (SERIAL8) erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein CTID? ===&lt;br /&gt;
&lt;br /&gt;
CTIDs werden benutzt, um bestimmte physikalische Zeilen durch Block und Offset Werte zu identifizieren. CTIDs verändern sich, sobald Zeilen verändert oder zurückgeladen werden. Sie werden in Indexeinträgen benutzt um auf die physikalischen Zeilen zu zeigen.&lt;br /&gt;
&lt;br /&gt;
=== Wieso bekomme ich einen Fehler: &amp;quot;ERROR: Memory exhausted in AllocSetAlloc()&amp;quot;? ===&lt;br /&gt;
  &lt;br /&gt;
Wahrscheinlich gibt es keinen virtuellen Speicher mehr in Ihrem System&lt;br /&gt;
oder Ihr Kernel hat niedrige Höchstgrenzen für bestimmte Ressourcen.&lt;br /&gt;
Probieren Sie vor dem Start von postmaster folgendes:&lt;br /&gt;
   ulimit -d 262144&lt;br /&gt;
   limit datasize 256m&lt;br /&gt;
&lt;br /&gt;
Je nach benutzter Shell wird nur einer dieser Befehle erfolgreich&lt;br /&gt;
ausgeführt werden. Auf jedem Fall wird die Grenze des Datensegments&lt;br /&gt;
für Prozesse erhöht werden und eventuell die erfolgreiche Ausführung&lt;br /&gt;
der Abfrage ermöglichen. Falls Sie ein Problem mit dem SQL-Client&lt;br /&gt;
haben, weil das Backend zu viele Daten zurückliefert, versuchen Sie&lt;br /&gt;
dies vor dem Start des SQL-Clients.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft? ===&lt;br /&gt;
  &lt;br /&gt;
Geben Sie in psql SELECT VERSION(); ein.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine Spalte erstellen, deren Default-Wert immer die aktuelle Uhrzeit enthalten soll? ===&lt;br /&gt;
  &lt;br /&gt;
Dazu verwenden Sie CURRENT_TIMESTAMP:&lt;br /&gt;
   CREATE TABLE test (x INT, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );&lt;br /&gt;
&lt;br /&gt;
=== Wie führe ich eine OUTER JOIN durch? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt OUTER JOINs nach dem SQL- Standardsyntax. Hier&lt;br /&gt;
zwei Beispiele:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 ON (t1.spalte = t2.spalte)&lt;br /&gt;
&lt;br /&gt;
bzw.:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 USING (spalte)&lt;br /&gt;
&lt;br /&gt;
Diese identischen Abfragen verknüpfen tabelle_1 mit tabelle_2 über die&lt;br /&gt;
Spalte 'spalte' und geben außerdem alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_1 (diejenigen, die keine Entsprechung in tabelle_2 haben)&lt;br /&gt;
zurück. Ein RIGHT JOIN würde hingegen alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_2 hinzufügen und ein FULL JOIN würde alle verknüpften Zeilen&lt;br /&gt;
sowie jeweils alle unverknüpften Zeilen aus den beiden Tabellen&lt;br /&gt;
zurückliefern. Die Angabe von OUTER ist nicht zwingend und kann in&lt;br /&gt;
LEFT, RIGHT und FULL-Verknüpfungen weggelassen werden. Normale&lt;br /&gt;
Verknüpfungen sind INNER JOINs.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt keinen Weg, innerhalb einer Abfrage auf mehr als eine&lt;br /&gt;
Datenbank zuzugreifen. Da PostgreSQL datenbank-spezifische&lt;br /&gt;
Systemkataloge lädt, ist eine datenbankübergreifende Abfrage nicht&lt;br /&gt;
möglich.&lt;br /&gt;
&lt;br /&gt;
contrib/dblink ist eine Erweiterung, die datenbankübergreifende&lt;br /&gt;
Abfragen über Funktionsaufrufe ermöglicht.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion zurückgeben lassen? ===&lt;br /&gt;
  &lt;br /&gt;
Funktionen können mehrere Zeilen und Spalten zurückgeben, vgl.:&lt;br /&gt;
http://www.postgresql.org/docs/techdocs.17.&lt;br /&gt;
&lt;br /&gt;
=== Warum bekomme ich eine Fehlermeldung wie &amp;quot;relation with OID ##### does not exist&amp;quot; wenn ich temporäre Tabellen in PL/PgSQL-Funktionen benutze? ===&lt;br /&gt;
  &lt;br /&gt;
In PostgreSQL-Versionen vor 8.3 verarbeitet PL/PgSQL Funktionen in&lt;br /&gt;
einer Cache. Dies hat eine unangenehme Nebenwirkung, nämlich dass wenn&lt;br /&gt;
eine PL/PgSQL-Funktion auf eine temporäre Tabelle zugreift, und diese&lt;br /&gt;
Tabelle anschließend gelöscht bzw. neu erstellt wird, die Funktion&lt;br /&gt;
fehlschlagen wird, da die gecachten Funktionsinhalte noch auf die alte&lt;br /&gt;
temporäre Tabelle zeigen. Die Lösung für diese Probleme besteht darin,&lt;br /&gt;
in der PL/PgSQL- Funktion mittels EXECUTE auf temporäre Tabellen&lt;br /&gt;
zuzugreifen. Dies bewirkt, dass bei jedem Funktionsruf die betreffende&lt;br /&gt;
Abfrage neu geparst wird.&lt;br /&gt;
&lt;br /&gt;
Dieses Problem taucht in PostgreSQL 8.3 und späteren Versionen nicht&lt;br /&gt;
mehr auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Replikationslösungen gibt es? ===&lt;br /&gt;
  &lt;br /&gt;
Der Begriff &amp;quot;replikation&amp;quot; umfasst mehrere verschiedene Technologien,&lt;br /&gt;
jede mit eigenen Vor- und Nachteilen. [http://www.postgresql.org/docs/8.3/static/high-availability.html| Die Dokumentation enthält eine gute Einführung in das Thema Replikation]&lt;br /&gt;
&lt;br /&gt;
Mit &amp;quot;Master/slave&amp;quot;-Replikation werden Änderungen in einer&lt;br /&gt;
Hauptdatenbank durchgeführt und an &amp;quot;Sklaven&amp;quot; verteilt, die im&lt;br /&gt;
Nur-Lese-Modus arbeiten. Die populärste Lösung für PostgreSQL ist&lt;br /&gt;
Slony-I.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Multi-master replication&amp;quot; ermöglicht sowohl lesende als auch&lt;br /&gt;
schreibende Zugriffe über mehrere Datenbank-Server hinweg. Allerdings&lt;br /&gt;
hat diese Art von Replikation eine negative Auswirkung auf die&lt;br /&gt;
Performanz durch die Notwendigkeit, Änderungen zwischen Servern zu&lt;br /&gt;
synchronisieren. Pgcluster ist die populärste freie Lösung für&lt;br /&gt;
PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einige kommerzielle und hardware-basierte&lt;br /&gt;
Replikationslösungen für verschiedene Arten der Replikation.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Tabellen- und Spaltennamen in meiner Abfrage nicht erkannt? Warum werden Großbuchstaben umgewandelt? ===&lt;br /&gt;
  &lt;br /&gt;
Die häufigste Ursache ist die Verwendung von Gänsefüßchen bei der&lt;br /&gt;
Anlegung von Tabellen, z.B.:&lt;br /&gt;
    CREATE TABLE &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
                (&amp;quot;SPALTE1&amp;quot; INT)&lt;br /&gt;
&lt;br /&gt;
Dadurch werden Tabellen- und Spaltennamen (sog. Identifikatoren) in&lt;br /&gt;
genau der Schreibweise gespeichert (vgl. Dokumentation), was dazu&lt;br /&gt;
führt, dass man sie danach immer in Gänsefüßchen angeben muss. Im&lt;br /&gt;
obigen Beispiel muss man also immer etwa SELECT * FROM &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
verwenden. Um dieses Problem zu vermeiden, müssen Sie immer eines der&lt;br /&gt;
folgenden Punkte beachten:&lt;br /&gt;
&lt;br /&gt;
* bei der Tabellenanlegung keine Gänsefüßchen verwenden;&lt;br /&gt;
* in Identifikatoren nur Kleinschreibung verwenden;&lt;br /&gt;
* immer Identifikatoren mit Gänsefüßchen versehen&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen des Übersetzers ==&lt;br /&gt;
  &lt;br /&gt;
Die englische Vorlage dieser FAQ wird ständig überarbeitet. Daher&lt;br /&gt;
liegt die Übersetzung nicht immer auf dem aktuellsten Stand.&lt;br /&gt;
&lt;br /&gt;
Die aktuellste Version der deutschen Übersetzung befindet sich immer&lt;br /&gt;
unter http://sql-info.de/de/postgresql/FAQ_german.html. Diese&lt;br /&gt;
&amp;quot;Arbeitsversion&amp;quot; enthält eventuell Änderungen, die noch nicht auf der&lt;br /&gt;
PostgreSQL-Website eingebunden worden sind.&lt;br /&gt;
&lt;br /&gt;
Über Verbesserungshinweise und Korrekturvorschläge sowie&lt;br /&gt;
Verständnisfragen zum Inhalt der FAQ freue ich mich. Ich nehme auch&lt;br /&gt;
allgemeine Fragen zu PostgreSQL gerne entgegen, verweise jedoch auf&lt;br /&gt;
die Mailing-Listen als schnelle und zuverlässige Anlaufstellen.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/FAQ/de</id>
		<title>FAQ/de</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/FAQ/de"/>
				<updated>2011-12-06T18:41:05Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;/* Kommt PostgreSQL mit den Anpassungen der Sommerzeit in verschiedenen Ländern klar? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Was ist PostgreSQL? Wie wird es ausgesprochen? ===&lt;br /&gt;
  &lt;br /&gt;
Die (englische) Aussprache ist &amp;quot;Post-Gres-Q-L&amp;quot;. Im allgemeinen&lt;br /&gt;
Sprachgebrauch hat sich die Kurzform &amp;quot;Postgres&amp;quot; auch durchgesetzt.&lt;br /&gt;
(Für diejenigen, die es interessiert: eine MP3-Datei mit der&lt;br /&gt;
amerikanischen Aussprache befindet sich hier:&lt;br /&gt;
http://www.postgresql.org/files/postgresql.mp3&lt;br /&gt;
&lt;br /&gt;
PostgreSQL ist ein objektrelationales Datenbanksystem, das die Vorzüge&lt;br /&gt;
von kommerziellen Datenbanksystemen mit zukunftsweisenden Innovationen&lt;br /&gt;
kombiniert. PostgreSQL ist freie Software und dessen kompletter&lt;br /&gt;
Quellcode ist öffentlich verfügbar.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Entwicklung wird von einem Team von meist freiwilligen&lt;br /&gt;
Entwicklern durchgeführt. Dieses Team ist für die Gesamtentwicklung&lt;br /&gt;
von PostgreSQL verantwortlich. Es handelt sich um ein&lt;br /&gt;
Gemeinschaftsprojekt, das nicht von einer bestimmten Firma&lt;br /&gt;
kontrolliert wird. Lesen Sie die Entwickler-FAQ:&lt;br /&gt;
http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn Sie an einer&lt;br /&gt;
Mitarbeit interessiert sind.&lt;br /&gt;
&lt;br /&gt;
=== Wer kontrolliert PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Falls Sie nach dem Namen eines etwaigen Inhabers bzw. nach einem&lt;br /&gt;
allmächtigen Zentralkommittee suchen - sparen Sie sich die Mühe, sowas&lt;br /&gt;
existiert gar nicht. Es gibt zwar das &amp;quot;Core Committee&amp;quot; sowie&lt;br /&gt;
Entwickler, die CVS-Schreibberechtigung haben, jedoch haben diese&lt;br /&gt;
Gruppen eher nur eine administrative Rolle. Das Projekt wird durch die&lt;br /&gt;
Community gesteuert, die aus den Entwicklern sowie natürlich auch den&lt;br /&gt;
Nutzern besteht - jeder kann daran teilnehmen. (Lesen Sie die&lt;br /&gt;
Entwickler-FAQ: http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn&lt;br /&gt;
Sie an der PostgreSQL-Entwicklung teilnehmen möchten).&lt;br /&gt;
&lt;br /&gt;
=== Welchem Copyright unterliegt PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL wird unter der klassischen BSD-Lizenz herausgegeben. Im&lt;br /&gt;
Grunde genommen erlaubt diese den Nutzern, beliebig mit dem Code&lt;br /&gt;
umzugehen, auch der Weiterverkauf von Binärversionen ohne Quellcode&lt;br /&gt;
ist erlaubt. Die einzige Einschränkung besteht darin, dass PostgreSQL&lt;br /&gt;
auf keinen Fall für etwaige Probleme mit der Software haftet. Außerdem&lt;br /&gt;
muß der Copyright- Text in allen Kopien der Software enthalten sein.&lt;br /&gt;
Dies ist der Originaltext der BSD-Lizenz:&lt;br /&gt;
 &lt;br /&gt;
 PostgreSQL Data Base Management System&lt;br /&gt;
 &lt;br /&gt;
 Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group&lt;br /&gt;
 Portions Copyright (c) 1994-6 Regents of the University of California&lt;br /&gt;
 &lt;br /&gt;
 Permission to use, copy, modify, and distribute this software and its&lt;br /&gt;
 documentation for any purpose, without fee, and without a written&lt;br /&gt;
 agreement is hereby granted, provided that the above copyright notice&lt;br /&gt;
 and this paragraph and the following two paragraphs appear in all&lt;br /&gt;
 copies.&lt;br /&gt;
 &lt;br /&gt;
 IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY&lt;br /&gt;
 FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,&lt;br /&gt;
 INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND&lt;br /&gt;
 ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN&lt;br /&gt;
 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 &lt;br /&gt;
 THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,&lt;br /&gt;
 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF&lt;br /&gt;
 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE&lt;br /&gt;
 PROVIDED HEREUNDER IS ON AN &amp;quot;AS IS&amp;quot; BASIS, AND THE UNIVERSITY OF&lt;br /&gt;
 CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,&lt;br /&gt;
 UPDATES, ENHANCEMENTS, OR MODIFICATIONS.&lt;br /&gt;
&lt;br /&gt;
Es gilt die Copyright-Klausel im Original!&lt;br /&gt;
&lt;br /&gt;
=== Auf welchen Plattformen läuft PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Normalerweise kann PostgreSQL auf jeder modernen UNIX-kompatiblen&lt;br /&gt;
Plattform eingesetzt werden. Diejenigen Plattformen, die bei der&lt;br /&gt;
jeweiligen Versionsfreigabe getestet wurden, sind in den&lt;br /&gt;
Installationsanleitungen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
PostgreSQL läuft auch auf Microsoft NT-basierten Betriebssystemen wie&lt;br /&gt;
Windows 2000 SP4, XP und Server 2003. Ein vorgefertigtes&lt;br /&gt;
Installationspaket kann von http://pgfoundry.org/projects/pginstaller&lt;br /&gt;
heruntergeladen werden. DOS-basierte Windows-Versionen (Win95, Win98,&lt;br /&gt;
WinMe) können PostgreSQL nur mit Hilfe der Cygwin-Umgebung ausführen.&lt;br /&gt;
&lt;br /&gt;
=== Woher bekomme ich PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Per Web-Browser hier: http://www.postgresql.org/ftp/ und per FTP hier:&lt;br /&gt;
ftp://ftp.postgresql.org/pub/.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die neueste Version von PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die neueste Version von PostgreSQL kann auf der [http://www.postgresql.org/ Website] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Die Freigabe einer neuen Hauptversion erfolgt in der Regel jährlich, kleinere Korrekturversionen alle paar Monaten. Die kleineren Updates werden &amp;quot;Minor&amp;quot;-Updates, die großen jährlich erscheinenden &amp;quot;Major&amp;quot;-Updates genannt. &amp;quot;Minor&amp;quot;-Update erscheinen in der Regel gleichzeitig für alle unterstützten &amp;quot;Major&amp;quot;-Versionen. [http://www.postgresql.org/support/versioning Falls Sie dieses Thema interessiert sollten Sie hier weiterlesen.]&lt;br /&gt;
&lt;br /&gt;
=== Wo bekomme ich Support für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Community bietet Unterstützung per Mailing-Liste. Die&lt;br /&gt;
Web-Seite http://www.postgresql.org/community/lists/ bietet einen&lt;br /&gt;
Überblick. Die Listen general und bugs bieten einen guten Einstieg.&lt;br /&gt;
&lt;br /&gt;
Eine deutschsprachige Mailing-Liste gibt es hier:&lt;br /&gt;
http://archives.postgresql.org/pgsql-de-allgemein/.&lt;br /&gt;
&lt;br /&gt;
Der wichtigsten IRC-Channel ist #postgresql auf Freenode&lt;br /&gt;
(irc.freenode.net). Unter UNIX/Linux können Sie mit z.B. irc -c&lt;br /&gt;
'#postgresql' &amp;quot;$USER&amp;quot; irc.freenode.net. daran teilnehmen. Auf Freenode&lt;br /&gt;
gibt es folgende Channels:&lt;br /&gt;
* #postgresql-es (spanisch)&lt;br /&gt;
* #postgresqlfr (französischen)&lt;br /&gt;
* #postgresql-br (brasilianischen) &lt;br /&gt;
&lt;br /&gt;
Es gibt außerdem einen PostgreSQL-Channel bei EFNet.&lt;br /&gt;
&lt;br /&gt;
Eine Liste von Unternehmen, die Support für PostgreSQL auf kommerzieller Basis leisten, kann unter http://www.postgresql.org/support/professional_support eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich einen Fehlerbericht abgeben? ===&lt;br /&gt;
  &lt;br /&gt;
Nutzen Sie das Formular unter&lt;br /&gt;
http://www.postgresql.org/support/submitbug. Schauen Sie aber vorher&lt;br /&gt;
unter ftp://ftp.postgresql.org/pub/ nach, ob es mittlerweile eine&lt;br /&gt;
neuere PostgreSQL-Version gibt, in der der Fehler behoben wurde.&lt;br /&gt;
&lt;br /&gt;
Bugs, die über das Formular bzw. eine der Mailing-Listen&lt;br /&gt;
bekanntgegeben wurden, erhalten typischerweise einer der folgenden&lt;br /&gt;
Reaktionen:&lt;br /&gt;
&lt;br /&gt;
* es ist kein Bug, der Grund wird benannt&lt;br /&gt;
* es ist ein bereits bekannter Bug, der bereits auf der TODO-Liste aufgenommen wurde&lt;br /&gt;
* der Bug wurde in der aktuellen Version behoben&lt;br /&gt;
* der Bug wurde bereits behoben, befindet sich aber noch nicht in einer offiziell veröffentlichten Version&lt;br /&gt;
* es wird um eingehendere Informationen gebeten, z.B.:&lt;br /&gt;
** Betriebssystem&lt;br /&gt;
** PostgreSQL-Version&lt;br /&gt;
** reproduzierbares Fallbeispiel&lt;br /&gt;
** Debugging-Information&lt;br /&gt;
** Debugger-Backtrace-Ausgabe&lt;br /&gt;
* der Bug ist neu. Folgendes könnte passieren:&lt;br /&gt;
** ein Patch wird erstellt und in der nächsten Version eingebaut&lt;br /&gt;
** der Bug kann nicht sofort behoben werden und wird auf die TODO-Liste gesetzt&lt;br /&gt;
    &lt;br /&gt;
=== Wie erfahre ich von bekannten Bugs oder fehlenden Features? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt eine erweiterte Teilmenge von SQL:2003. Siehe&lt;br /&gt;
unsere TODO-Liste unter http://www.postgresql.org/docs/faqs.TODO.html&lt;br /&gt;
für eine Auflistung der bekannten Bugs, fehlenden Features und&lt;br /&gt;
zukünftigen Pläne.&lt;br /&gt;
&lt;br /&gt;
Eine Anfrage nach einem neuen Feature führt normalerweise zu einer der&lt;br /&gt;
folgenden Antworten:&lt;br /&gt;
&lt;br /&gt;
* das Feature ist bereits auf der TODO-Liste&lt;br /&gt;
* das Feature ist nicht wünschenswert, weil:&lt;br /&gt;
** es vorhandene Funktionalität dupliziert, welche bereits dem SQL-Standard folgt&lt;br /&gt;
** es würde die Komplexität der Code-Basis erhöhen, ohne nennenswerte Vorteile zu bringen&lt;br /&gt;
** es wäre unsicher bzw. unzuverlässig&lt;br /&gt;
* das neue Feature wird der TODO-Liste hinzugefügt&lt;br /&gt;
    &lt;br /&gt;
PostgreSQL verwendet kein Bugtracking-System, da es sich als effizienter erwiesen hat, E-Mails direkt zu beantworten und die TODO-Liste aktuell zu halten. In der Praxis werden Bugs sehr schnell beseitigt, und diejenigen Bugs, die Auswirkungen auf eine große Anzahl von Nutzern haben, werden meist kurzfristig korrigiert. Der einzige Überblick über alle Änderungen, Verbesserungen und Korrekturen in einer PostgreSQL-Version befindet sich in den CVS-Log-Meldungen. Auch die Release-Notes listen nicht jede Änderung in der Software auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Dokumentation ist für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet umfangreiche Dokumentation, darunter ein großes&lt;br /&gt;
Handbuch, man-Pages und einige kleine Testprogramme. Siehe das /doc-&lt;br /&gt;
Verzeichnis. Ausserdem sind alle Handbücher online unter&lt;br /&gt;
http://www.postgresql.org/docs/ verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Bücher zu PostgreSQL sind online verfügbar unter&lt;br /&gt;
http://www.postgresql.org/docs/books/awbook.html und&lt;br /&gt;
http://www.commandprompt.com/ppbook/ .&lt;br /&gt;
&lt;br /&gt;
Eine Liste lieferbarer PostgreSQL-Bücher befindet sich unter&lt;br /&gt;
http://www.postgresql.org/docs/books Diverse technische Artikel&lt;br /&gt;
befinden sich unter http://www.postgresql.org/docs/techdocs .&lt;br /&gt;
&lt;br /&gt;
psql hat einige nützliche \d-Befehle, um Informationen über Typen,&lt;br /&gt;
Operatoren, Funktionen, Aggregate, usw. zu zeigen.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Website enthält noch mehr Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich SQL lernen? ===&lt;br /&gt;
  &lt;br /&gt;
Die oben erwähnten PostgreSQL-spezifische Bücher bieten einen guten&lt;br /&gt;
Einstieg. Viele PostgreSQL-Anwender mögen &amp;quot;The Practical SQL Handbook&amp;quot;&lt;br /&gt;
(Bowman et al., Addison Wesley). Andere dagegen mögen &amp;quot;The Complete&lt;br /&gt;
Reference SQL&amp;quot; (Groff et al., McGraw-Hill).&lt;br /&gt;
&lt;br /&gt;
Es gibt ausserdem einige nützliche Online-Tutorials:&lt;br /&gt;
&lt;br /&gt;
* http://www.intermedia.net/support/sql/sqltut.shtm&lt;br /&gt;
* http://sqlcourse.com&lt;br /&gt;
* http://www.w3schools.com/sql/default.asp&lt;br /&gt;
* http://mysite.verizon.net/Graeme_Birchall/id1.html&lt;br /&gt;
    &lt;br /&gt;
=== Wie kann ich im Entwicklerteam mitarbeiten? ===&lt;br /&gt;
  &lt;br /&gt;
Lesen Sie in der Entwickler-FAQ unter&lt;br /&gt;
[[Developer_FAQ | Developer FAQ]] nach.&lt;br /&gt;
&lt;br /&gt;
=== Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt verschiedene Methoden, Software zu messen: Eigenschaften,&lt;br /&gt;
Performanz, Zuverlässigkeit, Support und Preis.&lt;br /&gt;
&lt;br /&gt;
==== Eigenschaften ====&lt;br /&gt;
&lt;br /&gt;
       PostgreSQL besitzt die meisten Eigenschaften - wie&lt;br /&gt;
       Transaktionen, Unterabfragen (Subqueries), Trigger, Views,&lt;br /&gt;
       referenzielle Integrität bei Fremdschlüsseln und verfeinertes&lt;br /&gt;
       Locking - die bei großen kommerziellen DBMS vorhanden sind. Es&lt;br /&gt;
       bietet außerdem einige anderen Eigenschaften, die diese nicht&lt;br /&gt;
       immer haben, wie benutzerbestimmte Typen, Vererbung, Regeln,&lt;br /&gt;
       und die Multi-Versionen-Steuerung zum Verringern&lt;br /&gt;
       konkurrierender Locks.&lt;br /&gt;
       &lt;br /&gt;
==== Performanz ====&lt;br /&gt;
       Die Performanz von PostgreSQL ist mit der von kommerziellen und&lt;br /&gt;
       anderen Open-Source-Datenbanken vergleichbar. In manchen&lt;br /&gt;
       Bereichen ist es schneller, in anderen langsamer. In der Regel&lt;br /&gt;
       beträgt der Unterschied +/-10%.&lt;br /&gt;
       &lt;br /&gt;
==== Zuverlässigkeit ====&lt;br /&gt;
       Es ist selbstredend, dass ein DBMS wertlos ist, wenn es nicht&lt;br /&gt;
       zuverlässig arbeitet. Daher bemühen wir uns, nur streng&lt;br /&gt;
       geprüften und beständigen Code freizugeben, der nur ein Minimum&lt;br /&gt;
       an Programmfehlern aufweist. Jede Freigabe hat mindestens einen&lt;br /&gt;
       Monat Betatest-Phase hinter sich, und unsere Freigabehistorie&lt;br /&gt;
       beweist, dass wir stabile und solide Versionen freigeben, die&lt;br /&gt;
       im Produktionsbetrieb genutzt werden können. Wir glauben, dass&lt;br /&gt;
       wir im Vergleich mit anderer Datenbanksoftware vorteilhaft&lt;br /&gt;
       dastehen.&lt;br /&gt;
       &lt;br /&gt;
==== Support ====&lt;br /&gt;
       Unsere Mailinglisten bieten die Möglichkeit, gemeinsam mit&lt;br /&gt;
       einer großen Gruppe von Entwicklern und Benutzern mögliche&lt;br /&gt;
       Probleme zu lösen. Wir können nicht immer eine Fehlerbehebung&lt;br /&gt;
       garantieren, kommerzielle DBMS tun dies aber auch nicht. Der&lt;br /&gt;
       direkte Kontakt zur Entwickler- und Benutzergemeinschaft und&lt;br /&gt;
       der Zugriff auf die Handbücher und den Quellcode ermöglicht&lt;br /&gt;
       einen im Vergleich zu anderen DBMS höherwertigeren Support. Es&lt;br /&gt;
       gibt jedoch auch Anbieter von kommerziellen Support-Leistungen&lt;br /&gt;
       (siehe FAQ-Punkt 1.7).&lt;br /&gt;
       &lt;br /&gt;
==== Preis ====&lt;br /&gt;
       PostgreSQL ist frei verfügbar, sowohl für die kommerzielle wie&lt;br /&gt;
       auch für die nicht-kommerzielle Nutzung. Sie können den&lt;br /&gt;
       PostgreSQL-Code ohne Einschränkungen (außer denjenigen, die in&lt;br /&gt;
       der oben angegebene BSD-artigen Lizenz erwähnt werden) in Ihr&lt;br /&gt;
       Produkt integrieren.&lt;br /&gt;
&lt;br /&gt;
=== Kann PostgreSQL eingebettet (embedded) werden? ===&lt;br /&gt;
PostgreSQL basiert auf einer Server/Client-Architektur, diese benötigt separate Prozesse für jeden Klient und Server, hinzukommen auch noch weitere &amp;quot;Helfer-Prozesse&amp;quot; (z. B. für autovacuum und stats-collector). Zwar können einige &amp;quot;embedded-Architekturen&amp;quot; diese Anforderungen erfüllen, aber wenn der Datenbank-Prozess innerhalb des Applikations-Prozesses laufen muss, kann PostgreSQL nicht verwendet werden. Dazu sollte man leichtere Datenbanken nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mich von einer Maillingliste abmelden? Wie verhindere ich es, dass ich doppelte E-Mails bekomme? ===&lt;br /&gt;
Majordomo ermöglicht es sich von allen Maillinglisten an- und abzumelden, ggf. müssen Sie sich zuerst ihr Majordomo-Passwort zuschicken lassen.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Maillinglisten sind so konfiguriert, dass Antworten an den ursprünglichen Autor und an die Maillingliste verschickt werden. Somit soll erreicht werden dass Benutzer immer schnellstmöglichst eine Antwort erhalten können. Diese Einstellungen können Sie auch über die Konfiguration von Majordomo ändern, ändern Sie dafür die Einstellung für ''eliminatecc''. Sie können auch einstellen dass Sie selbst keine Antwort auf Ihre eigenen E-Mails bekommen, ändern sie dafür die Einstellung für ''selfcopy''.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
&lt;br /&gt;
== Fragen zu Benutzerprogrammen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Welche Schnittstellen gibt es für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Installation stellt nur Schnittstellen für C und&lt;br /&gt;
Embedded C bereit. Alle weitere Schnittstellen sind unabhängige&lt;br /&gt;
Projekte, die einzeln heruntergeladen werden werden müssen. Diese&lt;br /&gt;
Trennung ermöglicht individuelle Entwickler-Teams und&lt;br /&gt;
Entwicklungszyklen für die jeweiligen Projekte.&lt;br /&gt;
&lt;br /&gt;
Einige Programmiersprachen wie PHP haben eine PostgreSQL-&lt;br /&gt;
Schnittstelle bereits eingebaut. Schnittstellen für Sprachen wie Perl,&lt;br /&gt;
TCL, Python und viele anderen sind unter http://gborg.postgresql.org&lt;br /&gt;
im Bereich Drivers/Interfaces verfügbar sowie per Internet-Suche.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann man PostgreSQL in einer Website nutzen? ===&lt;br /&gt;
  &lt;br /&gt;
Eine nette Einführung zu datenbank-gestützten Webseiten kann unter&lt;br /&gt;
http://www.webreview.com (engl.) eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Für die Web-Integration ist PHP eine ausgezeichnete Schnittstelle. PHP&lt;br /&gt;
gibt es bei http://www.php.net&lt;br /&gt;
&lt;br /&gt;
Desweiteren bietet sich die Perl-Schnittstelle mit CGI.pm&lt;br /&gt;
oder mod_perl auch an.&lt;br /&gt;
&lt;br /&gt;
=== Hat PostgreSQL eine grafische Benutzerschnittstelle? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt eine große Anzahl von GUI-Programmen für PostgreSQL - sowohl&lt;br /&gt;
kommerziell als auch Open-Source. [http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools Eine englische Liste befindet sich hier.]&lt;br /&gt;
&lt;br /&gt;
== Administrative Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql? ===&lt;br /&gt;
  &lt;br /&gt;
Bei der Ausführung von configure die Option --prefix mit dem Zielverzeichnis angeben.&lt;br /&gt;
&lt;br /&gt;
=== Wie regle ich Zugriffe von anderen Rechnern? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL ist standardmäßig so eingestellt, dass Verbindungen nur vom&lt;br /&gt;
lokalen Rechner über Unix Domain Sockets bzw. TCP/IP möglich sind.&lt;br /&gt;
Verbindungen von anderen Rechnern werden erst dann ermöglicht, wenn&lt;br /&gt;
Sie in der Datei postgresql.conf die Einstellung listen_addresses&lt;br /&gt;
anpassen, in der Datei $PGDATA/pg_hba.conf host-basierte&lt;br /&gt;
Authentifizierung einschalten und den Server neu starten.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine bessere Performanz erreichen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt drei große Bereiche, in denen Performanzverbesserungen erzielt&lt;br /&gt;
werden können:&lt;br /&gt;
&lt;br /&gt;
==== Abfrageoptimierung ====&lt;br /&gt;
Die Modifizierung von Abfragen kann eine bessere Performanz erzielen:&lt;br /&gt;
       &lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/indexes.html Erstellung von Indexen, einschliesslich partieller Indexe sowie Expressionsindexe]&lt;br /&gt;
* Einsatz von COPY anstelle multipler INSERT-Anweisungen&lt;br /&gt;
* Gruppierung von mehreren Abfragen innerhalb einer Transaktion, um Aufwand beim Abschluss von Transaktionen    einzusparen&lt;br /&gt;
* Einsatz von CLUSTER beim Holen von einer großen Anzahl von Datenreihen aus einem Index&lt;br /&gt;
* Einsatz von LIMIT, um eine Untermenge der Abfragenergebnisse zurückzuliefern&lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/sql-prepare.html Einsatz von vorbereiteten Befehlen (prepared queries)]&lt;br /&gt;
* Einsatz von ANALYZE, um die Datenbankstatistik für den Abfragenplaner aktuell zu halten&lt;br /&gt;
* [http://www.postgresql.org/docs/current/static/routine-vacuuming.html Regelmäßiger Einsatz von VACUUM bzw. pg_autovacuum (autovacuum ist seit Version 8.3 standardmäßig aktiviert)]&lt;br /&gt;
* Bei großen Datenveränderungen die Löschung von Indexen&lt;br /&gt;
&lt;br /&gt;
==== Server-Konfiguration ====&lt;br /&gt;
Einige Einstellungen in der Datei postgresql.conf wirken sich auf die Performanz aus. Das Handbuch enthält unter      http://www.postgresql.org/docs/current/static/runtime-config.html eine komplette Auflistung. &lt;br /&gt;
&lt;br /&gt;
Kommentare zu den jeweiligen Einstellungen gibt es unter http://www.varlena.com/varlena/GeneralBits/Tidbitsannotated_conf_e.html und http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.&lt;br /&gt;
       &lt;br /&gt;
==== Hardware-Auswahl ====&lt;br /&gt;
Die Auswirkung von Hardware auf Performanz wird unter http://momjian.us/main/writings/pgsql/hw_performance/index.html und http://www.powerpostgresql.com/PerfList/ erläutert.&lt;br /&gt;
       &lt;br /&gt;
=== Welche Debugging-Funktionen sind für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
Unter den Optionen für die Server-Konfigurierung gibt es zahlreiche&lt;br /&gt;
log_*-Variablen, die die Ausgabe von Abfrage- und Prozessstatistiken&lt;br /&gt;
ermöglichen. Diese können für Debugging-Zwecke sowie Performanz-Tests&lt;br /&gt;
sehr nützlich sein.&lt;br /&gt;
&lt;br /&gt;
=== Ich bekomme die Meldung &amp;quot;Sorry, too many clients&amp;quot;, wenn ich eine Verbindung aufzubauen versuche. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Ihr System hat die maximal zulässige Anzahl von Datenbankverbindungen&lt;br /&gt;
erreicht (Voreinstellung 100). Sie müssen die maximale Anzahl der&lt;br /&gt;
gleichzeitig ausführbaren Backend-Prozesse hochsetzen, indem Sie in&lt;br /&gt;
postgresql.conf den Wert max_connections ändern und den Server&lt;br /&gt;
neustarten.&lt;br /&gt;
&lt;br /&gt;
=== Wie wird PostgreSQL aktualisiert? ===&lt;br /&gt;
  &lt;br /&gt;
Allgemeine Informationen zur Aktualisierung von PostgreSQL gibt es auf&lt;br /&gt;
der Seite http://www.postgresql.org/support/versioning. Detaillierte&lt;br /&gt;
technische Informationen gibt es auf der Seite&lt;br /&gt;
http://www.postgresql.org/docs/current/static/install-upgrading.html&lt;br /&gt;
&lt;br /&gt;
=== Kommt PostgreSQL mit den Anpassungen der Sommerzeit in verschiedenen Ländern klar? ===&lt;br /&gt;
  &lt;br /&gt;
Für die Berücksichtigung der Sommerzeit verwendet PostgreSQL Seit dem Release 8.0 die weiterverbreitete tzdata-Datenbank (auch bekannt als &amp;quot;zoneinfo database&amp;quot; oder &amp;quot;[http://www.twinsun.com/tz/tz-link.htm Olzen timezone database]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jedes Update von PostgreSQL beinhaltet die aktuellen tzdata Dateien, daher sollte es reichen die Minor-Updates der eingesetzten Major Version im Auge zu behalten.&lt;br /&gt;
&lt;br /&gt;
Unter der Vorraussetzung dass das Betriebssystem diese Dateien schon in einer stets aktuellen Version vorbehält, ist es üblich, dass man diese Dateien verwendet. PostgreSQL bietet dazu eine compile-option an.&lt;br /&gt;
&lt;br /&gt;
=== Welche Hardware eignet sich für den Betrieb mit PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL läuft auf fast jeder Hardware-Kombination. Im PC-Bereich&lt;br /&gt;
gibt es allerdings sehr große Abweichungen in der Qualität. Für einen&lt;br /&gt;
Arbeitsplatz- oder Entwicklungsrechner mag dies nicht so bedeutend&lt;br /&gt;
sein, im Server-Betrieb jedoch lohnt sich auf jeden Fall die&lt;br /&gt;
Investition in teurere Bestandteile (Stichwörter ECC-Speicher, SCSI,&lt;br /&gt;
Hauptplatinen und Netzteile von namhaften Herstellern). Nutzen Sie&lt;br /&gt;
unsere Mailing-Listen, um Hardware-Optionen zu diskutieren.&lt;br /&gt;
&lt;br /&gt;
== Fragen zum Betrieb ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie wähle ich per SELECT-Anweisung nur die ersten paar Zeilen bzw. eine beliebige Zeile in einer Abfrage aus? ===&lt;br /&gt;
  &lt;br /&gt;
Wenn Sie bei der Ausführung der Abfrage die Anzahl der anzufordenden&lt;br /&gt;
Reihen bereits kennen, nutzen Sie LIMIT. Wenn die ORDER BY- Anweisung&lt;br /&gt;
mit einem Index verwendet wird, ist es möglich, dass die gesamte&lt;br /&gt;
Abfrage nicht ausgeführt werden muss. Wenn Sie die Anzahl der der&lt;br /&gt;
anzufordenden Reihen nicht kennen, verwenden Sie einen Cursor und&lt;br /&gt;
FETCH.&lt;br /&gt;
&lt;br /&gt;
Um eine beliebige Zeile auszuwählen, nutzen Sie ORDER BY random():&lt;br /&gt;
    SELECT spalte&lt;br /&gt;
      FROM tabelle&lt;br /&gt;
  ORDER BY random()&lt;br /&gt;
     LIMIT 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Wie finde ich heraus, welche Tabellen, Indexe, Datenbanken oder Benutzer in der Datenbank definiert sind? Wie bekomme ich die von psql verwendeten Abfragen? ===&lt;br /&gt;
  &lt;br /&gt;
In psql zeigt der Befehl \dt eine Liste der Datenbanktabellen. Weitere&lt;br /&gt;
psql-Befehle lassen sich mit \? anzeigen. Sie können sich die Datei&lt;br /&gt;
pgsql/src/bin/psql/describe.c mit dem Quellcode für psql ansehen. Sie&lt;br /&gt;
enthält die SQL-Abfragen, die die Backslash-Kommandos (\) ausführen.&lt;br /&gt;
Sie können psql auch mit der -E Option starten. Danach gibt psql die&lt;br /&gt;
Abfragen aus, die es bei der Ausführung der Befehle benutzt. Außerdem&lt;br /&gt;
biete PostgreSQL ein SQL-kompatibles INFORMATION SCHEMA, das&lt;br /&gt;
Metainformation über die Datenbank zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
Mit psql -l können Sie alle Datenbanken anzeigen lassen.&lt;br /&gt;
&lt;br /&gt;
Die Datei pgsql/src/tutorial/syscat.source enthält außerdem viele&lt;br /&gt;
SELECT- Abfragen, mit deren Hilfe man Information über die&lt;br /&gt;
Systemtabellen erhalten kann.&lt;br /&gt;
&lt;br /&gt;
=== Wie ändere ich den Datentyp einer Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Ab Version 8.0 kann der Datentyp einer Spalte mit ALTER TABLE ALTER&lt;br /&gt;
COLUMN TYPE geändert werden, sofern der neue Datentyp die Werte des&lt;br /&gt;
alten Datentype aufnehmen kann.&lt;br /&gt;
&lt;br /&gt;
Bei früheren Versionen gehen Sie wie folgt vor:&lt;br /&gt;
    BEGIN;&lt;br /&gt;
    ALTER TABLE tabelle ADD COLUMN neue_spalte neuer_datentyp;&lt;br /&gt;
    UPDATE tabelle SET neue_spalte = CAST(alte_spalte AS neuer_datentyp);&lt;br /&gt;
    ALTER TABLE tabelle DROP COLUMN alte_spalte;&lt;br /&gt;
    COMMIT;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Speicherplatz freizugeben, der von der gelöschten Spalte&lt;br /&gt;
verwendet wurde, führen Sie VACUUM FULL aus.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank? ===&lt;br /&gt;
  &lt;br /&gt;
Es bestehen folgende Obergrenzen:&lt;br /&gt;
 Maximale Größe eine Datenbank?           unbeschränkt (es existieren&lt;br /&gt;
                                            Datenbanken mit 32 TB)&lt;br /&gt;
 Maximale Größe einer Tabelle?            32 TB&lt;br /&gt;
 Maximale Größe einer Zeile?              400 GB&lt;br /&gt;
 Maximale Größe einer Spalte?             1 GB&lt;br /&gt;
 Maximale Anzahl von Zeilen in einer Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
 Maximale Anzahl von Spalten in einer Tabelle?&lt;br /&gt;
                                          250-1600 je nach Spaltentyp&lt;br /&gt;
 Maximale Anzahl von Indexen für eine Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich sind dies theoretische Werte, die oft durch die&lt;br /&gt;
verfügbaren Platten- und Speicherressourcen beschränkt werden. Extreme&lt;br /&gt;
Größen können zu Leistungseinbußen führen.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße von 32 TB benötigt keine&lt;br /&gt;
Large-File-Unterstützung im Betriebssystem. Große Tabellen werden in&lt;br /&gt;
Dateien mit einer Größe von je 1 GB aufgeteilt, wodurch etwaige&lt;br /&gt;
dateisystem-bedingte Beschränkungen nicht relevant sind.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße und die maximale Anzahl von Spalten können&lt;br /&gt;
vervierfacht werden, indem man die Default-Blockgröße auf 32 KB&lt;br /&gt;
heraufsetzt. Die Tabellengröße kann auch durch Tabellenpartitionierung&lt;br /&gt;
vergrößert werden.&lt;br /&gt;
&lt;br /&gt;
Eine Einschränkung ist, dass Indexe nur auf Spalten erstellt werden&lt;br /&gt;
können, die bis etwa 2.000 Zeichen groß sind. Um auf größere Spalten&lt;br /&gt;
eine UNIQUE-Constraint setzen zu können, nutzen Sie einen funktionalen&lt;br /&gt;
Index mit dem MD5-Hash-Wert der Spalte. Um innerhalb einer großen, mit&lt;br /&gt;
Text belegten Spalte suchen zu können, verwenden Sie einen&lt;br /&gt;
Volltext-Index.&lt;br /&gt;
&lt;br /&gt;
=== Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen Textdatei abzuspeichern? ===&lt;br /&gt;
  &lt;br /&gt;
Eine PostgreSQL-Datenbank kann beim Abspeichern einer einfachen&lt;br /&gt;
Textdatei bis zu fünfmal mehr Platz gegenüber der eigentlichen Größe&lt;br /&gt;
der Datei beanspruchen.&lt;br /&gt;
&lt;br /&gt;
Betrachten wir eine Datei mit 100.000 Zeilen mit einem Integer und&lt;br /&gt;
einer Textbeschreibung pro Zeile. Gehen wir davon aus, dass die&lt;br /&gt;
durchschnittliche Länge der Textbeschreibung 20 Byte beträgt. Die&lt;br /&gt;
einfache Datei würde 2,8 MB groß sein. Die Größe der&lt;br /&gt;
PostgreSQL-Datenbankdatei, die diese Daten enthält, liegt ungefähr bei&lt;br /&gt;
5,2 MB:&lt;br /&gt;
 24 Bytes: jeder Zeilenkopf (ungefähr)&lt;br /&gt;
+24 Bytes: ein Integer-Feld und ein Textfeld&lt;br /&gt;
+ 4 Bytes: Zeiger auf der Datenseite auf den Tupel&lt;br /&gt;
-----------------------------------------------&lt;br /&gt;
 52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
Die Größe einer Datenseite in PostgreSQL beträgt 8192 Bytes (8 KB),&lt;br /&gt;
also:&lt;br /&gt;
8192 Bytes pro Seite&lt;br /&gt;
---------------------   =  146 Zeilen pro Seite (abgerundet)&lt;br /&gt;
  52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
100.000 Datenzeilen&lt;br /&gt;
------------------------  =  685 Datenbankseiten (aufgerundet)&lt;br /&gt;
    158 Zeilen pro Seite&lt;br /&gt;
&lt;br /&gt;
633 Datenbankseiten * 8192 Bytes pro Seite  =  5,185,536 bytes (5,2 MB)&lt;br /&gt;
&lt;br /&gt;
Indexe beanspruchen nicht so viel Platz. Da sie jedoch die Daten&lt;br /&gt;
beinhalten, die sie indizieren, können auch sie sehr groß werden.&lt;br /&gt;
&lt;br /&gt;
NULL-Werte werden als Bitmaps gespeichert, wodurch sie sehr wenig&lt;br /&gt;
Platz in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Meine Abfragen sind langsam oder benutzen die Indexe nicht. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Indexe werden nicht automatisch bei jeder Abfrage verwendet. Indexe&lt;br /&gt;
werden nur dann verwendet, wenn die abzufragende Tabelle eine&lt;br /&gt;
bestimmte Größe übersteigt, und die Abfrage nur eine kleine&lt;br /&gt;
Prozentzahl der Tabellenzeilen abfragt. Der Grund hierfür ist der,&lt;br /&gt;
dass die durch einen Index verursachten Festplattenzugriffe manchmal&lt;br /&gt;
länger dauern würden als ein einfaches Auslesen aller Tabellenzeilen&lt;br /&gt;
(sequentieller Scan).&lt;br /&gt;
&lt;br /&gt;
Um festzustellen, ob ein Index verwendet werden soll, braucht&lt;br /&gt;
PostgreSQL Statistiken über die Tabelle. Diese Statistiken werden&lt;br /&gt;
durch die Anweisungen VACUUM ANALYZE bzw. ANALYZE berechnet. Anhand&lt;br /&gt;
der Statistiken kennt der Abfragenoptimierer die Anzahl der&lt;br /&gt;
Tabellenzeilen und kann besser entscheiden, ob Indexe verwendet werden&lt;br /&gt;
sollen. Statistiken sind auch bei der Ermittlung der optimalen&lt;br /&gt;
JOIN-Reihenfolgen und -Methoden wertvoll. Daher sollten diese&lt;br /&gt;
regelmässig durchgeführt werden, da sich der Inhalt einer Tabelle ja&lt;br /&gt;
auch verändert.&lt;br /&gt;
&lt;br /&gt;
Indexe werden normalerweise nicht in ORDER BY-Abfrage oder in JOINs&lt;br /&gt;
verwendet. Ein sequentieller Scan mit anschließendem explizitem&lt;br /&gt;
Sortiervorgang ist normalerweise schneller als ein Index-Scan einer&lt;br /&gt;
großen Tabelle. Jedoch wird bei einer Abfrage, in der LIMIT zusammen&lt;br /&gt;
mit ORDER BY verwendet wird, oftmals ein Index verwendet, da nur ein&lt;br /&gt;
kleiner Abschnitt der Tabelle zurückgeliefert wird.&lt;br /&gt;
&lt;br /&gt;
Sollte es danach aussehen, also ob der Optimierer irrtümlich einen&lt;br /&gt;
sequentiellen Scan ausführt, führen Sie SET enable_seqscan TO 'off'&lt;br /&gt;
aus und prüfen Sie, ob die Indexabfrage dadurch scheller geworden ist.&lt;br /&gt;
&lt;br /&gt;
Bei der Nutzung von Wildcard-Operatoren wie LIKE oder ~, können Indexe&lt;br /&gt;
nur unter bestimmten Umständen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
* Das Suchmuster muss sich an Anfang des Strings befinden, d.h.:&lt;br /&gt;
** LIKE-Suchmuster dürfen nicht mit % anfangen;&lt;br /&gt;
** ~ (reguläre Ausdrücke) müssen mit ^ anfangen.&lt;br /&gt;
* Das Suchmuster darf nicht mit einer Zeichenklasse (z.B. [a-e]) beginnen.&lt;br /&gt;
* Suchmuster, die Gross- und Kleinschreibung nicht berücksichtigen (z.B. ILIKE bzw. ~*), verwenden keine Indexe. Stattdessen können funktionale Indexe verwendet werden, die im Punkt 4.8 beschrieben werden.&lt;br /&gt;
* Die Standard-Locale &amp;quot;C&amp;quot; muss während der Datenbank-Initialisierung mit initdb verwendet worden sein, da andere locales den nächstgrößten Wert nicht ermitteln können. Es ist allerdings möglich, einen besonderen text_pattern_ops-Index für solche Fälle zu erstellen.&lt;br /&gt;
    &lt;br /&gt;
In Versionen vor 8.0 werden Indexe oft nicht benutzt, wenn die&lt;br /&gt;
jeweiligen Datentypen nicht genau übereinstimmen. Dies gilt besonders&lt;br /&gt;
für Indexe auf Spalten mit den Datentypen INT2, INT8 und NUMERIC&lt;br /&gt;
&lt;br /&gt;
=== Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine Abfrage auswertet? ===&lt;br /&gt;
  &lt;br /&gt;
Eine ausführliche Erklärung zu diesem Thema findet sich in der [http://www.postgresql.org/docs/current/static/sql-explain.html EXPLAIN] Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie änder ich das Sortierverhalten von textähnlichen Daten? ===&lt;br /&gt;
PostgreSQL sortiert Daten anhand dem bei initdb gesetzten Locale. (Ab 8.4 wird es es möglich sein pro Datenbank ein eigenes Locale zu definieren)&lt;br /&gt;
&lt;br /&gt;
Entspricht das Sortierverhalten nicht dem gewünschten muss man die Locale ändern. Die meisten Locales, außer &amp;quot;C&amp;quot;, sortieren anhand der Reihenfolge des entsprechenden Wörterbuches. Das Locale &amp;quot;C&amp;quot; ignoriert jegliche Punktuation und Zwischenraum.&lt;br /&gt;
&lt;br /&gt;
=== Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei einer Suche, bei der Groß- und Kleinschreibweisen ignoriert werden? Wie verwende ich einen Index bei solchen Suchabfragen? ===&lt;br /&gt;
  &lt;br /&gt;
Der Operator ~ wendet einen regulären Ausdruck an und ~* wendet ihn&lt;br /&gt;
an, ohne die Groß- und Kleinschreibung zu beachten. Ebenso beachtet&lt;br /&gt;
LIKE die Groß- und Kleinschreibung, und ILIKE nicht.&lt;br /&gt;
&lt;br /&gt;
Gleichheitsvergleiche, die Groß- und Kleinschreibung ignorieren,&lt;br /&gt;
werden in der Regel so ausgedruckt:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle&lt;br /&gt;
    WHERE LOWER(spalte) = 'abc'&lt;br /&gt;
&lt;br /&gt;
Hier wird kein normaler Index benutzt. Legt man hingegen einen&lt;br /&gt;
funktionalen Index an, so wird er auf jeden Fall verwendet:&lt;br /&gt;
   CREATE INDEX tabelle_index ON tabelle (LOWER(spalte))&lt;br /&gt;
&lt;br /&gt;
Falls der obige Index als einen UNIQUE-Index angelegt wird, können&lt;br /&gt;
keine Werte in die Spalte eingefügt werden, die sich nur durch ihre&lt;br /&gt;
Groß- und Kleinschreibung unterscheiden. Um Fehler zu vermeiden muß&lt;br /&gt;
ein CHECK-Constraint oder ein Trigger eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist? Kann nach der NULL-Belegung sortiert werden? ===&lt;br /&gt;
  &lt;br /&gt;
Testen Sie die Spalte mit IS NULL bzw. IS NOT NULL.&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   WHERE &lt;br /&gt;
      spalte IS NULL&lt;br /&gt;
&lt;br /&gt;
Beim konkatenieren mit einen NULL-Wert wir das Ergebnis auch NULL. Um dies zu verhindern verwenden Sie am besten [http://www.postgresql.org/docs/current/static/functions-conditional.html| COALESCE()]&lt;br /&gt;
   SELECT &lt;br /&gt;
      COALESCE(col1, '') || COALESCE(col2, '')&lt;br /&gt;
   FROM tab;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um die Spalte danach zu sortieren, ob sie mit NULL belegt ist oder nicht, verwenden Sie die Bedingungen IS NULL bzw. IS NOT NULL in der ORDER BY-Klausel. Da Bedingungen, die wahr sind, höher als das Gegenteil sortiert werden, bewirkt die folgende Abfrage, dass die NULL-Spalten zuerst gelistet werden:&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      (spalte IS NOT NULL)&lt;br /&gt;
&lt;br /&gt;
Ab PostreSQL 8.3 und höher, ist es möglich das standardisierte NULLS FIRST/NULLS LAST zu verwenden um die Position der NULL-Werte im Ergebnis zu bestimmen. (bei FIRST stehen diese zu erst, bei LAST am Ende)&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tab&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      col NULLS FIRST;&lt;br /&gt;
&lt;br /&gt;
=== Was ist der Unterschied zwischen den verschiedenen CHAR-Typen? ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Typ&lt;br /&gt;
!interner Name&lt;br /&gt;
!Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
|VARCHAR(n) &lt;br /&gt;
|varchar&lt;br /&gt;
|die Größe legt die Maximallänge fest; kein Auffüllen mit Leerzeichen&lt;br /&gt;
|-  &lt;br /&gt;
|CHAR(n)&lt;br /&gt;
|bpchar&lt;br /&gt;
|mit Leerzeichen gefüllt bis zur angegebenen Länge&lt;br /&gt;
|-&lt;br /&gt;
|TEXT&lt;br /&gt;
|text&lt;br /&gt;
|keine obere Grenze für die Länge&lt;br /&gt;
|-&lt;br /&gt;
|BYTEA&lt;br /&gt;
|bytea&lt;br /&gt;
|Bytearray mit variabler Länge (auch für '\0'-Bytes geeignet)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;char&amp;quot; (with the quotes)&lt;br /&gt;
|char&lt;br /&gt;
|ein Zeichen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der interne Name kommt vor allem in den Systemkatalogen und in manchen&lt;br /&gt;
Fehlermeldungen vor.&lt;br /&gt;
&lt;br /&gt;
Die ersten vier Typen sind &amp;quot;varlena&amp;quot;-Typen (d.h. die ersten vier Bytes&lt;br /&gt;
geben die Länge an, gefolgt von den Daten). Daher ist der tatsächlich&lt;br /&gt;
belegte Platz immer etwas mehr als die deklarierte Feldgröße.&lt;br /&gt;
Allerdings wird unter Umständen auf diese Datentypen Datenkompression&lt;br /&gt;
durch das TOAST- Verfahren angewendet, womit der tatsächlich belegte&lt;br /&gt;
Platz auch geringer als erwartet ausfallen kann.&lt;br /&gt;
&lt;br /&gt;
Für die Speicherung von Zeichenketten variabler Länge empfiehlt sich&lt;br /&gt;
VARCHAR(n). Die maximale Länge eines VARCHAR(n)-Felds wird bei der&lt;br /&gt;
Tabellendefinition festgelegt. TEXT setzt keine Längengrenze,&lt;br /&gt;
allerdings gibt es eine systembedingte Obergrenze von 1 GB.&lt;br /&gt;
&lt;br /&gt;
CHAR(n) ist geeignet für die Speicherung von Zeichenketten, die alle&lt;br /&gt;
die gleiche Länge haben. Bitte beachten Sie, dass CHAR(n) automatisch&lt;br /&gt;
Zeichenketten bis zur definierten Feldlänge mit Leerzeichen ausfüllt,&lt;br /&gt;
während bei VARCHAR(n) nur die tatsächlich eingegebene Zeichenkette&lt;br /&gt;
gespeichert wird.&lt;br /&gt;
&lt;br /&gt;
BYTEA ist für binäre Daten, besonders für Werte, die NULL-Bytes haben.&lt;br /&gt;
&lt;br /&gt;
Alle der hier erwähnten Typen weisen ähnliche Performanzeigenschaften&lt;br /&gt;
auf.&lt;br /&gt;
&lt;br /&gt;
=== Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Wert? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet einen SERIAL-Datentyp. Dies ist zwar kein richtiger Datentyp. Es ist die Kurzform für das Erstellen einer Spalte vom Typ Integer, die von einer Sequenz befüllt wird. &lt;br /&gt;
&lt;br /&gt;
Zum Beispiel:&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
       id   SERIAL,&lt;br /&gt;
       name TEXT&lt;br /&gt;
   )&lt;br /&gt;
&lt;br /&gt;
wird automatisch in:&lt;br /&gt;
   CREATE SEQUENCE person_id_seq;&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
     id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),&lt;br /&gt;
     name TEXT&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Die automatisch generierte Sequenz besitzt immer folgenden Namen:&lt;br /&gt;
''tabellederspalte''-''namederspalte''_seq&lt;br /&gt;
&lt;br /&gt;
Die Man-Page zu CREATE SEQUENCE beinhaltet mehr Informationen zu Sequenzen.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einen Typ BIGSERIAL, dieser unterscheidet sich aber nur darin dass die Spalte den Typ BIGINTEGER bekommt. BIGSERIAL sollte verwendet werden wenn es zu erwarten ist, dass mehr als 2 Milliarden Sequenz-Werte verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie bekomme ich den Wert einer SERIAL-Sequenz? ===&lt;br /&gt;
  &lt;br /&gt;
Eine Möglichkeit wäre, mit der nextval()-Funktion den nächsten SERIAL-Wert von dem Sequenzobjekt vor der Auszuführung einer INSERT-Anweisung anzufordern und ihn dann explizit in die INSERT-Anweisung einzubinden. Anhand der Beispieltabelle in 4.11.1 könnte dieser Vorgang in einer Pseudosprache so aussehen:&lt;br /&gt;
&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT nextval('person_id_seq')&amp;quot;);&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Danach stünde der neue Wert in der Variablen new_id für die Verwendung in weiteren Abfragen zur Verfügung, zum Beispiel als Fremdschlüssel zur Tabelle 'person'). Bitte beachten Sie, dass der Name des automatisch erstellten SEQUENCE-Objektes folgenden Name hat: «table»_«serialcolumn»_seq wobei 'table' und 'serialcolumn' die Namen&lt;br /&gt;
der jeweils betreffenden Tabelle / Spalte darstellen.&lt;br /&gt;
&lt;br /&gt;
Als weitere Möglichkeit können Sie nach einer INSERT-Anweisung den automatisch eingefügten SERIAL-Wert mit der currval()-Funktion zurückgeben lassen:&lt;br /&gt;
&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT currval('person_id_seq')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Die einfachste Möglichkeit ist es RETURNING zu verwenden. Ein einfaches Beispiel sähe so aus:&lt;br /&gt;
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;&lt;br /&gt;
&lt;br /&gt;
=== Führt currval() zu einer Race-Condition mit anderen Nutzern? ===&lt;br /&gt;
  &lt;br /&gt;
Nein. currval() liefert einen Wert zurück, der von Ihrer&lt;br /&gt;
Datenbank-Session bestimmt wird, und der anderen Sessionen nicht zur&lt;br /&gt;
Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner Sequenz-/SERIAL-Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Um die gleichzeitige Abarbeitung von Transaktionen zu verbessern,&lt;br /&gt;
werden Sequenzen gerade nicht für andere Transaktionen gesperrt,&lt;br /&gt;
sondern die Sequenznummern werden den laufenden Transaktionen sofort&lt;br /&gt;
zugeteilt. Lücken in der Sequenznummerierung werden durch abgebrochene&lt;br /&gt;
Transaktionen verursacht.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein OID? ===&lt;br /&gt;
  &lt;br /&gt;
Jede Zeile, die in PostgreSQL erzeugt wird, bekommt eine eindeutige OID, sofern die Tabelle nicht mit der Option WITHOUT OIDS angelegt wurde. OIDs sind automatisch zugewiesene 4-Byte-Integer, die innerhalb der gesamten Datenbank einmalig sind. Allerdings laufen sie bei einem Wert von ungefähr 4 Milliarden über. PostgreSQL verwendet OIDs, um&lt;br /&gt;
seine interne Systemtabellen zu verbinden.&lt;br /&gt;
&lt;br /&gt;
Um einmalige Idenfikatoren in Datentabellen zu erstellen, wird allerdings empfohlen, statt OIDs Werte zu verwenden, die von SERIAL-Sequenzen erzeugt werden. SERIAL-Sequenzen sind innerhalb einer Tabelle einmalig und daher weniger anfällig für Überläufe. Außerdem können 8-Byte-Sequenzwerte mit BIGSERIAL (SERIAL8) erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein CTID? ===&lt;br /&gt;
&lt;br /&gt;
CTIDs werden benutzt, um bestimmte physikalische Zeilen durch Block und Offset Werte zu identifizieren. CTIDs verändern sich, sobald Zeilen verändert oder zurückgeladen werden. Sie werden in Indexeinträgen benutzt um auf die physikalischen Zeilen zu zeigen.&lt;br /&gt;
&lt;br /&gt;
=== Wieso bekomme ich einen Fehler: &amp;quot;ERROR: Memory exhausted in AllocSetAlloc()&amp;quot;? ===&lt;br /&gt;
  &lt;br /&gt;
Wahrscheinlich gibt es keinen virtuellen Speicher mehr in Ihrem System&lt;br /&gt;
oder Ihr Kernel hat niedrige Höchstgrenzen für bestimmte Ressourcen.&lt;br /&gt;
Probieren Sie vor dem Start von postmaster folgendes:&lt;br /&gt;
   ulimit -d 262144&lt;br /&gt;
   limit datasize 256m&lt;br /&gt;
&lt;br /&gt;
Je nach benutzter Shell wird nur einer dieser Befehle erfolgreich&lt;br /&gt;
ausgeführt werden. Auf jedem Fall wird die Grenze des Datensegments&lt;br /&gt;
für Prozesse erhöht werden und eventuell die erfolgreiche Ausführung&lt;br /&gt;
der Abfrage ermöglichen. Falls Sie ein Problem mit dem SQL-Client&lt;br /&gt;
haben, weil das Backend zu viele Daten zurückliefert, versuchen Sie&lt;br /&gt;
dies vor dem Start des SQL-Clients.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft? ===&lt;br /&gt;
  &lt;br /&gt;
Geben Sie in psql SELECT VERSION(); ein.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine Spalte erstellen, deren Default-Wert immer die aktuelle Uhrzeit enthalten soll? ===&lt;br /&gt;
  &lt;br /&gt;
Dazu verwenden Sie CURRENT_TIMESTAMP:&lt;br /&gt;
   CREATE TABLE test (x INT, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );&lt;br /&gt;
&lt;br /&gt;
=== Wie führe ich eine OUTER JOIN durch? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt OUTER JOINs nach dem SQL- Standardsyntax. Hier&lt;br /&gt;
zwei Beispiele:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 ON (t1.spalte = t2.spalte)&lt;br /&gt;
&lt;br /&gt;
bzw.:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 USING (spalte)&lt;br /&gt;
&lt;br /&gt;
Diese identischen Abfragen verknüpfen tabelle_1 mit tabelle_2 über die&lt;br /&gt;
Spalte 'spalte' und geben außerdem alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_1 (diejenigen, die keine Entsprechung in tabelle_2 haben)&lt;br /&gt;
zurück. Ein RIGHT JOIN würde hingegen alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_2 hinzufügen und ein FULL JOIN würde alle verknüpften Zeilen&lt;br /&gt;
sowie jeweils alle unverknüpften Zeilen aus den beiden Tabellen&lt;br /&gt;
zurückliefern. Die Angabe von OUTER ist nicht zwingend und kann in&lt;br /&gt;
LEFT, RIGHT und FULL-Verknüpfungen weggelassen werden. Normale&lt;br /&gt;
Verknüpfungen sind INNER JOINs.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt keinen Weg, innerhalb einer Abfrage auf mehr als eine&lt;br /&gt;
Datenbank zuzugreifen. Da PostgreSQL datenbank-spezifische&lt;br /&gt;
Systemkataloge lädt, ist eine datenbankübergreifende Abfrage nicht&lt;br /&gt;
möglich.&lt;br /&gt;
&lt;br /&gt;
contrib/dblink ist eine Erweiterung, die datenbankübergreifende&lt;br /&gt;
Abfragen über Funktionsaufrufe ermöglicht.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion zurückgeben lassen? ===&lt;br /&gt;
  &lt;br /&gt;
Funktionen können mehrere Zeilen und Spalten zurückgeben, vgl.:&lt;br /&gt;
http://www.postgresql.org/docs/techdocs.17.&lt;br /&gt;
&lt;br /&gt;
=== Warum bekomme ich eine Fehlermeldung wie &amp;quot;relation with OID ##### does not exist&amp;quot; wenn ich temporäre Tabellen in PL/PgSQL-Funktionen benutze? ===&lt;br /&gt;
  &lt;br /&gt;
In PostgreSQL-Versionen vor 8.3 verarbeitet PL/PgSQL Funktionen in&lt;br /&gt;
einer Cache. Dies hat eine unangenehme Nebenwirkung, nämlich dass wenn&lt;br /&gt;
eine PL/PgSQL-Funktion auf eine temporäre Tabelle zugreift, und diese&lt;br /&gt;
Tabelle anschließend gelöscht bzw. neu erstellt wird, die Funktion&lt;br /&gt;
fehlschlagen wird, da die gecachten Funktionsinhalte noch auf die alte&lt;br /&gt;
temporäre Tabelle zeigen. Die Lösung für diese Probleme besteht darin,&lt;br /&gt;
in der PL/PgSQL- Funktion mittels EXECUTE auf temporäre Tabellen&lt;br /&gt;
zuzugreifen. Dies bewirkt, dass bei jedem Funktionsruf die betreffende&lt;br /&gt;
Abfrage neu geparst wird.&lt;br /&gt;
&lt;br /&gt;
Dieses Problem taucht in PostgreSQL 8.3 und späteren Versionen nicht&lt;br /&gt;
mehr auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Replikationslösungen gibt es? ===&lt;br /&gt;
  &lt;br /&gt;
Der Begriff &amp;quot;replikation&amp;quot; umfasst mehrere verschiedene Technologien,&lt;br /&gt;
jede mit eigenen Vor- und Nachteilen. [http://www.postgresql.org/docs/8.3/static/high-availability.html| Die Dokumentation enthält eine gute Einführung in das Thema Replikation]&lt;br /&gt;
&lt;br /&gt;
Mit &amp;quot;Master/slave&amp;quot;-Replikation werden Änderungen in einer&lt;br /&gt;
Hauptdatenbank durchgeführt und an &amp;quot;Sklaven&amp;quot; verteilt, die im&lt;br /&gt;
Nur-Lese-Modus arbeiten. Die populärste Lösung für PostgreSQL ist&lt;br /&gt;
Slony-I.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Multi-master replication&amp;quot; ermöglicht sowohl lesende als auch&lt;br /&gt;
schreibende Zugriffe über mehrere Datenbank-Server hinweg. Allerdings&lt;br /&gt;
hat diese Art von Replikation eine negative Auswirkung auf die&lt;br /&gt;
Performanz durch die Notwendigkeit, Änderungen zwischen Servern zu&lt;br /&gt;
synchronisieren. Pgcluster ist die populärste freie Lösung für&lt;br /&gt;
PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einige kommerzielle und hardware-basierte&lt;br /&gt;
Replikationslösungen für verschiedene Arten der Replikation.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Tabellen- und Spaltennamen in meiner Abfrage nicht erkannt? Warum werden Großbuchstaben umgewandelt? ===&lt;br /&gt;
  &lt;br /&gt;
Die häufigste Ursache ist die Verwendung von Gänsefüßchen bei der&lt;br /&gt;
Anlegung von Tabellen, z.B.:&lt;br /&gt;
    CREATE TABLE &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
                (&amp;quot;SPALTE1&amp;quot; INT)&lt;br /&gt;
&lt;br /&gt;
Dadurch werden Tabellen- und Spaltennamen (sog. Identifikatoren) in&lt;br /&gt;
genau der Schreibweise gespeichert (vgl. Dokumentation), was dazu&lt;br /&gt;
führt, dass man sie danach immer in Gänsefüßchen angeben muss. Im&lt;br /&gt;
obigen Beispiel muss man also immer etwa SELECT * FROM &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
verwenden. Um dieses Problem zu vermeiden, müssen Sie immer eines der&lt;br /&gt;
folgenden Punkte beachten:&lt;br /&gt;
&lt;br /&gt;
* bei der Tabellenanlegung keine Gänsefüßchen verwenden;&lt;br /&gt;
* in Identifikatoren nur Kleinschreibung verwenden;&lt;br /&gt;
* immer Identifikatoren mit Gänsefüßchen versehen&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen des Übersetzers ==&lt;br /&gt;
  &lt;br /&gt;
Die englische Vorlage dieser FAQ wird ständig überarbeitet. Daher&lt;br /&gt;
liegt die Übersetzung nicht immer auf dem aktuellsten Stand.&lt;br /&gt;
&lt;br /&gt;
Die aktuellste Version der deutschen Übersetzung befindet sich immer&lt;br /&gt;
unter http://sql-info.de/de/postgresql/FAQ_german.html. Diese&lt;br /&gt;
&amp;quot;Arbeitsversion&amp;quot; enthält eventuell Änderungen, die noch nicht auf der&lt;br /&gt;
PostgreSQL-Website eingebunden worden sind.&lt;br /&gt;
&lt;br /&gt;
Über Verbesserungshinweise und Korrekturvorschläge sowie&lt;br /&gt;
Verständnisfragen zum Inhalt der FAQ freue ich mich. Ich nehme auch&lt;br /&gt;
allgemeine Fragen zu PostgreSQL gerne entgegen, verweise jedoch auf&lt;br /&gt;
die Mailing-Listen als schnelle und zuverlässige Anlaufstellen.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/FAQ/de</id>
		<title>FAQ/de</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/FAQ/de"/>
				<updated>2011-12-06T18:40:28Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;/* Hat PostgreSQL eine grafische Benutzerschnittstelle? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Was ist PostgreSQL? Wie wird es ausgesprochen? ===&lt;br /&gt;
  &lt;br /&gt;
Die (englische) Aussprache ist &amp;quot;Post-Gres-Q-L&amp;quot;. Im allgemeinen&lt;br /&gt;
Sprachgebrauch hat sich die Kurzform &amp;quot;Postgres&amp;quot; auch durchgesetzt.&lt;br /&gt;
(Für diejenigen, die es interessiert: eine MP3-Datei mit der&lt;br /&gt;
amerikanischen Aussprache befindet sich hier:&lt;br /&gt;
http://www.postgresql.org/files/postgresql.mp3&lt;br /&gt;
&lt;br /&gt;
PostgreSQL ist ein objektrelationales Datenbanksystem, das die Vorzüge&lt;br /&gt;
von kommerziellen Datenbanksystemen mit zukunftsweisenden Innovationen&lt;br /&gt;
kombiniert. PostgreSQL ist freie Software und dessen kompletter&lt;br /&gt;
Quellcode ist öffentlich verfügbar.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Entwicklung wird von einem Team von meist freiwilligen&lt;br /&gt;
Entwicklern durchgeführt. Dieses Team ist für die Gesamtentwicklung&lt;br /&gt;
von PostgreSQL verantwortlich. Es handelt sich um ein&lt;br /&gt;
Gemeinschaftsprojekt, das nicht von einer bestimmten Firma&lt;br /&gt;
kontrolliert wird. Lesen Sie die Entwickler-FAQ:&lt;br /&gt;
http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn Sie an einer&lt;br /&gt;
Mitarbeit interessiert sind.&lt;br /&gt;
&lt;br /&gt;
=== Wer kontrolliert PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Falls Sie nach dem Namen eines etwaigen Inhabers bzw. nach einem&lt;br /&gt;
allmächtigen Zentralkommittee suchen - sparen Sie sich die Mühe, sowas&lt;br /&gt;
existiert gar nicht. Es gibt zwar das &amp;quot;Core Committee&amp;quot; sowie&lt;br /&gt;
Entwickler, die CVS-Schreibberechtigung haben, jedoch haben diese&lt;br /&gt;
Gruppen eher nur eine administrative Rolle. Das Projekt wird durch die&lt;br /&gt;
Community gesteuert, die aus den Entwicklern sowie natürlich auch den&lt;br /&gt;
Nutzern besteht - jeder kann daran teilnehmen. (Lesen Sie die&lt;br /&gt;
Entwickler-FAQ: http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn&lt;br /&gt;
Sie an der PostgreSQL-Entwicklung teilnehmen möchten).&lt;br /&gt;
&lt;br /&gt;
=== Welchem Copyright unterliegt PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL wird unter der klassischen BSD-Lizenz herausgegeben. Im&lt;br /&gt;
Grunde genommen erlaubt diese den Nutzern, beliebig mit dem Code&lt;br /&gt;
umzugehen, auch der Weiterverkauf von Binärversionen ohne Quellcode&lt;br /&gt;
ist erlaubt. Die einzige Einschränkung besteht darin, dass PostgreSQL&lt;br /&gt;
auf keinen Fall für etwaige Probleme mit der Software haftet. Außerdem&lt;br /&gt;
muß der Copyright- Text in allen Kopien der Software enthalten sein.&lt;br /&gt;
Dies ist der Originaltext der BSD-Lizenz:&lt;br /&gt;
 &lt;br /&gt;
 PostgreSQL Data Base Management System&lt;br /&gt;
 &lt;br /&gt;
 Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group&lt;br /&gt;
 Portions Copyright (c) 1994-6 Regents of the University of California&lt;br /&gt;
 &lt;br /&gt;
 Permission to use, copy, modify, and distribute this software and its&lt;br /&gt;
 documentation for any purpose, without fee, and without a written&lt;br /&gt;
 agreement is hereby granted, provided that the above copyright notice&lt;br /&gt;
 and this paragraph and the following two paragraphs appear in all&lt;br /&gt;
 copies.&lt;br /&gt;
 &lt;br /&gt;
 IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY&lt;br /&gt;
 FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,&lt;br /&gt;
 INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND&lt;br /&gt;
 ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN&lt;br /&gt;
 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 &lt;br /&gt;
 THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,&lt;br /&gt;
 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF&lt;br /&gt;
 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE&lt;br /&gt;
 PROVIDED HEREUNDER IS ON AN &amp;quot;AS IS&amp;quot; BASIS, AND THE UNIVERSITY OF&lt;br /&gt;
 CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,&lt;br /&gt;
 UPDATES, ENHANCEMENTS, OR MODIFICATIONS.&lt;br /&gt;
&lt;br /&gt;
Es gilt die Copyright-Klausel im Original!&lt;br /&gt;
&lt;br /&gt;
=== Auf welchen Plattformen läuft PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Normalerweise kann PostgreSQL auf jeder modernen UNIX-kompatiblen&lt;br /&gt;
Plattform eingesetzt werden. Diejenigen Plattformen, die bei der&lt;br /&gt;
jeweiligen Versionsfreigabe getestet wurden, sind in den&lt;br /&gt;
Installationsanleitungen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
PostgreSQL läuft auch auf Microsoft NT-basierten Betriebssystemen wie&lt;br /&gt;
Windows 2000 SP4, XP und Server 2003. Ein vorgefertigtes&lt;br /&gt;
Installationspaket kann von http://pgfoundry.org/projects/pginstaller&lt;br /&gt;
heruntergeladen werden. DOS-basierte Windows-Versionen (Win95, Win98,&lt;br /&gt;
WinMe) können PostgreSQL nur mit Hilfe der Cygwin-Umgebung ausführen.&lt;br /&gt;
&lt;br /&gt;
=== Woher bekomme ich PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Per Web-Browser hier: http://www.postgresql.org/ftp/ und per FTP hier:&lt;br /&gt;
ftp://ftp.postgresql.org/pub/.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die neueste Version von PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die neueste Version von PostgreSQL kann auf der [http://www.postgresql.org/ Website] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Die Freigabe einer neuen Hauptversion erfolgt in der Regel jährlich, kleinere Korrekturversionen alle paar Monaten. Die kleineren Updates werden &amp;quot;Minor&amp;quot;-Updates, die großen jährlich erscheinenden &amp;quot;Major&amp;quot;-Updates genannt. &amp;quot;Minor&amp;quot;-Update erscheinen in der Regel gleichzeitig für alle unterstützten &amp;quot;Major&amp;quot;-Versionen. [http://www.postgresql.org/support/versioning Falls Sie dieses Thema interessiert sollten Sie hier weiterlesen.]&lt;br /&gt;
&lt;br /&gt;
=== Wo bekomme ich Support für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Community bietet Unterstützung per Mailing-Liste. Die&lt;br /&gt;
Web-Seite http://www.postgresql.org/community/lists/ bietet einen&lt;br /&gt;
Überblick. Die Listen general und bugs bieten einen guten Einstieg.&lt;br /&gt;
&lt;br /&gt;
Eine deutschsprachige Mailing-Liste gibt es hier:&lt;br /&gt;
http://archives.postgresql.org/pgsql-de-allgemein/.&lt;br /&gt;
&lt;br /&gt;
Der wichtigsten IRC-Channel ist #postgresql auf Freenode&lt;br /&gt;
(irc.freenode.net). Unter UNIX/Linux können Sie mit z.B. irc -c&lt;br /&gt;
'#postgresql' &amp;quot;$USER&amp;quot; irc.freenode.net. daran teilnehmen. Auf Freenode&lt;br /&gt;
gibt es folgende Channels:&lt;br /&gt;
* #postgresql-es (spanisch)&lt;br /&gt;
* #postgresqlfr (französischen)&lt;br /&gt;
* #postgresql-br (brasilianischen) &lt;br /&gt;
&lt;br /&gt;
Es gibt außerdem einen PostgreSQL-Channel bei EFNet.&lt;br /&gt;
&lt;br /&gt;
Eine Liste von Unternehmen, die Support für PostgreSQL auf kommerzieller Basis leisten, kann unter http://www.postgresql.org/support/professional_support eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich einen Fehlerbericht abgeben? ===&lt;br /&gt;
  &lt;br /&gt;
Nutzen Sie das Formular unter&lt;br /&gt;
http://www.postgresql.org/support/submitbug. Schauen Sie aber vorher&lt;br /&gt;
unter ftp://ftp.postgresql.org/pub/ nach, ob es mittlerweile eine&lt;br /&gt;
neuere PostgreSQL-Version gibt, in der der Fehler behoben wurde.&lt;br /&gt;
&lt;br /&gt;
Bugs, die über das Formular bzw. eine der Mailing-Listen&lt;br /&gt;
bekanntgegeben wurden, erhalten typischerweise einer der folgenden&lt;br /&gt;
Reaktionen:&lt;br /&gt;
&lt;br /&gt;
* es ist kein Bug, der Grund wird benannt&lt;br /&gt;
* es ist ein bereits bekannter Bug, der bereits auf der TODO-Liste aufgenommen wurde&lt;br /&gt;
* der Bug wurde in der aktuellen Version behoben&lt;br /&gt;
* der Bug wurde bereits behoben, befindet sich aber noch nicht in einer offiziell veröffentlichten Version&lt;br /&gt;
* es wird um eingehendere Informationen gebeten, z.B.:&lt;br /&gt;
** Betriebssystem&lt;br /&gt;
** PostgreSQL-Version&lt;br /&gt;
** reproduzierbares Fallbeispiel&lt;br /&gt;
** Debugging-Information&lt;br /&gt;
** Debugger-Backtrace-Ausgabe&lt;br /&gt;
* der Bug ist neu. Folgendes könnte passieren:&lt;br /&gt;
** ein Patch wird erstellt und in der nächsten Version eingebaut&lt;br /&gt;
** der Bug kann nicht sofort behoben werden und wird auf die TODO-Liste gesetzt&lt;br /&gt;
    &lt;br /&gt;
=== Wie erfahre ich von bekannten Bugs oder fehlenden Features? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt eine erweiterte Teilmenge von SQL:2003. Siehe&lt;br /&gt;
unsere TODO-Liste unter http://www.postgresql.org/docs/faqs.TODO.html&lt;br /&gt;
für eine Auflistung der bekannten Bugs, fehlenden Features und&lt;br /&gt;
zukünftigen Pläne.&lt;br /&gt;
&lt;br /&gt;
Eine Anfrage nach einem neuen Feature führt normalerweise zu einer der&lt;br /&gt;
folgenden Antworten:&lt;br /&gt;
&lt;br /&gt;
* das Feature ist bereits auf der TODO-Liste&lt;br /&gt;
* das Feature ist nicht wünschenswert, weil:&lt;br /&gt;
** es vorhandene Funktionalität dupliziert, welche bereits dem SQL-Standard folgt&lt;br /&gt;
** es würde die Komplexität der Code-Basis erhöhen, ohne nennenswerte Vorteile zu bringen&lt;br /&gt;
** es wäre unsicher bzw. unzuverlässig&lt;br /&gt;
* das neue Feature wird der TODO-Liste hinzugefügt&lt;br /&gt;
    &lt;br /&gt;
PostgreSQL verwendet kein Bugtracking-System, da es sich als effizienter erwiesen hat, E-Mails direkt zu beantworten und die TODO-Liste aktuell zu halten. In der Praxis werden Bugs sehr schnell beseitigt, und diejenigen Bugs, die Auswirkungen auf eine große Anzahl von Nutzern haben, werden meist kurzfristig korrigiert. Der einzige Überblick über alle Änderungen, Verbesserungen und Korrekturen in einer PostgreSQL-Version befindet sich in den CVS-Log-Meldungen. Auch die Release-Notes listen nicht jede Änderung in der Software auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Dokumentation ist für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet umfangreiche Dokumentation, darunter ein großes&lt;br /&gt;
Handbuch, man-Pages und einige kleine Testprogramme. Siehe das /doc-&lt;br /&gt;
Verzeichnis. Ausserdem sind alle Handbücher online unter&lt;br /&gt;
http://www.postgresql.org/docs/ verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Bücher zu PostgreSQL sind online verfügbar unter&lt;br /&gt;
http://www.postgresql.org/docs/books/awbook.html und&lt;br /&gt;
http://www.commandprompt.com/ppbook/ .&lt;br /&gt;
&lt;br /&gt;
Eine Liste lieferbarer PostgreSQL-Bücher befindet sich unter&lt;br /&gt;
http://www.postgresql.org/docs/books Diverse technische Artikel&lt;br /&gt;
befinden sich unter http://www.postgresql.org/docs/techdocs .&lt;br /&gt;
&lt;br /&gt;
psql hat einige nützliche \d-Befehle, um Informationen über Typen,&lt;br /&gt;
Operatoren, Funktionen, Aggregate, usw. zu zeigen.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Website enthält noch mehr Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich SQL lernen? ===&lt;br /&gt;
  &lt;br /&gt;
Die oben erwähnten PostgreSQL-spezifische Bücher bieten einen guten&lt;br /&gt;
Einstieg. Viele PostgreSQL-Anwender mögen &amp;quot;The Practical SQL Handbook&amp;quot;&lt;br /&gt;
(Bowman et al., Addison Wesley). Andere dagegen mögen &amp;quot;The Complete&lt;br /&gt;
Reference SQL&amp;quot; (Groff et al., McGraw-Hill).&lt;br /&gt;
&lt;br /&gt;
Es gibt ausserdem einige nützliche Online-Tutorials:&lt;br /&gt;
&lt;br /&gt;
* http://www.intermedia.net/support/sql/sqltut.shtm&lt;br /&gt;
* http://sqlcourse.com&lt;br /&gt;
* http://www.w3schools.com/sql/default.asp&lt;br /&gt;
* http://mysite.verizon.net/Graeme_Birchall/id1.html&lt;br /&gt;
    &lt;br /&gt;
=== Wie kann ich im Entwicklerteam mitarbeiten? ===&lt;br /&gt;
  &lt;br /&gt;
Lesen Sie in der Entwickler-FAQ unter&lt;br /&gt;
[[Developer_FAQ | Developer FAQ]] nach.&lt;br /&gt;
&lt;br /&gt;
=== Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt verschiedene Methoden, Software zu messen: Eigenschaften,&lt;br /&gt;
Performanz, Zuverlässigkeit, Support und Preis.&lt;br /&gt;
&lt;br /&gt;
==== Eigenschaften ====&lt;br /&gt;
&lt;br /&gt;
       PostgreSQL besitzt die meisten Eigenschaften - wie&lt;br /&gt;
       Transaktionen, Unterabfragen (Subqueries), Trigger, Views,&lt;br /&gt;
       referenzielle Integrität bei Fremdschlüsseln und verfeinertes&lt;br /&gt;
       Locking - die bei großen kommerziellen DBMS vorhanden sind. Es&lt;br /&gt;
       bietet außerdem einige anderen Eigenschaften, die diese nicht&lt;br /&gt;
       immer haben, wie benutzerbestimmte Typen, Vererbung, Regeln,&lt;br /&gt;
       und die Multi-Versionen-Steuerung zum Verringern&lt;br /&gt;
       konkurrierender Locks.&lt;br /&gt;
       &lt;br /&gt;
==== Performanz ====&lt;br /&gt;
       Die Performanz von PostgreSQL ist mit der von kommerziellen und&lt;br /&gt;
       anderen Open-Source-Datenbanken vergleichbar. In manchen&lt;br /&gt;
       Bereichen ist es schneller, in anderen langsamer. In der Regel&lt;br /&gt;
       beträgt der Unterschied +/-10%.&lt;br /&gt;
       &lt;br /&gt;
==== Zuverlässigkeit ====&lt;br /&gt;
       Es ist selbstredend, dass ein DBMS wertlos ist, wenn es nicht&lt;br /&gt;
       zuverlässig arbeitet. Daher bemühen wir uns, nur streng&lt;br /&gt;
       geprüften und beständigen Code freizugeben, der nur ein Minimum&lt;br /&gt;
       an Programmfehlern aufweist. Jede Freigabe hat mindestens einen&lt;br /&gt;
       Monat Betatest-Phase hinter sich, und unsere Freigabehistorie&lt;br /&gt;
       beweist, dass wir stabile und solide Versionen freigeben, die&lt;br /&gt;
       im Produktionsbetrieb genutzt werden können. Wir glauben, dass&lt;br /&gt;
       wir im Vergleich mit anderer Datenbanksoftware vorteilhaft&lt;br /&gt;
       dastehen.&lt;br /&gt;
       &lt;br /&gt;
==== Support ====&lt;br /&gt;
       Unsere Mailinglisten bieten die Möglichkeit, gemeinsam mit&lt;br /&gt;
       einer großen Gruppe von Entwicklern und Benutzern mögliche&lt;br /&gt;
       Probleme zu lösen. Wir können nicht immer eine Fehlerbehebung&lt;br /&gt;
       garantieren, kommerzielle DBMS tun dies aber auch nicht. Der&lt;br /&gt;
       direkte Kontakt zur Entwickler- und Benutzergemeinschaft und&lt;br /&gt;
       der Zugriff auf die Handbücher und den Quellcode ermöglicht&lt;br /&gt;
       einen im Vergleich zu anderen DBMS höherwertigeren Support. Es&lt;br /&gt;
       gibt jedoch auch Anbieter von kommerziellen Support-Leistungen&lt;br /&gt;
       (siehe FAQ-Punkt 1.7).&lt;br /&gt;
       &lt;br /&gt;
==== Preis ====&lt;br /&gt;
       PostgreSQL ist frei verfügbar, sowohl für die kommerzielle wie&lt;br /&gt;
       auch für die nicht-kommerzielle Nutzung. Sie können den&lt;br /&gt;
       PostgreSQL-Code ohne Einschränkungen (außer denjenigen, die in&lt;br /&gt;
       der oben angegebene BSD-artigen Lizenz erwähnt werden) in Ihr&lt;br /&gt;
       Produkt integrieren.&lt;br /&gt;
&lt;br /&gt;
=== Kann PostgreSQL eingebettet (embedded) werden? ===&lt;br /&gt;
PostgreSQL basiert auf einer Server/Client-Architektur, diese benötigt separate Prozesse für jeden Klient und Server, hinzukommen auch noch weitere &amp;quot;Helfer-Prozesse&amp;quot; (z. B. für autovacuum und stats-collector). Zwar können einige &amp;quot;embedded-Architekturen&amp;quot; diese Anforderungen erfüllen, aber wenn der Datenbank-Prozess innerhalb des Applikations-Prozesses laufen muss, kann PostgreSQL nicht verwendet werden. Dazu sollte man leichtere Datenbanken nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mich von einer Maillingliste abmelden? Wie verhindere ich es, dass ich doppelte E-Mails bekomme? ===&lt;br /&gt;
Majordomo ermöglicht es sich von allen Maillinglisten an- und abzumelden, ggf. müssen Sie sich zuerst ihr Majordomo-Passwort zuschicken lassen.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Maillinglisten sind so konfiguriert, dass Antworten an den ursprünglichen Autor und an die Maillingliste verschickt werden. Somit soll erreicht werden dass Benutzer immer schnellstmöglichst eine Antwort erhalten können. Diese Einstellungen können Sie auch über die Konfiguration von Majordomo ändern, ändern Sie dafür die Einstellung für ''eliminatecc''. Sie können auch einstellen dass Sie selbst keine Antwort auf Ihre eigenen E-Mails bekommen, ändern sie dafür die Einstellung für ''selfcopy''.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
&lt;br /&gt;
== Fragen zu Benutzerprogrammen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Welche Schnittstellen gibt es für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Installation stellt nur Schnittstellen für C und&lt;br /&gt;
Embedded C bereit. Alle weitere Schnittstellen sind unabhängige&lt;br /&gt;
Projekte, die einzeln heruntergeladen werden werden müssen. Diese&lt;br /&gt;
Trennung ermöglicht individuelle Entwickler-Teams und&lt;br /&gt;
Entwicklungszyklen für die jeweiligen Projekte.&lt;br /&gt;
&lt;br /&gt;
Einige Programmiersprachen wie PHP haben eine PostgreSQL-&lt;br /&gt;
Schnittstelle bereits eingebaut. Schnittstellen für Sprachen wie Perl,&lt;br /&gt;
TCL, Python und viele anderen sind unter http://gborg.postgresql.org&lt;br /&gt;
im Bereich Drivers/Interfaces verfügbar sowie per Internet-Suche.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann man PostgreSQL in einer Website nutzen? ===&lt;br /&gt;
  &lt;br /&gt;
Eine nette Einführung zu datenbank-gestützten Webseiten kann unter&lt;br /&gt;
http://www.webreview.com (engl.) eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Für die Web-Integration ist PHP eine ausgezeichnete Schnittstelle. PHP&lt;br /&gt;
gibt es bei http://www.php.net&lt;br /&gt;
&lt;br /&gt;
Desweiteren bietet sich die Perl-Schnittstelle mit CGI.pm&lt;br /&gt;
oder mod_perl auch an.&lt;br /&gt;
&lt;br /&gt;
=== Hat PostgreSQL eine grafische Benutzerschnittstelle? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt eine große Anzahl von GUI-Programmen für PostgreSQL - sowohl&lt;br /&gt;
kommerziell als auch Open-Source. [http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools Eine englische Liste befindet sich hier.]&lt;br /&gt;
&lt;br /&gt;
== Administrative Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql? ===&lt;br /&gt;
  &lt;br /&gt;
Bei der Ausführung von configure die Option --prefix mit dem Zielverzeichnis angeben.&lt;br /&gt;
&lt;br /&gt;
=== Wie regle ich Zugriffe von anderen Rechnern? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL ist standardmäßig so eingestellt, dass Verbindungen nur vom&lt;br /&gt;
lokalen Rechner über Unix Domain Sockets bzw. TCP/IP möglich sind.&lt;br /&gt;
Verbindungen von anderen Rechnern werden erst dann ermöglicht, wenn&lt;br /&gt;
Sie in der Datei postgresql.conf die Einstellung listen_addresses&lt;br /&gt;
anpassen, in der Datei $PGDATA/pg_hba.conf host-basierte&lt;br /&gt;
Authentifizierung einschalten und den Server neu starten.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine bessere Performanz erreichen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt drei große Bereiche, in denen Performanzverbesserungen erzielt&lt;br /&gt;
werden können:&lt;br /&gt;
&lt;br /&gt;
==== Abfrageoptimierung ====&lt;br /&gt;
Die Modifizierung von Abfragen kann eine bessere Performanz erzielen:&lt;br /&gt;
       &lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/indexes.html Erstellung von Indexen, einschliesslich partieller Indexe sowie Expressionsindexe]&lt;br /&gt;
* Einsatz von COPY anstelle multipler INSERT-Anweisungen&lt;br /&gt;
* Gruppierung von mehreren Abfragen innerhalb einer Transaktion, um Aufwand beim Abschluss von Transaktionen    einzusparen&lt;br /&gt;
* Einsatz von CLUSTER beim Holen von einer großen Anzahl von Datenreihen aus einem Index&lt;br /&gt;
* Einsatz von LIMIT, um eine Untermenge der Abfragenergebnisse zurückzuliefern&lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/sql-prepare.html Einsatz von vorbereiteten Befehlen (prepared queries)]&lt;br /&gt;
* Einsatz von ANALYZE, um die Datenbankstatistik für den Abfragenplaner aktuell zu halten&lt;br /&gt;
* [http://www.postgresql.org/docs/current/static/routine-vacuuming.html Regelmäßiger Einsatz von VACUUM bzw. pg_autovacuum (autovacuum ist seit Version 8.3 standardmäßig aktiviert)]&lt;br /&gt;
* Bei großen Datenveränderungen die Löschung von Indexen&lt;br /&gt;
&lt;br /&gt;
==== Server-Konfiguration ====&lt;br /&gt;
Einige Einstellungen in der Datei postgresql.conf wirken sich auf die Performanz aus. Das Handbuch enthält unter      http://www.postgresql.org/docs/current/static/runtime-config.html eine komplette Auflistung. &lt;br /&gt;
&lt;br /&gt;
Kommentare zu den jeweiligen Einstellungen gibt es unter http://www.varlena.com/varlena/GeneralBits/Tidbitsannotated_conf_e.html und http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.&lt;br /&gt;
       &lt;br /&gt;
==== Hardware-Auswahl ====&lt;br /&gt;
Die Auswirkung von Hardware auf Performanz wird unter http://momjian.us/main/writings/pgsql/hw_performance/index.html und http://www.powerpostgresql.com/PerfList/ erläutert.&lt;br /&gt;
       &lt;br /&gt;
=== Welche Debugging-Funktionen sind für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
Unter den Optionen für die Server-Konfigurierung gibt es zahlreiche&lt;br /&gt;
log_*-Variablen, die die Ausgabe von Abfrage- und Prozessstatistiken&lt;br /&gt;
ermöglichen. Diese können für Debugging-Zwecke sowie Performanz-Tests&lt;br /&gt;
sehr nützlich sein.&lt;br /&gt;
&lt;br /&gt;
=== Ich bekomme die Meldung &amp;quot;Sorry, too many clients&amp;quot;, wenn ich eine Verbindung aufzubauen versuche. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Ihr System hat die maximal zulässige Anzahl von Datenbankverbindungen&lt;br /&gt;
erreicht (Voreinstellung 100). Sie müssen die maximale Anzahl der&lt;br /&gt;
gleichzeitig ausführbaren Backend-Prozesse hochsetzen, indem Sie in&lt;br /&gt;
postgresql.conf den Wert max_connections ändern und den Server&lt;br /&gt;
neustarten.&lt;br /&gt;
&lt;br /&gt;
=== Wie wird PostgreSQL aktualisiert? ===&lt;br /&gt;
  &lt;br /&gt;
Allgemeine Informationen zur Aktualisierung von PostgreSQL gibt es auf&lt;br /&gt;
der Seite http://www.postgresql.org/support/versioning. Detaillierte&lt;br /&gt;
technische Informationen gibt es auf der Seite&lt;br /&gt;
http://www.postgresql.org/docs/current/static/install-upgrading.html&lt;br /&gt;
&lt;br /&gt;
=== Kommt PostgreSQL mit den Anpassungen der Sommerzeit in verschiedenen Ländern klar? ===&lt;br /&gt;
  &lt;br /&gt;
Für die Berücksichtigung der Sommerzeit verwendet PostgreSQL Seit dem Release 8.0 die weiterverbreitete tzdata-Datenbank (auch bekannt als &amp;quot;zoneinfo database&amp;quot; oder &amp;quot;[http://www.twinsun.com/tz/tz-link.htm| Olzen timezone database]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jedes Update von PostgreSQL beinhaltet die aktuellen tzdata Dateien, daher sollte es reichen die Minor-Updates der eingesetzten Major Version im Auge zu behalten.&lt;br /&gt;
&lt;br /&gt;
Unter der Vorraussetzung dass das Betriebssystem diese Dateien schon in einer stets aktuellen Version vorbehält, ist es üblich, dass man diese Dateien verwendet. PostgreSQL bietet dazu eine compile-option an.&lt;br /&gt;
&lt;br /&gt;
=== Welche Hardware eignet sich für den Betrieb mit PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL läuft auf fast jeder Hardware-Kombination. Im PC-Bereich&lt;br /&gt;
gibt es allerdings sehr große Abweichungen in der Qualität. Für einen&lt;br /&gt;
Arbeitsplatz- oder Entwicklungsrechner mag dies nicht so bedeutend&lt;br /&gt;
sein, im Server-Betrieb jedoch lohnt sich auf jeden Fall die&lt;br /&gt;
Investition in teurere Bestandteile (Stichwörter ECC-Speicher, SCSI,&lt;br /&gt;
Hauptplatinen und Netzteile von namhaften Herstellern). Nutzen Sie&lt;br /&gt;
unsere Mailing-Listen, um Hardware-Optionen zu diskutieren.&lt;br /&gt;
&lt;br /&gt;
== Fragen zum Betrieb ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie wähle ich per SELECT-Anweisung nur die ersten paar Zeilen bzw. eine beliebige Zeile in einer Abfrage aus? ===&lt;br /&gt;
  &lt;br /&gt;
Wenn Sie bei der Ausführung der Abfrage die Anzahl der anzufordenden&lt;br /&gt;
Reihen bereits kennen, nutzen Sie LIMIT. Wenn die ORDER BY- Anweisung&lt;br /&gt;
mit einem Index verwendet wird, ist es möglich, dass die gesamte&lt;br /&gt;
Abfrage nicht ausgeführt werden muss. Wenn Sie die Anzahl der der&lt;br /&gt;
anzufordenden Reihen nicht kennen, verwenden Sie einen Cursor und&lt;br /&gt;
FETCH.&lt;br /&gt;
&lt;br /&gt;
Um eine beliebige Zeile auszuwählen, nutzen Sie ORDER BY random():&lt;br /&gt;
    SELECT spalte&lt;br /&gt;
      FROM tabelle&lt;br /&gt;
  ORDER BY random()&lt;br /&gt;
     LIMIT 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Wie finde ich heraus, welche Tabellen, Indexe, Datenbanken oder Benutzer in der Datenbank definiert sind? Wie bekomme ich die von psql verwendeten Abfragen? ===&lt;br /&gt;
  &lt;br /&gt;
In psql zeigt der Befehl \dt eine Liste der Datenbanktabellen. Weitere&lt;br /&gt;
psql-Befehle lassen sich mit \? anzeigen. Sie können sich die Datei&lt;br /&gt;
pgsql/src/bin/psql/describe.c mit dem Quellcode für psql ansehen. Sie&lt;br /&gt;
enthält die SQL-Abfragen, die die Backslash-Kommandos (\) ausführen.&lt;br /&gt;
Sie können psql auch mit der -E Option starten. Danach gibt psql die&lt;br /&gt;
Abfragen aus, die es bei der Ausführung der Befehle benutzt. Außerdem&lt;br /&gt;
biete PostgreSQL ein SQL-kompatibles INFORMATION SCHEMA, das&lt;br /&gt;
Metainformation über die Datenbank zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
Mit psql -l können Sie alle Datenbanken anzeigen lassen.&lt;br /&gt;
&lt;br /&gt;
Die Datei pgsql/src/tutorial/syscat.source enthält außerdem viele&lt;br /&gt;
SELECT- Abfragen, mit deren Hilfe man Information über die&lt;br /&gt;
Systemtabellen erhalten kann.&lt;br /&gt;
&lt;br /&gt;
=== Wie ändere ich den Datentyp einer Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Ab Version 8.0 kann der Datentyp einer Spalte mit ALTER TABLE ALTER&lt;br /&gt;
COLUMN TYPE geändert werden, sofern der neue Datentyp die Werte des&lt;br /&gt;
alten Datentype aufnehmen kann.&lt;br /&gt;
&lt;br /&gt;
Bei früheren Versionen gehen Sie wie folgt vor:&lt;br /&gt;
    BEGIN;&lt;br /&gt;
    ALTER TABLE tabelle ADD COLUMN neue_spalte neuer_datentyp;&lt;br /&gt;
    UPDATE tabelle SET neue_spalte = CAST(alte_spalte AS neuer_datentyp);&lt;br /&gt;
    ALTER TABLE tabelle DROP COLUMN alte_spalte;&lt;br /&gt;
    COMMIT;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Speicherplatz freizugeben, der von der gelöschten Spalte&lt;br /&gt;
verwendet wurde, führen Sie VACUUM FULL aus.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank? ===&lt;br /&gt;
  &lt;br /&gt;
Es bestehen folgende Obergrenzen:&lt;br /&gt;
 Maximale Größe eine Datenbank?           unbeschränkt (es existieren&lt;br /&gt;
                                            Datenbanken mit 32 TB)&lt;br /&gt;
 Maximale Größe einer Tabelle?            32 TB&lt;br /&gt;
 Maximale Größe einer Zeile?              400 GB&lt;br /&gt;
 Maximale Größe einer Spalte?             1 GB&lt;br /&gt;
 Maximale Anzahl von Zeilen in einer Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
 Maximale Anzahl von Spalten in einer Tabelle?&lt;br /&gt;
                                          250-1600 je nach Spaltentyp&lt;br /&gt;
 Maximale Anzahl von Indexen für eine Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich sind dies theoretische Werte, die oft durch die&lt;br /&gt;
verfügbaren Platten- und Speicherressourcen beschränkt werden. Extreme&lt;br /&gt;
Größen können zu Leistungseinbußen führen.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße von 32 TB benötigt keine&lt;br /&gt;
Large-File-Unterstützung im Betriebssystem. Große Tabellen werden in&lt;br /&gt;
Dateien mit einer Größe von je 1 GB aufgeteilt, wodurch etwaige&lt;br /&gt;
dateisystem-bedingte Beschränkungen nicht relevant sind.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße und die maximale Anzahl von Spalten können&lt;br /&gt;
vervierfacht werden, indem man die Default-Blockgröße auf 32 KB&lt;br /&gt;
heraufsetzt. Die Tabellengröße kann auch durch Tabellenpartitionierung&lt;br /&gt;
vergrößert werden.&lt;br /&gt;
&lt;br /&gt;
Eine Einschränkung ist, dass Indexe nur auf Spalten erstellt werden&lt;br /&gt;
können, die bis etwa 2.000 Zeichen groß sind. Um auf größere Spalten&lt;br /&gt;
eine UNIQUE-Constraint setzen zu können, nutzen Sie einen funktionalen&lt;br /&gt;
Index mit dem MD5-Hash-Wert der Spalte. Um innerhalb einer großen, mit&lt;br /&gt;
Text belegten Spalte suchen zu können, verwenden Sie einen&lt;br /&gt;
Volltext-Index.&lt;br /&gt;
&lt;br /&gt;
=== Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen Textdatei abzuspeichern? ===&lt;br /&gt;
  &lt;br /&gt;
Eine PostgreSQL-Datenbank kann beim Abspeichern einer einfachen&lt;br /&gt;
Textdatei bis zu fünfmal mehr Platz gegenüber der eigentlichen Größe&lt;br /&gt;
der Datei beanspruchen.&lt;br /&gt;
&lt;br /&gt;
Betrachten wir eine Datei mit 100.000 Zeilen mit einem Integer und&lt;br /&gt;
einer Textbeschreibung pro Zeile. Gehen wir davon aus, dass die&lt;br /&gt;
durchschnittliche Länge der Textbeschreibung 20 Byte beträgt. Die&lt;br /&gt;
einfache Datei würde 2,8 MB groß sein. Die Größe der&lt;br /&gt;
PostgreSQL-Datenbankdatei, die diese Daten enthält, liegt ungefähr bei&lt;br /&gt;
5,2 MB:&lt;br /&gt;
 24 Bytes: jeder Zeilenkopf (ungefähr)&lt;br /&gt;
+24 Bytes: ein Integer-Feld und ein Textfeld&lt;br /&gt;
+ 4 Bytes: Zeiger auf der Datenseite auf den Tupel&lt;br /&gt;
-----------------------------------------------&lt;br /&gt;
 52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
Die Größe einer Datenseite in PostgreSQL beträgt 8192 Bytes (8 KB),&lt;br /&gt;
also:&lt;br /&gt;
8192 Bytes pro Seite&lt;br /&gt;
---------------------   =  146 Zeilen pro Seite (abgerundet)&lt;br /&gt;
  52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
100.000 Datenzeilen&lt;br /&gt;
------------------------  =  685 Datenbankseiten (aufgerundet)&lt;br /&gt;
    158 Zeilen pro Seite&lt;br /&gt;
&lt;br /&gt;
633 Datenbankseiten * 8192 Bytes pro Seite  =  5,185,536 bytes (5,2 MB)&lt;br /&gt;
&lt;br /&gt;
Indexe beanspruchen nicht so viel Platz. Da sie jedoch die Daten&lt;br /&gt;
beinhalten, die sie indizieren, können auch sie sehr groß werden.&lt;br /&gt;
&lt;br /&gt;
NULL-Werte werden als Bitmaps gespeichert, wodurch sie sehr wenig&lt;br /&gt;
Platz in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Meine Abfragen sind langsam oder benutzen die Indexe nicht. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Indexe werden nicht automatisch bei jeder Abfrage verwendet. Indexe&lt;br /&gt;
werden nur dann verwendet, wenn die abzufragende Tabelle eine&lt;br /&gt;
bestimmte Größe übersteigt, und die Abfrage nur eine kleine&lt;br /&gt;
Prozentzahl der Tabellenzeilen abfragt. Der Grund hierfür ist der,&lt;br /&gt;
dass die durch einen Index verursachten Festplattenzugriffe manchmal&lt;br /&gt;
länger dauern würden als ein einfaches Auslesen aller Tabellenzeilen&lt;br /&gt;
(sequentieller Scan).&lt;br /&gt;
&lt;br /&gt;
Um festzustellen, ob ein Index verwendet werden soll, braucht&lt;br /&gt;
PostgreSQL Statistiken über die Tabelle. Diese Statistiken werden&lt;br /&gt;
durch die Anweisungen VACUUM ANALYZE bzw. ANALYZE berechnet. Anhand&lt;br /&gt;
der Statistiken kennt der Abfragenoptimierer die Anzahl der&lt;br /&gt;
Tabellenzeilen und kann besser entscheiden, ob Indexe verwendet werden&lt;br /&gt;
sollen. Statistiken sind auch bei der Ermittlung der optimalen&lt;br /&gt;
JOIN-Reihenfolgen und -Methoden wertvoll. Daher sollten diese&lt;br /&gt;
regelmässig durchgeführt werden, da sich der Inhalt einer Tabelle ja&lt;br /&gt;
auch verändert.&lt;br /&gt;
&lt;br /&gt;
Indexe werden normalerweise nicht in ORDER BY-Abfrage oder in JOINs&lt;br /&gt;
verwendet. Ein sequentieller Scan mit anschließendem explizitem&lt;br /&gt;
Sortiervorgang ist normalerweise schneller als ein Index-Scan einer&lt;br /&gt;
großen Tabelle. Jedoch wird bei einer Abfrage, in der LIMIT zusammen&lt;br /&gt;
mit ORDER BY verwendet wird, oftmals ein Index verwendet, da nur ein&lt;br /&gt;
kleiner Abschnitt der Tabelle zurückgeliefert wird.&lt;br /&gt;
&lt;br /&gt;
Sollte es danach aussehen, also ob der Optimierer irrtümlich einen&lt;br /&gt;
sequentiellen Scan ausführt, führen Sie SET enable_seqscan TO 'off'&lt;br /&gt;
aus und prüfen Sie, ob die Indexabfrage dadurch scheller geworden ist.&lt;br /&gt;
&lt;br /&gt;
Bei der Nutzung von Wildcard-Operatoren wie LIKE oder ~, können Indexe&lt;br /&gt;
nur unter bestimmten Umständen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
* Das Suchmuster muss sich an Anfang des Strings befinden, d.h.:&lt;br /&gt;
** LIKE-Suchmuster dürfen nicht mit % anfangen;&lt;br /&gt;
** ~ (reguläre Ausdrücke) müssen mit ^ anfangen.&lt;br /&gt;
* Das Suchmuster darf nicht mit einer Zeichenklasse (z.B. [a-e]) beginnen.&lt;br /&gt;
* Suchmuster, die Gross- und Kleinschreibung nicht berücksichtigen (z.B. ILIKE bzw. ~*), verwenden keine Indexe. Stattdessen können funktionale Indexe verwendet werden, die im Punkt 4.8 beschrieben werden.&lt;br /&gt;
* Die Standard-Locale &amp;quot;C&amp;quot; muss während der Datenbank-Initialisierung mit initdb verwendet worden sein, da andere locales den nächstgrößten Wert nicht ermitteln können. Es ist allerdings möglich, einen besonderen text_pattern_ops-Index für solche Fälle zu erstellen.&lt;br /&gt;
    &lt;br /&gt;
In Versionen vor 8.0 werden Indexe oft nicht benutzt, wenn die&lt;br /&gt;
jeweiligen Datentypen nicht genau übereinstimmen. Dies gilt besonders&lt;br /&gt;
für Indexe auf Spalten mit den Datentypen INT2, INT8 und NUMERIC&lt;br /&gt;
&lt;br /&gt;
=== Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine Abfrage auswertet? ===&lt;br /&gt;
  &lt;br /&gt;
Eine ausführliche Erklärung zu diesem Thema findet sich in der [http://www.postgresql.org/docs/current/static/sql-explain.html EXPLAIN] Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie änder ich das Sortierverhalten von textähnlichen Daten? ===&lt;br /&gt;
PostgreSQL sortiert Daten anhand dem bei initdb gesetzten Locale. (Ab 8.4 wird es es möglich sein pro Datenbank ein eigenes Locale zu definieren)&lt;br /&gt;
&lt;br /&gt;
Entspricht das Sortierverhalten nicht dem gewünschten muss man die Locale ändern. Die meisten Locales, außer &amp;quot;C&amp;quot;, sortieren anhand der Reihenfolge des entsprechenden Wörterbuches. Das Locale &amp;quot;C&amp;quot; ignoriert jegliche Punktuation und Zwischenraum.&lt;br /&gt;
&lt;br /&gt;
=== Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei einer Suche, bei der Groß- und Kleinschreibweisen ignoriert werden? Wie verwende ich einen Index bei solchen Suchabfragen? ===&lt;br /&gt;
  &lt;br /&gt;
Der Operator ~ wendet einen regulären Ausdruck an und ~* wendet ihn&lt;br /&gt;
an, ohne die Groß- und Kleinschreibung zu beachten. Ebenso beachtet&lt;br /&gt;
LIKE die Groß- und Kleinschreibung, und ILIKE nicht.&lt;br /&gt;
&lt;br /&gt;
Gleichheitsvergleiche, die Groß- und Kleinschreibung ignorieren,&lt;br /&gt;
werden in der Regel so ausgedruckt:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle&lt;br /&gt;
    WHERE LOWER(spalte) = 'abc'&lt;br /&gt;
&lt;br /&gt;
Hier wird kein normaler Index benutzt. Legt man hingegen einen&lt;br /&gt;
funktionalen Index an, so wird er auf jeden Fall verwendet:&lt;br /&gt;
   CREATE INDEX tabelle_index ON tabelle (LOWER(spalte))&lt;br /&gt;
&lt;br /&gt;
Falls der obige Index als einen UNIQUE-Index angelegt wird, können&lt;br /&gt;
keine Werte in die Spalte eingefügt werden, die sich nur durch ihre&lt;br /&gt;
Groß- und Kleinschreibung unterscheiden. Um Fehler zu vermeiden muß&lt;br /&gt;
ein CHECK-Constraint oder ein Trigger eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist? Kann nach der NULL-Belegung sortiert werden? ===&lt;br /&gt;
  &lt;br /&gt;
Testen Sie die Spalte mit IS NULL bzw. IS NOT NULL.&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   WHERE &lt;br /&gt;
      spalte IS NULL&lt;br /&gt;
&lt;br /&gt;
Beim konkatenieren mit einen NULL-Wert wir das Ergebnis auch NULL. Um dies zu verhindern verwenden Sie am besten [http://www.postgresql.org/docs/current/static/functions-conditional.html| COALESCE()]&lt;br /&gt;
   SELECT &lt;br /&gt;
      COALESCE(col1, '') || COALESCE(col2, '')&lt;br /&gt;
   FROM tab;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um die Spalte danach zu sortieren, ob sie mit NULL belegt ist oder nicht, verwenden Sie die Bedingungen IS NULL bzw. IS NOT NULL in der ORDER BY-Klausel. Da Bedingungen, die wahr sind, höher als das Gegenteil sortiert werden, bewirkt die folgende Abfrage, dass die NULL-Spalten zuerst gelistet werden:&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      (spalte IS NOT NULL)&lt;br /&gt;
&lt;br /&gt;
Ab PostreSQL 8.3 und höher, ist es möglich das standardisierte NULLS FIRST/NULLS LAST zu verwenden um die Position der NULL-Werte im Ergebnis zu bestimmen. (bei FIRST stehen diese zu erst, bei LAST am Ende)&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tab&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      col NULLS FIRST;&lt;br /&gt;
&lt;br /&gt;
=== Was ist der Unterschied zwischen den verschiedenen CHAR-Typen? ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Typ&lt;br /&gt;
!interner Name&lt;br /&gt;
!Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
|VARCHAR(n) &lt;br /&gt;
|varchar&lt;br /&gt;
|die Größe legt die Maximallänge fest; kein Auffüllen mit Leerzeichen&lt;br /&gt;
|-  &lt;br /&gt;
|CHAR(n)&lt;br /&gt;
|bpchar&lt;br /&gt;
|mit Leerzeichen gefüllt bis zur angegebenen Länge&lt;br /&gt;
|-&lt;br /&gt;
|TEXT&lt;br /&gt;
|text&lt;br /&gt;
|keine obere Grenze für die Länge&lt;br /&gt;
|-&lt;br /&gt;
|BYTEA&lt;br /&gt;
|bytea&lt;br /&gt;
|Bytearray mit variabler Länge (auch für '\0'-Bytes geeignet)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;char&amp;quot; (with the quotes)&lt;br /&gt;
|char&lt;br /&gt;
|ein Zeichen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der interne Name kommt vor allem in den Systemkatalogen und in manchen&lt;br /&gt;
Fehlermeldungen vor.&lt;br /&gt;
&lt;br /&gt;
Die ersten vier Typen sind &amp;quot;varlena&amp;quot;-Typen (d.h. die ersten vier Bytes&lt;br /&gt;
geben die Länge an, gefolgt von den Daten). Daher ist der tatsächlich&lt;br /&gt;
belegte Platz immer etwas mehr als die deklarierte Feldgröße.&lt;br /&gt;
Allerdings wird unter Umständen auf diese Datentypen Datenkompression&lt;br /&gt;
durch das TOAST- Verfahren angewendet, womit der tatsächlich belegte&lt;br /&gt;
Platz auch geringer als erwartet ausfallen kann.&lt;br /&gt;
&lt;br /&gt;
Für die Speicherung von Zeichenketten variabler Länge empfiehlt sich&lt;br /&gt;
VARCHAR(n). Die maximale Länge eines VARCHAR(n)-Felds wird bei der&lt;br /&gt;
Tabellendefinition festgelegt. TEXT setzt keine Längengrenze,&lt;br /&gt;
allerdings gibt es eine systembedingte Obergrenze von 1 GB.&lt;br /&gt;
&lt;br /&gt;
CHAR(n) ist geeignet für die Speicherung von Zeichenketten, die alle&lt;br /&gt;
die gleiche Länge haben. Bitte beachten Sie, dass CHAR(n) automatisch&lt;br /&gt;
Zeichenketten bis zur definierten Feldlänge mit Leerzeichen ausfüllt,&lt;br /&gt;
während bei VARCHAR(n) nur die tatsächlich eingegebene Zeichenkette&lt;br /&gt;
gespeichert wird.&lt;br /&gt;
&lt;br /&gt;
BYTEA ist für binäre Daten, besonders für Werte, die NULL-Bytes haben.&lt;br /&gt;
&lt;br /&gt;
Alle der hier erwähnten Typen weisen ähnliche Performanzeigenschaften&lt;br /&gt;
auf.&lt;br /&gt;
&lt;br /&gt;
=== Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Wert? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet einen SERIAL-Datentyp. Dies ist zwar kein richtiger Datentyp. Es ist die Kurzform für das Erstellen einer Spalte vom Typ Integer, die von einer Sequenz befüllt wird. &lt;br /&gt;
&lt;br /&gt;
Zum Beispiel:&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
       id   SERIAL,&lt;br /&gt;
       name TEXT&lt;br /&gt;
   )&lt;br /&gt;
&lt;br /&gt;
wird automatisch in:&lt;br /&gt;
   CREATE SEQUENCE person_id_seq;&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
     id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),&lt;br /&gt;
     name TEXT&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Die automatisch generierte Sequenz besitzt immer folgenden Namen:&lt;br /&gt;
''tabellederspalte''-''namederspalte''_seq&lt;br /&gt;
&lt;br /&gt;
Die Man-Page zu CREATE SEQUENCE beinhaltet mehr Informationen zu Sequenzen.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einen Typ BIGSERIAL, dieser unterscheidet sich aber nur darin dass die Spalte den Typ BIGINTEGER bekommt. BIGSERIAL sollte verwendet werden wenn es zu erwarten ist, dass mehr als 2 Milliarden Sequenz-Werte verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie bekomme ich den Wert einer SERIAL-Sequenz? ===&lt;br /&gt;
  &lt;br /&gt;
Eine Möglichkeit wäre, mit der nextval()-Funktion den nächsten SERIAL-Wert von dem Sequenzobjekt vor der Auszuführung einer INSERT-Anweisung anzufordern und ihn dann explizit in die INSERT-Anweisung einzubinden. Anhand der Beispieltabelle in 4.11.1 könnte dieser Vorgang in einer Pseudosprache so aussehen:&lt;br /&gt;
&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT nextval('person_id_seq')&amp;quot;);&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Danach stünde der neue Wert in der Variablen new_id für die Verwendung in weiteren Abfragen zur Verfügung, zum Beispiel als Fremdschlüssel zur Tabelle 'person'). Bitte beachten Sie, dass der Name des automatisch erstellten SEQUENCE-Objektes folgenden Name hat: «table»_«serialcolumn»_seq wobei 'table' und 'serialcolumn' die Namen&lt;br /&gt;
der jeweils betreffenden Tabelle / Spalte darstellen.&lt;br /&gt;
&lt;br /&gt;
Als weitere Möglichkeit können Sie nach einer INSERT-Anweisung den automatisch eingefügten SERIAL-Wert mit der currval()-Funktion zurückgeben lassen:&lt;br /&gt;
&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT currval('person_id_seq')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Die einfachste Möglichkeit ist es RETURNING zu verwenden. Ein einfaches Beispiel sähe so aus:&lt;br /&gt;
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;&lt;br /&gt;
&lt;br /&gt;
=== Führt currval() zu einer Race-Condition mit anderen Nutzern? ===&lt;br /&gt;
  &lt;br /&gt;
Nein. currval() liefert einen Wert zurück, der von Ihrer&lt;br /&gt;
Datenbank-Session bestimmt wird, und der anderen Sessionen nicht zur&lt;br /&gt;
Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner Sequenz-/SERIAL-Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Um die gleichzeitige Abarbeitung von Transaktionen zu verbessern,&lt;br /&gt;
werden Sequenzen gerade nicht für andere Transaktionen gesperrt,&lt;br /&gt;
sondern die Sequenznummern werden den laufenden Transaktionen sofort&lt;br /&gt;
zugeteilt. Lücken in der Sequenznummerierung werden durch abgebrochene&lt;br /&gt;
Transaktionen verursacht.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein OID? ===&lt;br /&gt;
  &lt;br /&gt;
Jede Zeile, die in PostgreSQL erzeugt wird, bekommt eine eindeutige OID, sofern die Tabelle nicht mit der Option WITHOUT OIDS angelegt wurde. OIDs sind automatisch zugewiesene 4-Byte-Integer, die innerhalb der gesamten Datenbank einmalig sind. Allerdings laufen sie bei einem Wert von ungefähr 4 Milliarden über. PostgreSQL verwendet OIDs, um&lt;br /&gt;
seine interne Systemtabellen zu verbinden.&lt;br /&gt;
&lt;br /&gt;
Um einmalige Idenfikatoren in Datentabellen zu erstellen, wird allerdings empfohlen, statt OIDs Werte zu verwenden, die von SERIAL-Sequenzen erzeugt werden. SERIAL-Sequenzen sind innerhalb einer Tabelle einmalig und daher weniger anfällig für Überläufe. Außerdem können 8-Byte-Sequenzwerte mit BIGSERIAL (SERIAL8) erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein CTID? ===&lt;br /&gt;
&lt;br /&gt;
CTIDs werden benutzt, um bestimmte physikalische Zeilen durch Block und Offset Werte zu identifizieren. CTIDs verändern sich, sobald Zeilen verändert oder zurückgeladen werden. Sie werden in Indexeinträgen benutzt um auf die physikalischen Zeilen zu zeigen.&lt;br /&gt;
&lt;br /&gt;
=== Wieso bekomme ich einen Fehler: &amp;quot;ERROR: Memory exhausted in AllocSetAlloc()&amp;quot;? ===&lt;br /&gt;
  &lt;br /&gt;
Wahrscheinlich gibt es keinen virtuellen Speicher mehr in Ihrem System&lt;br /&gt;
oder Ihr Kernel hat niedrige Höchstgrenzen für bestimmte Ressourcen.&lt;br /&gt;
Probieren Sie vor dem Start von postmaster folgendes:&lt;br /&gt;
   ulimit -d 262144&lt;br /&gt;
   limit datasize 256m&lt;br /&gt;
&lt;br /&gt;
Je nach benutzter Shell wird nur einer dieser Befehle erfolgreich&lt;br /&gt;
ausgeführt werden. Auf jedem Fall wird die Grenze des Datensegments&lt;br /&gt;
für Prozesse erhöht werden und eventuell die erfolgreiche Ausführung&lt;br /&gt;
der Abfrage ermöglichen. Falls Sie ein Problem mit dem SQL-Client&lt;br /&gt;
haben, weil das Backend zu viele Daten zurückliefert, versuchen Sie&lt;br /&gt;
dies vor dem Start des SQL-Clients.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft? ===&lt;br /&gt;
  &lt;br /&gt;
Geben Sie in psql SELECT VERSION(); ein.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine Spalte erstellen, deren Default-Wert immer die aktuelle Uhrzeit enthalten soll? ===&lt;br /&gt;
  &lt;br /&gt;
Dazu verwenden Sie CURRENT_TIMESTAMP:&lt;br /&gt;
   CREATE TABLE test (x INT, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );&lt;br /&gt;
&lt;br /&gt;
=== Wie führe ich eine OUTER JOIN durch? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt OUTER JOINs nach dem SQL- Standardsyntax. Hier&lt;br /&gt;
zwei Beispiele:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 ON (t1.spalte = t2.spalte)&lt;br /&gt;
&lt;br /&gt;
bzw.:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 USING (spalte)&lt;br /&gt;
&lt;br /&gt;
Diese identischen Abfragen verknüpfen tabelle_1 mit tabelle_2 über die&lt;br /&gt;
Spalte 'spalte' und geben außerdem alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_1 (diejenigen, die keine Entsprechung in tabelle_2 haben)&lt;br /&gt;
zurück. Ein RIGHT JOIN würde hingegen alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_2 hinzufügen und ein FULL JOIN würde alle verknüpften Zeilen&lt;br /&gt;
sowie jeweils alle unverknüpften Zeilen aus den beiden Tabellen&lt;br /&gt;
zurückliefern. Die Angabe von OUTER ist nicht zwingend und kann in&lt;br /&gt;
LEFT, RIGHT und FULL-Verknüpfungen weggelassen werden. Normale&lt;br /&gt;
Verknüpfungen sind INNER JOINs.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt keinen Weg, innerhalb einer Abfrage auf mehr als eine&lt;br /&gt;
Datenbank zuzugreifen. Da PostgreSQL datenbank-spezifische&lt;br /&gt;
Systemkataloge lädt, ist eine datenbankübergreifende Abfrage nicht&lt;br /&gt;
möglich.&lt;br /&gt;
&lt;br /&gt;
contrib/dblink ist eine Erweiterung, die datenbankübergreifende&lt;br /&gt;
Abfragen über Funktionsaufrufe ermöglicht.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion zurückgeben lassen? ===&lt;br /&gt;
  &lt;br /&gt;
Funktionen können mehrere Zeilen und Spalten zurückgeben, vgl.:&lt;br /&gt;
http://www.postgresql.org/docs/techdocs.17.&lt;br /&gt;
&lt;br /&gt;
=== Warum bekomme ich eine Fehlermeldung wie &amp;quot;relation with OID ##### does not exist&amp;quot; wenn ich temporäre Tabellen in PL/PgSQL-Funktionen benutze? ===&lt;br /&gt;
  &lt;br /&gt;
In PostgreSQL-Versionen vor 8.3 verarbeitet PL/PgSQL Funktionen in&lt;br /&gt;
einer Cache. Dies hat eine unangenehme Nebenwirkung, nämlich dass wenn&lt;br /&gt;
eine PL/PgSQL-Funktion auf eine temporäre Tabelle zugreift, und diese&lt;br /&gt;
Tabelle anschließend gelöscht bzw. neu erstellt wird, die Funktion&lt;br /&gt;
fehlschlagen wird, da die gecachten Funktionsinhalte noch auf die alte&lt;br /&gt;
temporäre Tabelle zeigen. Die Lösung für diese Probleme besteht darin,&lt;br /&gt;
in der PL/PgSQL- Funktion mittels EXECUTE auf temporäre Tabellen&lt;br /&gt;
zuzugreifen. Dies bewirkt, dass bei jedem Funktionsruf die betreffende&lt;br /&gt;
Abfrage neu geparst wird.&lt;br /&gt;
&lt;br /&gt;
Dieses Problem taucht in PostgreSQL 8.3 und späteren Versionen nicht&lt;br /&gt;
mehr auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Replikationslösungen gibt es? ===&lt;br /&gt;
  &lt;br /&gt;
Der Begriff &amp;quot;replikation&amp;quot; umfasst mehrere verschiedene Technologien,&lt;br /&gt;
jede mit eigenen Vor- und Nachteilen. [http://www.postgresql.org/docs/8.3/static/high-availability.html| Die Dokumentation enthält eine gute Einführung in das Thema Replikation]&lt;br /&gt;
&lt;br /&gt;
Mit &amp;quot;Master/slave&amp;quot;-Replikation werden Änderungen in einer&lt;br /&gt;
Hauptdatenbank durchgeführt und an &amp;quot;Sklaven&amp;quot; verteilt, die im&lt;br /&gt;
Nur-Lese-Modus arbeiten. Die populärste Lösung für PostgreSQL ist&lt;br /&gt;
Slony-I.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Multi-master replication&amp;quot; ermöglicht sowohl lesende als auch&lt;br /&gt;
schreibende Zugriffe über mehrere Datenbank-Server hinweg. Allerdings&lt;br /&gt;
hat diese Art von Replikation eine negative Auswirkung auf die&lt;br /&gt;
Performanz durch die Notwendigkeit, Änderungen zwischen Servern zu&lt;br /&gt;
synchronisieren. Pgcluster ist die populärste freie Lösung für&lt;br /&gt;
PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einige kommerzielle und hardware-basierte&lt;br /&gt;
Replikationslösungen für verschiedene Arten der Replikation.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Tabellen- und Spaltennamen in meiner Abfrage nicht erkannt? Warum werden Großbuchstaben umgewandelt? ===&lt;br /&gt;
  &lt;br /&gt;
Die häufigste Ursache ist die Verwendung von Gänsefüßchen bei der&lt;br /&gt;
Anlegung von Tabellen, z.B.:&lt;br /&gt;
    CREATE TABLE &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
                (&amp;quot;SPALTE1&amp;quot; INT)&lt;br /&gt;
&lt;br /&gt;
Dadurch werden Tabellen- und Spaltennamen (sog. Identifikatoren) in&lt;br /&gt;
genau der Schreibweise gespeichert (vgl. Dokumentation), was dazu&lt;br /&gt;
führt, dass man sie danach immer in Gänsefüßchen angeben muss. Im&lt;br /&gt;
obigen Beispiel muss man also immer etwa SELECT * FROM &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
verwenden. Um dieses Problem zu vermeiden, müssen Sie immer eines der&lt;br /&gt;
folgenden Punkte beachten:&lt;br /&gt;
&lt;br /&gt;
* bei der Tabellenanlegung keine Gänsefüßchen verwenden;&lt;br /&gt;
* in Identifikatoren nur Kleinschreibung verwenden;&lt;br /&gt;
* immer Identifikatoren mit Gänsefüßchen versehen&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen des Übersetzers ==&lt;br /&gt;
  &lt;br /&gt;
Die englische Vorlage dieser FAQ wird ständig überarbeitet. Daher&lt;br /&gt;
liegt die Übersetzung nicht immer auf dem aktuellsten Stand.&lt;br /&gt;
&lt;br /&gt;
Die aktuellste Version der deutschen Übersetzung befindet sich immer&lt;br /&gt;
unter http://sql-info.de/de/postgresql/FAQ_german.html. Diese&lt;br /&gt;
&amp;quot;Arbeitsversion&amp;quot; enthält eventuell Änderungen, die noch nicht auf der&lt;br /&gt;
PostgreSQL-Website eingebunden worden sind.&lt;br /&gt;
&lt;br /&gt;
Über Verbesserungshinweise und Korrekturvorschläge sowie&lt;br /&gt;
Verständnisfragen zum Inhalt der FAQ freue ich mich. Ich nehme auch&lt;br /&gt;
allgemeine Fragen zu PostgreSQL gerne entgegen, verweise jedoch auf&lt;br /&gt;
die Mailing-Listen als schnelle und zuverlässige Anlaufstellen.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/FAQ/de</id>
		<title>FAQ/de</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/FAQ/de"/>
				<updated>2011-12-06T18:40:07Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;more markup fixes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Was ist PostgreSQL? Wie wird es ausgesprochen? ===&lt;br /&gt;
  &lt;br /&gt;
Die (englische) Aussprache ist &amp;quot;Post-Gres-Q-L&amp;quot;. Im allgemeinen&lt;br /&gt;
Sprachgebrauch hat sich die Kurzform &amp;quot;Postgres&amp;quot; auch durchgesetzt.&lt;br /&gt;
(Für diejenigen, die es interessiert: eine MP3-Datei mit der&lt;br /&gt;
amerikanischen Aussprache befindet sich hier:&lt;br /&gt;
http://www.postgresql.org/files/postgresql.mp3&lt;br /&gt;
&lt;br /&gt;
PostgreSQL ist ein objektrelationales Datenbanksystem, das die Vorzüge&lt;br /&gt;
von kommerziellen Datenbanksystemen mit zukunftsweisenden Innovationen&lt;br /&gt;
kombiniert. PostgreSQL ist freie Software und dessen kompletter&lt;br /&gt;
Quellcode ist öffentlich verfügbar.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Entwicklung wird von einem Team von meist freiwilligen&lt;br /&gt;
Entwicklern durchgeführt. Dieses Team ist für die Gesamtentwicklung&lt;br /&gt;
von PostgreSQL verantwortlich. Es handelt sich um ein&lt;br /&gt;
Gemeinschaftsprojekt, das nicht von einer bestimmten Firma&lt;br /&gt;
kontrolliert wird. Lesen Sie die Entwickler-FAQ:&lt;br /&gt;
http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn Sie an einer&lt;br /&gt;
Mitarbeit interessiert sind.&lt;br /&gt;
&lt;br /&gt;
=== Wer kontrolliert PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Falls Sie nach dem Namen eines etwaigen Inhabers bzw. nach einem&lt;br /&gt;
allmächtigen Zentralkommittee suchen - sparen Sie sich die Mühe, sowas&lt;br /&gt;
existiert gar nicht. Es gibt zwar das &amp;quot;Core Committee&amp;quot; sowie&lt;br /&gt;
Entwickler, die CVS-Schreibberechtigung haben, jedoch haben diese&lt;br /&gt;
Gruppen eher nur eine administrative Rolle. Das Projekt wird durch die&lt;br /&gt;
Community gesteuert, die aus den Entwicklern sowie natürlich auch den&lt;br /&gt;
Nutzern besteht - jeder kann daran teilnehmen. (Lesen Sie die&lt;br /&gt;
Entwickler-FAQ: http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn&lt;br /&gt;
Sie an der PostgreSQL-Entwicklung teilnehmen möchten).&lt;br /&gt;
&lt;br /&gt;
=== Welchem Copyright unterliegt PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL wird unter der klassischen BSD-Lizenz herausgegeben. Im&lt;br /&gt;
Grunde genommen erlaubt diese den Nutzern, beliebig mit dem Code&lt;br /&gt;
umzugehen, auch der Weiterverkauf von Binärversionen ohne Quellcode&lt;br /&gt;
ist erlaubt. Die einzige Einschränkung besteht darin, dass PostgreSQL&lt;br /&gt;
auf keinen Fall für etwaige Probleme mit der Software haftet. Außerdem&lt;br /&gt;
muß der Copyright- Text in allen Kopien der Software enthalten sein.&lt;br /&gt;
Dies ist der Originaltext der BSD-Lizenz:&lt;br /&gt;
 &lt;br /&gt;
 PostgreSQL Data Base Management System&lt;br /&gt;
 &lt;br /&gt;
 Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group&lt;br /&gt;
 Portions Copyright (c) 1994-6 Regents of the University of California&lt;br /&gt;
 &lt;br /&gt;
 Permission to use, copy, modify, and distribute this software and its&lt;br /&gt;
 documentation for any purpose, without fee, and without a written&lt;br /&gt;
 agreement is hereby granted, provided that the above copyright notice&lt;br /&gt;
 and this paragraph and the following two paragraphs appear in all&lt;br /&gt;
 copies.&lt;br /&gt;
 &lt;br /&gt;
 IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY&lt;br /&gt;
 FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,&lt;br /&gt;
 INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND&lt;br /&gt;
 ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN&lt;br /&gt;
 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 &lt;br /&gt;
 THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,&lt;br /&gt;
 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF&lt;br /&gt;
 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE&lt;br /&gt;
 PROVIDED HEREUNDER IS ON AN &amp;quot;AS IS&amp;quot; BASIS, AND THE UNIVERSITY OF&lt;br /&gt;
 CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,&lt;br /&gt;
 UPDATES, ENHANCEMENTS, OR MODIFICATIONS.&lt;br /&gt;
&lt;br /&gt;
Es gilt die Copyright-Klausel im Original!&lt;br /&gt;
&lt;br /&gt;
=== Auf welchen Plattformen läuft PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Normalerweise kann PostgreSQL auf jeder modernen UNIX-kompatiblen&lt;br /&gt;
Plattform eingesetzt werden. Diejenigen Plattformen, die bei der&lt;br /&gt;
jeweiligen Versionsfreigabe getestet wurden, sind in den&lt;br /&gt;
Installationsanleitungen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
PostgreSQL läuft auch auf Microsoft NT-basierten Betriebssystemen wie&lt;br /&gt;
Windows 2000 SP4, XP und Server 2003. Ein vorgefertigtes&lt;br /&gt;
Installationspaket kann von http://pgfoundry.org/projects/pginstaller&lt;br /&gt;
heruntergeladen werden. DOS-basierte Windows-Versionen (Win95, Win98,&lt;br /&gt;
WinMe) können PostgreSQL nur mit Hilfe der Cygwin-Umgebung ausführen.&lt;br /&gt;
&lt;br /&gt;
=== Woher bekomme ich PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Per Web-Browser hier: http://www.postgresql.org/ftp/ und per FTP hier:&lt;br /&gt;
ftp://ftp.postgresql.org/pub/.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die neueste Version von PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die neueste Version von PostgreSQL kann auf der [http://www.postgresql.org/ Website] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Die Freigabe einer neuen Hauptversion erfolgt in der Regel jährlich, kleinere Korrekturversionen alle paar Monaten. Die kleineren Updates werden &amp;quot;Minor&amp;quot;-Updates, die großen jährlich erscheinenden &amp;quot;Major&amp;quot;-Updates genannt. &amp;quot;Minor&amp;quot;-Update erscheinen in der Regel gleichzeitig für alle unterstützten &amp;quot;Major&amp;quot;-Versionen. [http://www.postgresql.org/support/versioning Falls Sie dieses Thema interessiert sollten Sie hier weiterlesen.]&lt;br /&gt;
&lt;br /&gt;
=== Wo bekomme ich Support für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Community bietet Unterstützung per Mailing-Liste. Die&lt;br /&gt;
Web-Seite http://www.postgresql.org/community/lists/ bietet einen&lt;br /&gt;
Überblick. Die Listen general und bugs bieten einen guten Einstieg.&lt;br /&gt;
&lt;br /&gt;
Eine deutschsprachige Mailing-Liste gibt es hier:&lt;br /&gt;
http://archives.postgresql.org/pgsql-de-allgemein/.&lt;br /&gt;
&lt;br /&gt;
Der wichtigsten IRC-Channel ist #postgresql auf Freenode&lt;br /&gt;
(irc.freenode.net). Unter UNIX/Linux können Sie mit z.B. irc -c&lt;br /&gt;
'#postgresql' &amp;quot;$USER&amp;quot; irc.freenode.net. daran teilnehmen. Auf Freenode&lt;br /&gt;
gibt es folgende Channels:&lt;br /&gt;
* #postgresql-es (spanisch)&lt;br /&gt;
* #postgresqlfr (französischen)&lt;br /&gt;
* #postgresql-br (brasilianischen) &lt;br /&gt;
&lt;br /&gt;
Es gibt außerdem einen PostgreSQL-Channel bei EFNet.&lt;br /&gt;
&lt;br /&gt;
Eine Liste von Unternehmen, die Support für PostgreSQL auf kommerzieller Basis leisten, kann unter http://www.postgresql.org/support/professional_support eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich einen Fehlerbericht abgeben? ===&lt;br /&gt;
  &lt;br /&gt;
Nutzen Sie das Formular unter&lt;br /&gt;
http://www.postgresql.org/support/submitbug. Schauen Sie aber vorher&lt;br /&gt;
unter ftp://ftp.postgresql.org/pub/ nach, ob es mittlerweile eine&lt;br /&gt;
neuere PostgreSQL-Version gibt, in der der Fehler behoben wurde.&lt;br /&gt;
&lt;br /&gt;
Bugs, die über das Formular bzw. eine der Mailing-Listen&lt;br /&gt;
bekanntgegeben wurden, erhalten typischerweise einer der folgenden&lt;br /&gt;
Reaktionen:&lt;br /&gt;
&lt;br /&gt;
* es ist kein Bug, der Grund wird benannt&lt;br /&gt;
* es ist ein bereits bekannter Bug, der bereits auf der TODO-Liste aufgenommen wurde&lt;br /&gt;
* der Bug wurde in der aktuellen Version behoben&lt;br /&gt;
* der Bug wurde bereits behoben, befindet sich aber noch nicht in einer offiziell veröffentlichten Version&lt;br /&gt;
* es wird um eingehendere Informationen gebeten, z.B.:&lt;br /&gt;
** Betriebssystem&lt;br /&gt;
** PostgreSQL-Version&lt;br /&gt;
** reproduzierbares Fallbeispiel&lt;br /&gt;
** Debugging-Information&lt;br /&gt;
** Debugger-Backtrace-Ausgabe&lt;br /&gt;
* der Bug ist neu. Folgendes könnte passieren:&lt;br /&gt;
** ein Patch wird erstellt und in der nächsten Version eingebaut&lt;br /&gt;
** der Bug kann nicht sofort behoben werden und wird auf die TODO-Liste gesetzt&lt;br /&gt;
    &lt;br /&gt;
=== Wie erfahre ich von bekannten Bugs oder fehlenden Features? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt eine erweiterte Teilmenge von SQL:2003. Siehe&lt;br /&gt;
unsere TODO-Liste unter http://www.postgresql.org/docs/faqs.TODO.html&lt;br /&gt;
für eine Auflistung der bekannten Bugs, fehlenden Features und&lt;br /&gt;
zukünftigen Pläne.&lt;br /&gt;
&lt;br /&gt;
Eine Anfrage nach einem neuen Feature führt normalerweise zu einer der&lt;br /&gt;
folgenden Antworten:&lt;br /&gt;
&lt;br /&gt;
* das Feature ist bereits auf der TODO-Liste&lt;br /&gt;
* das Feature ist nicht wünschenswert, weil:&lt;br /&gt;
** es vorhandene Funktionalität dupliziert, welche bereits dem SQL-Standard folgt&lt;br /&gt;
** es würde die Komplexität der Code-Basis erhöhen, ohne nennenswerte Vorteile zu bringen&lt;br /&gt;
** es wäre unsicher bzw. unzuverlässig&lt;br /&gt;
* das neue Feature wird der TODO-Liste hinzugefügt&lt;br /&gt;
    &lt;br /&gt;
PostgreSQL verwendet kein Bugtracking-System, da es sich als effizienter erwiesen hat, E-Mails direkt zu beantworten und die TODO-Liste aktuell zu halten. In der Praxis werden Bugs sehr schnell beseitigt, und diejenigen Bugs, die Auswirkungen auf eine große Anzahl von Nutzern haben, werden meist kurzfristig korrigiert. Der einzige Überblick über alle Änderungen, Verbesserungen und Korrekturen in einer PostgreSQL-Version befindet sich in den CVS-Log-Meldungen. Auch die Release-Notes listen nicht jede Änderung in der Software auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Dokumentation ist für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet umfangreiche Dokumentation, darunter ein großes&lt;br /&gt;
Handbuch, man-Pages und einige kleine Testprogramme. Siehe das /doc-&lt;br /&gt;
Verzeichnis. Ausserdem sind alle Handbücher online unter&lt;br /&gt;
http://www.postgresql.org/docs/ verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Bücher zu PostgreSQL sind online verfügbar unter&lt;br /&gt;
http://www.postgresql.org/docs/books/awbook.html und&lt;br /&gt;
http://www.commandprompt.com/ppbook/ .&lt;br /&gt;
&lt;br /&gt;
Eine Liste lieferbarer PostgreSQL-Bücher befindet sich unter&lt;br /&gt;
http://www.postgresql.org/docs/books Diverse technische Artikel&lt;br /&gt;
befinden sich unter http://www.postgresql.org/docs/techdocs .&lt;br /&gt;
&lt;br /&gt;
psql hat einige nützliche \d-Befehle, um Informationen über Typen,&lt;br /&gt;
Operatoren, Funktionen, Aggregate, usw. zu zeigen.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Website enthält noch mehr Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich SQL lernen? ===&lt;br /&gt;
  &lt;br /&gt;
Die oben erwähnten PostgreSQL-spezifische Bücher bieten einen guten&lt;br /&gt;
Einstieg. Viele PostgreSQL-Anwender mögen &amp;quot;The Practical SQL Handbook&amp;quot;&lt;br /&gt;
(Bowman et al., Addison Wesley). Andere dagegen mögen &amp;quot;The Complete&lt;br /&gt;
Reference SQL&amp;quot; (Groff et al., McGraw-Hill).&lt;br /&gt;
&lt;br /&gt;
Es gibt ausserdem einige nützliche Online-Tutorials:&lt;br /&gt;
&lt;br /&gt;
* http://www.intermedia.net/support/sql/sqltut.shtm&lt;br /&gt;
* http://sqlcourse.com&lt;br /&gt;
* http://www.w3schools.com/sql/default.asp&lt;br /&gt;
* http://mysite.verizon.net/Graeme_Birchall/id1.html&lt;br /&gt;
    &lt;br /&gt;
=== Wie kann ich im Entwicklerteam mitarbeiten? ===&lt;br /&gt;
  &lt;br /&gt;
Lesen Sie in der Entwickler-FAQ unter&lt;br /&gt;
[[Developer_FAQ | Developer FAQ]] nach.&lt;br /&gt;
&lt;br /&gt;
=== Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt verschiedene Methoden, Software zu messen: Eigenschaften,&lt;br /&gt;
Performanz, Zuverlässigkeit, Support und Preis.&lt;br /&gt;
&lt;br /&gt;
==== Eigenschaften ====&lt;br /&gt;
&lt;br /&gt;
       PostgreSQL besitzt die meisten Eigenschaften - wie&lt;br /&gt;
       Transaktionen, Unterabfragen (Subqueries), Trigger, Views,&lt;br /&gt;
       referenzielle Integrität bei Fremdschlüsseln und verfeinertes&lt;br /&gt;
       Locking - die bei großen kommerziellen DBMS vorhanden sind. Es&lt;br /&gt;
       bietet außerdem einige anderen Eigenschaften, die diese nicht&lt;br /&gt;
       immer haben, wie benutzerbestimmte Typen, Vererbung, Regeln,&lt;br /&gt;
       und die Multi-Versionen-Steuerung zum Verringern&lt;br /&gt;
       konkurrierender Locks.&lt;br /&gt;
       &lt;br /&gt;
==== Performanz ====&lt;br /&gt;
       Die Performanz von PostgreSQL ist mit der von kommerziellen und&lt;br /&gt;
       anderen Open-Source-Datenbanken vergleichbar. In manchen&lt;br /&gt;
       Bereichen ist es schneller, in anderen langsamer. In der Regel&lt;br /&gt;
       beträgt der Unterschied +/-10%.&lt;br /&gt;
       &lt;br /&gt;
==== Zuverlässigkeit ====&lt;br /&gt;
       Es ist selbstredend, dass ein DBMS wertlos ist, wenn es nicht&lt;br /&gt;
       zuverlässig arbeitet. Daher bemühen wir uns, nur streng&lt;br /&gt;
       geprüften und beständigen Code freizugeben, der nur ein Minimum&lt;br /&gt;
       an Programmfehlern aufweist. Jede Freigabe hat mindestens einen&lt;br /&gt;
       Monat Betatest-Phase hinter sich, und unsere Freigabehistorie&lt;br /&gt;
       beweist, dass wir stabile und solide Versionen freigeben, die&lt;br /&gt;
       im Produktionsbetrieb genutzt werden können. Wir glauben, dass&lt;br /&gt;
       wir im Vergleich mit anderer Datenbanksoftware vorteilhaft&lt;br /&gt;
       dastehen.&lt;br /&gt;
       &lt;br /&gt;
==== Support ====&lt;br /&gt;
       Unsere Mailinglisten bieten die Möglichkeit, gemeinsam mit&lt;br /&gt;
       einer großen Gruppe von Entwicklern und Benutzern mögliche&lt;br /&gt;
       Probleme zu lösen. Wir können nicht immer eine Fehlerbehebung&lt;br /&gt;
       garantieren, kommerzielle DBMS tun dies aber auch nicht. Der&lt;br /&gt;
       direkte Kontakt zur Entwickler- und Benutzergemeinschaft und&lt;br /&gt;
       der Zugriff auf die Handbücher und den Quellcode ermöglicht&lt;br /&gt;
       einen im Vergleich zu anderen DBMS höherwertigeren Support. Es&lt;br /&gt;
       gibt jedoch auch Anbieter von kommerziellen Support-Leistungen&lt;br /&gt;
       (siehe FAQ-Punkt 1.7).&lt;br /&gt;
       &lt;br /&gt;
==== Preis ====&lt;br /&gt;
       PostgreSQL ist frei verfügbar, sowohl für die kommerzielle wie&lt;br /&gt;
       auch für die nicht-kommerzielle Nutzung. Sie können den&lt;br /&gt;
       PostgreSQL-Code ohne Einschränkungen (außer denjenigen, die in&lt;br /&gt;
       der oben angegebene BSD-artigen Lizenz erwähnt werden) in Ihr&lt;br /&gt;
       Produkt integrieren.&lt;br /&gt;
&lt;br /&gt;
=== Kann PostgreSQL eingebettet (embedded) werden? ===&lt;br /&gt;
PostgreSQL basiert auf einer Server/Client-Architektur, diese benötigt separate Prozesse für jeden Klient und Server, hinzukommen auch noch weitere &amp;quot;Helfer-Prozesse&amp;quot; (z. B. für autovacuum und stats-collector). Zwar können einige &amp;quot;embedded-Architekturen&amp;quot; diese Anforderungen erfüllen, aber wenn der Datenbank-Prozess innerhalb des Applikations-Prozesses laufen muss, kann PostgreSQL nicht verwendet werden. Dazu sollte man leichtere Datenbanken nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mich von einer Maillingliste abmelden? Wie verhindere ich es, dass ich doppelte E-Mails bekomme? ===&lt;br /&gt;
Majordomo ermöglicht es sich von allen Maillinglisten an- und abzumelden, ggf. müssen Sie sich zuerst ihr Majordomo-Passwort zuschicken lassen.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Maillinglisten sind so konfiguriert, dass Antworten an den ursprünglichen Autor und an die Maillingliste verschickt werden. Somit soll erreicht werden dass Benutzer immer schnellstmöglichst eine Antwort erhalten können. Diese Einstellungen können Sie auch über die Konfiguration von Majordomo ändern, ändern Sie dafür die Einstellung für ''eliminatecc''. Sie können auch einstellen dass Sie selbst keine Antwort auf Ihre eigenen E-Mails bekommen, ändern sie dafür die Einstellung für ''selfcopy''.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
&lt;br /&gt;
== Fragen zu Benutzerprogrammen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Welche Schnittstellen gibt es für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Installation stellt nur Schnittstellen für C und&lt;br /&gt;
Embedded C bereit. Alle weitere Schnittstellen sind unabhängige&lt;br /&gt;
Projekte, die einzeln heruntergeladen werden werden müssen. Diese&lt;br /&gt;
Trennung ermöglicht individuelle Entwickler-Teams und&lt;br /&gt;
Entwicklungszyklen für die jeweiligen Projekte.&lt;br /&gt;
&lt;br /&gt;
Einige Programmiersprachen wie PHP haben eine PostgreSQL-&lt;br /&gt;
Schnittstelle bereits eingebaut. Schnittstellen für Sprachen wie Perl,&lt;br /&gt;
TCL, Python und viele anderen sind unter http://gborg.postgresql.org&lt;br /&gt;
im Bereich Drivers/Interfaces verfügbar sowie per Internet-Suche.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann man PostgreSQL in einer Website nutzen? ===&lt;br /&gt;
  &lt;br /&gt;
Eine nette Einführung zu datenbank-gestützten Webseiten kann unter&lt;br /&gt;
http://www.webreview.com (engl.) eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Für die Web-Integration ist PHP eine ausgezeichnete Schnittstelle. PHP&lt;br /&gt;
gibt es bei http://www.php.net&lt;br /&gt;
&lt;br /&gt;
Desweiteren bietet sich die Perl-Schnittstelle mit CGI.pm&lt;br /&gt;
oder mod_perl auch an.&lt;br /&gt;
&lt;br /&gt;
=== Hat PostgreSQL eine grafische Benutzerschnittstelle? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt eine große Anzahl von GUI-Programmen für PostgreSQL - sowohl&lt;br /&gt;
kommerziell als auch Open-Source. [http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools| Eine englische Liste befindet sich hier.]&lt;br /&gt;
&lt;br /&gt;
== Administrative Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql? ===&lt;br /&gt;
  &lt;br /&gt;
Bei der Ausführung von configure die Option --prefix mit dem Zielverzeichnis angeben.&lt;br /&gt;
&lt;br /&gt;
=== Wie regle ich Zugriffe von anderen Rechnern? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL ist standardmäßig so eingestellt, dass Verbindungen nur vom&lt;br /&gt;
lokalen Rechner über Unix Domain Sockets bzw. TCP/IP möglich sind.&lt;br /&gt;
Verbindungen von anderen Rechnern werden erst dann ermöglicht, wenn&lt;br /&gt;
Sie in der Datei postgresql.conf die Einstellung listen_addresses&lt;br /&gt;
anpassen, in der Datei $PGDATA/pg_hba.conf host-basierte&lt;br /&gt;
Authentifizierung einschalten und den Server neu starten.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine bessere Performanz erreichen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt drei große Bereiche, in denen Performanzverbesserungen erzielt&lt;br /&gt;
werden können:&lt;br /&gt;
&lt;br /&gt;
==== Abfrageoptimierung ====&lt;br /&gt;
Die Modifizierung von Abfragen kann eine bessere Performanz erzielen:&lt;br /&gt;
       &lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/indexes.html Erstellung von Indexen, einschliesslich partieller Indexe sowie Expressionsindexe]&lt;br /&gt;
* Einsatz von COPY anstelle multipler INSERT-Anweisungen&lt;br /&gt;
* Gruppierung von mehreren Abfragen innerhalb einer Transaktion, um Aufwand beim Abschluss von Transaktionen    einzusparen&lt;br /&gt;
* Einsatz von CLUSTER beim Holen von einer großen Anzahl von Datenreihen aus einem Index&lt;br /&gt;
* Einsatz von LIMIT, um eine Untermenge der Abfragenergebnisse zurückzuliefern&lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/sql-prepare.html Einsatz von vorbereiteten Befehlen (prepared queries)]&lt;br /&gt;
* Einsatz von ANALYZE, um die Datenbankstatistik für den Abfragenplaner aktuell zu halten&lt;br /&gt;
* [http://www.postgresql.org/docs/current/static/routine-vacuuming.html Regelmäßiger Einsatz von VACUUM bzw. pg_autovacuum (autovacuum ist seit Version 8.3 standardmäßig aktiviert)]&lt;br /&gt;
* Bei großen Datenveränderungen die Löschung von Indexen&lt;br /&gt;
&lt;br /&gt;
==== Server-Konfiguration ====&lt;br /&gt;
Einige Einstellungen in der Datei postgresql.conf wirken sich auf die Performanz aus. Das Handbuch enthält unter      http://www.postgresql.org/docs/current/static/runtime-config.html eine komplette Auflistung. &lt;br /&gt;
&lt;br /&gt;
Kommentare zu den jeweiligen Einstellungen gibt es unter http://www.varlena.com/varlena/GeneralBits/Tidbitsannotated_conf_e.html und http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.&lt;br /&gt;
       &lt;br /&gt;
==== Hardware-Auswahl ====&lt;br /&gt;
Die Auswirkung von Hardware auf Performanz wird unter http://momjian.us/main/writings/pgsql/hw_performance/index.html und http://www.powerpostgresql.com/PerfList/ erläutert.&lt;br /&gt;
       &lt;br /&gt;
=== Welche Debugging-Funktionen sind für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
Unter den Optionen für die Server-Konfigurierung gibt es zahlreiche&lt;br /&gt;
log_*-Variablen, die die Ausgabe von Abfrage- und Prozessstatistiken&lt;br /&gt;
ermöglichen. Diese können für Debugging-Zwecke sowie Performanz-Tests&lt;br /&gt;
sehr nützlich sein.&lt;br /&gt;
&lt;br /&gt;
=== Ich bekomme die Meldung &amp;quot;Sorry, too many clients&amp;quot;, wenn ich eine Verbindung aufzubauen versuche. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Ihr System hat die maximal zulässige Anzahl von Datenbankverbindungen&lt;br /&gt;
erreicht (Voreinstellung 100). Sie müssen die maximale Anzahl der&lt;br /&gt;
gleichzeitig ausführbaren Backend-Prozesse hochsetzen, indem Sie in&lt;br /&gt;
postgresql.conf den Wert max_connections ändern und den Server&lt;br /&gt;
neustarten.&lt;br /&gt;
&lt;br /&gt;
=== Wie wird PostgreSQL aktualisiert? ===&lt;br /&gt;
  &lt;br /&gt;
Allgemeine Informationen zur Aktualisierung von PostgreSQL gibt es auf&lt;br /&gt;
der Seite http://www.postgresql.org/support/versioning. Detaillierte&lt;br /&gt;
technische Informationen gibt es auf der Seite&lt;br /&gt;
http://www.postgresql.org/docs/current/static/install-upgrading.html&lt;br /&gt;
&lt;br /&gt;
=== Kommt PostgreSQL mit den Anpassungen der Sommerzeit in verschiedenen Ländern klar? ===&lt;br /&gt;
  &lt;br /&gt;
Für die Berücksichtigung der Sommerzeit verwendet PostgreSQL Seit dem Release 8.0 die weiterverbreitete tzdata-Datenbank (auch bekannt als &amp;quot;zoneinfo database&amp;quot; oder &amp;quot;[http://www.twinsun.com/tz/tz-link.htm| Olzen timezone database]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jedes Update von PostgreSQL beinhaltet die aktuellen tzdata Dateien, daher sollte es reichen die Minor-Updates der eingesetzten Major Version im Auge zu behalten.&lt;br /&gt;
&lt;br /&gt;
Unter der Vorraussetzung dass das Betriebssystem diese Dateien schon in einer stets aktuellen Version vorbehält, ist es üblich, dass man diese Dateien verwendet. PostgreSQL bietet dazu eine compile-option an.&lt;br /&gt;
&lt;br /&gt;
=== Welche Hardware eignet sich für den Betrieb mit PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL läuft auf fast jeder Hardware-Kombination. Im PC-Bereich&lt;br /&gt;
gibt es allerdings sehr große Abweichungen in der Qualität. Für einen&lt;br /&gt;
Arbeitsplatz- oder Entwicklungsrechner mag dies nicht so bedeutend&lt;br /&gt;
sein, im Server-Betrieb jedoch lohnt sich auf jeden Fall die&lt;br /&gt;
Investition in teurere Bestandteile (Stichwörter ECC-Speicher, SCSI,&lt;br /&gt;
Hauptplatinen und Netzteile von namhaften Herstellern). Nutzen Sie&lt;br /&gt;
unsere Mailing-Listen, um Hardware-Optionen zu diskutieren.&lt;br /&gt;
&lt;br /&gt;
== Fragen zum Betrieb ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie wähle ich per SELECT-Anweisung nur die ersten paar Zeilen bzw. eine beliebige Zeile in einer Abfrage aus? ===&lt;br /&gt;
  &lt;br /&gt;
Wenn Sie bei der Ausführung der Abfrage die Anzahl der anzufordenden&lt;br /&gt;
Reihen bereits kennen, nutzen Sie LIMIT. Wenn die ORDER BY- Anweisung&lt;br /&gt;
mit einem Index verwendet wird, ist es möglich, dass die gesamte&lt;br /&gt;
Abfrage nicht ausgeführt werden muss. Wenn Sie die Anzahl der der&lt;br /&gt;
anzufordenden Reihen nicht kennen, verwenden Sie einen Cursor und&lt;br /&gt;
FETCH.&lt;br /&gt;
&lt;br /&gt;
Um eine beliebige Zeile auszuwählen, nutzen Sie ORDER BY random():&lt;br /&gt;
    SELECT spalte&lt;br /&gt;
      FROM tabelle&lt;br /&gt;
  ORDER BY random()&lt;br /&gt;
     LIMIT 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Wie finde ich heraus, welche Tabellen, Indexe, Datenbanken oder Benutzer in der Datenbank definiert sind? Wie bekomme ich die von psql verwendeten Abfragen? ===&lt;br /&gt;
  &lt;br /&gt;
In psql zeigt der Befehl \dt eine Liste der Datenbanktabellen. Weitere&lt;br /&gt;
psql-Befehle lassen sich mit \? anzeigen. Sie können sich die Datei&lt;br /&gt;
pgsql/src/bin/psql/describe.c mit dem Quellcode für psql ansehen. Sie&lt;br /&gt;
enthält die SQL-Abfragen, die die Backslash-Kommandos (\) ausführen.&lt;br /&gt;
Sie können psql auch mit der -E Option starten. Danach gibt psql die&lt;br /&gt;
Abfragen aus, die es bei der Ausführung der Befehle benutzt. Außerdem&lt;br /&gt;
biete PostgreSQL ein SQL-kompatibles INFORMATION SCHEMA, das&lt;br /&gt;
Metainformation über die Datenbank zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
Mit psql -l können Sie alle Datenbanken anzeigen lassen.&lt;br /&gt;
&lt;br /&gt;
Die Datei pgsql/src/tutorial/syscat.source enthält außerdem viele&lt;br /&gt;
SELECT- Abfragen, mit deren Hilfe man Information über die&lt;br /&gt;
Systemtabellen erhalten kann.&lt;br /&gt;
&lt;br /&gt;
=== Wie ändere ich den Datentyp einer Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Ab Version 8.0 kann der Datentyp einer Spalte mit ALTER TABLE ALTER&lt;br /&gt;
COLUMN TYPE geändert werden, sofern der neue Datentyp die Werte des&lt;br /&gt;
alten Datentype aufnehmen kann.&lt;br /&gt;
&lt;br /&gt;
Bei früheren Versionen gehen Sie wie folgt vor:&lt;br /&gt;
    BEGIN;&lt;br /&gt;
    ALTER TABLE tabelle ADD COLUMN neue_spalte neuer_datentyp;&lt;br /&gt;
    UPDATE tabelle SET neue_spalte = CAST(alte_spalte AS neuer_datentyp);&lt;br /&gt;
    ALTER TABLE tabelle DROP COLUMN alte_spalte;&lt;br /&gt;
    COMMIT;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Speicherplatz freizugeben, der von der gelöschten Spalte&lt;br /&gt;
verwendet wurde, führen Sie VACUUM FULL aus.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank? ===&lt;br /&gt;
  &lt;br /&gt;
Es bestehen folgende Obergrenzen:&lt;br /&gt;
 Maximale Größe eine Datenbank?           unbeschränkt (es existieren&lt;br /&gt;
                                            Datenbanken mit 32 TB)&lt;br /&gt;
 Maximale Größe einer Tabelle?            32 TB&lt;br /&gt;
 Maximale Größe einer Zeile?              400 GB&lt;br /&gt;
 Maximale Größe einer Spalte?             1 GB&lt;br /&gt;
 Maximale Anzahl von Zeilen in einer Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
 Maximale Anzahl von Spalten in einer Tabelle?&lt;br /&gt;
                                          250-1600 je nach Spaltentyp&lt;br /&gt;
 Maximale Anzahl von Indexen für eine Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich sind dies theoretische Werte, die oft durch die&lt;br /&gt;
verfügbaren Platten- und Speicherressourcen beschränkt werden. Extreme&lt;br /&gt;
Größen können zu Leistungseinbußen führen.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße von 32 TB benötigt keine&lt;br /&gt;
Large-File-Unterstützung im Betriebssystem. Große Tabellen werden in&lt;br /&gt;
Dateien mit einer Größe von je 1 GB aufgeteilt, wodurch etwaige&lt;br /&gt;
dateisystem-bedingte Beschränkungen nicht relevant sind.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße und die maximale Anzahl von Spalten können&lt;br /&gt;
vervierfacht werden, indem man die Default-Blockgröße auf 32 KB&lt;br /&gt;
heraufsetzt. Die Tabellengröße kann auch durch Tabellenpartitionierung&lt;br /&gt;
vergrößert werden.&lt;br /&gt;
&lt;br /&gt;
Eine Einschränkung ist, dass Indexe nur auf Spalten erstellt werden&lt;br /&gt;
können, die bis etwa 2.000 Zeichen groß sind. Um auf größere Spalten&lt;br /&gt;
eine UNIQUE-Constraint setzen zu können, nutzen Sie einen funktionalen&lt;br /&gt;
Index mit dem MD5-Hash-Wert der Spalte. Um innerhalb einer großen, mit&lt;br /&gt;
Text belegten Spalte suchen zu können, verwenden Sie einen&lt;br /&gt;
Volltext-Index.&lt;br /&gt;
&lt;br /&gt;
=== Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen Textdatei abzuspeichern? ===&lt;br /&gt;
  &lt;br /&gt;
Eine PostgreSQL-Datenbank kann beim Abspeichern einer einfachen&lt;br /&gt;
Textdatei bis zu fünfmal mehr Platz gegenüber der eigentlichen Größe&lt;br /&gt;
der Datei beanspruchen.&lt;br /&gt;
&lt;br /&gt;
Betrachten wir eine Datei mit 100.000 Zeilen mit einem Integer und&lt;br /&gt;
einer Textbeschreibung pro Zeile. Gehen wir davon aus, dass die&lt;br /&gt;
durchschnittliche Länge der Textbeschreibung 20 Byte beträgt. Die&lt;br /&gt;
einfache Datei würde 2,8 MB groß sein. Die Größe der&lt;br /&gt;
PostgreSQL-Datenbankdatei, die diese Daten enthält, liegt ungefähr bei&lt;br /&gt;
5,2 MB:&lt;br /&gt;
 24 Bytes: jeder Zeilenkopf (ungefähr)&lt;br /&gt;
+24 Bytes: ein Integer-Feld und ein Textfeld&lt;br /&gt;
+ 4 Bytes: Zeiger auf der Datenseite auf den Tupel&lt;br /&gt;
-----------------------------------------------&lt;br /&gt;
 52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
Die Größe einer Datenseite in PostgreSQL beträgt 8192 Bytes (8 KB),&lt;br /&gt;
also:&lt;br /&gt;
8192 Bytes pro Seite&lt;br /&gt;
---------------------   =  146 Zeilen pro Seite (abgerundet)&lt;br /&gt;
  52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
100.000 Datenzeilen&lt;br /&gt;
------------------------  =  685 Datenbankseiten (aufgerundet)&lt;br /&gt;
    158 Zeilen pro Seite&lt;br /&gt;
&lt;br /&gt;
633 Datenbankseiten * 8192 Bytes pro Seite  =  5,185,536 bytes (5,2 MB)&lt;br /&gt;
&lt;br /&gt;
Indexe beanspruchen nicht so viel Platz. Da sie jedoch die Daten&lt;br /&gt;
beinhalten, die sie indizieren, können auch sie sehr groß werden.&lt;br /&gt;
&lt;br /&gt;
NULL-Werte werden als Bitmaps gespeichert, wodurch sie sehr wenig&lt;br /&gt;
Platz in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Meine Abfragen sind langsam oder benutzen die Indexe nicht. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Indexe werden nicht automatisch bei jeder Abfrage verwendet. Indexe&lt;br /&gt;
werden nur dann verwendet, wenn die abzufragende Tabelle eine&lt;br /&gt;
bestimmte Größe übersteigt, und die Abfrage nur eine kleine&lt;br /&gt;
Prozentzahl der Tabellenzeilen abfragt. Der Grund hierfür ist der,&lt;br /&gt;
dass die durch einen Index verursachten Festplattenzugriffe manchmal&lt;br /&gt;
länger dauern würden als ein einfaches Auslesen aller Tabellenzeilen&lt;br /&gt;
(sequentieller Scan).&lt;br /&gt;
&lt;br /&gt;
Um festzustellen, ob ein Index verwendet werden soll, braucht&lt;br /&gt;
PostgreSQL Statistiken über die Tabelle. Diese Statistiken werden&lt;br /&gt;
durch die Anweisungen VACUUM ANALYZE bzw. ANALYZE berechnet. Anhand&lt;br /&gt;
der Statistiken kennt der Abfragenoptimierer die Anzahl der&lt;br /&gt;
Tabellenzeilen und kann besser entscheiden, ob Indexe verwendet werden&lt;br /&gt;
sollen. Statistiken sind auch bei der Ermittlung der optimalen&lt;br /&gt;
JOIN-Reihenfolgen und -Methoden wertvoll. Daher sollten diese&lt;br /&gt;
regelmässig durchgeführt werden, da sich der Inhalt einer Tabelle ja&lt;br /&gt;
auch verändert.&lt;br /&gt;
&lt;br /&gt;
Indexe werden normalerweise nicht in ORDER BY-Abfrage oder in JOINs&lt;br /&gt;
verwendet. Ein sequentieller Scan mit anschließendem explizitem&lt;br /&gt;
Sortiervorgang ist normalerweise schneller als ein Index-Scan einer&lt;br /&gt;
großen Tabelle. Jedoch wird bei einer Abfrage, in der LIMIT zusammen&lt;br /&gt;
mit ORDER BY verwendet wird, oftmals ein Index verwendet, da nur ein&lt;br /&gt;
kleiner Abschnitt der Tabelle zurückgeliefert wird.&lt;br /&gt;
&lt;br /&gt;
Sollte es danach aussehen, also ob der Optimierer irrtümlich einen&lt;br /&gt;
sequentiellen Scan ausführt, führen Sie SET enable_seqscan TO 'off'&lt;br /&gt;
aus und prüfen Sie, ob die Indexabfrage dadurch scheller geworden ist.&lt;br /&gt;
&lt;br /&gt;
Bei der Nutzung von Wildcard-Operatoren wie LIKE oder ~, können Indexe&lt;br /&gt;
nur unter bestimmten Umständen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
* Das Suchmuster muss sich an Anfang des Strings befinden, d.h.:&lt;br /&gt;
** LIKE-Suchmuster dürfen nicht mit % anfangen;&lt;br /&gt;
** ~ (reguläre Ausdrücke) müssen mit ^ anfangen.&lt;br /&gt;
* Das Suchmuster darf nicht mit einer Zeichenklasse (z.B. [a-e]) beginnen.&lt;br /&gt;
* Suchmuster, die Gross- und Kleinschreibung nicht berücksichtigen (z.B. ILIKE bzw. ~*), verwenden keine Indexe. Stattdessen können funktionale Indexe verwendet werden, die im Punkt 4.8 beschrieben werden.&lt;br /&gt;
* Die Standard-Locale &amp;quot;C&amp;quot; muss während der Datenbank-Initialisierung mit initdb verwendet worden sein, da andere locales den nächstgrößten Wert nicht ermitteln können. Es ist allerdings möglich, einen besonderen text_pattern_ops-Index für solche Fälle zu erstellen.&lt;br /&gt;
    &lt;br /&gt;
In Versionen vor 8.0 werden Indexe oft nicht benutzt, wenn die&lt;br /&gt;
jeweiligen Datentypen nicht genau übereinstimmen. Dies gilt besonders&lt;br /&gt;
für Indexe auf Spalten mit den Datentypen INT2, INT8 und NUMERIC&lt;br /&gt;
&lt;br /&gt;
=== Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine Abfrage auswertet? ===&lt;br /&gt;
  &lt;br /&gt;
Eine ausführliche Erklärung zu diesem Thema findet sich in der [http://www.postgresql.org/docs/current/static/sql-explain.html EXPLAIN] Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie änder ich das Sortierverhalten von textähnlichen Daten? ===&lt;br /&gt;
PostgreSQL sortiert Daten anhand dem bei initdb gesetzten Locale. (Ab 8.4 wird es es möglich sein pro Datenbank ein eigenes Locale zu definieren)&lt;br /&gt;
&lt;br /&gt;
Entspricht das Sortierverhalten nicht dem gewünschten muss man die Locale ändern. Die meisten Locales, außer &amp;quot;C&amp;quot;, sortieren anhand der Reihenfolge des entsprechenden Wörterbuches. Das Locale &amp;quot;C&amp;quot; ignoriert jegliche Punktuation und Zwischenraum.&lt;br /&gt;
&lt;br /&gt;
=== Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei einer Suche, bei der Groß- und Kleinschreibweisen ignoriert werden? Wie verwende ich einen Index bei solchen Suchabfragen? ===&lt;br /&gt;
  &lt;br /&gt;
Der Operator ~ wendet einen regulären Ausdruck an und ~* wendet ihn&lt;br /&gt;
an, ohne die Groß- und Kleinschreibung zu beachten. Ebenso beachtet&lt;br /&gt;
LIKE die Groß- und Kleinschreibung, und ILIKE nicht.&lt;br /&gt;
&lt;br /&gt;
Gleichheitsvergleiche, die Groß- und Kleinschreibung ignorieren,&lt;br /&gt;
werden in der Regel so ausgedruckt:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle&lt;br /&gt;
    WHERE LOWER(spalte) = 'abc'&lt;br /&gt;
&lt;br /&gt;
Hier wird kein normaler Index benutzt. Legt man hingegen einen&lt;br /&gt;
funktionalen Index an, so wird er auf jeden Fall verwendet:&lt;br /&gt;
   CREATE INDEX tabelle_index ON tabelle (LOWER(spalte))&lt;br /&gt;
&lt;br /&gt;
Falls der obige Index als einen UNIQUE-Index angelegt wird, können&lt;br /&gt;
keine Werte in die Spalte eingefügt werden, die sich nur durch ihre&lt;br /&gt;
Groß- und Kleinschreibung unterscheiden. Um Fehler zu vermeiden muß&lt;br /&gt;
ein CHECK-Constraint oder ein Trigger eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist? Kann nach der NULL-Belegung sortiert werden? ===&lt;br /&gt;
  &lt;br /&gt;
Testen Sie die Spalte mit IS NULL bzw. IS NOT NULL.&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   WHERE &lt;br /&gt;
      spalte IS NULL&lt;br /&gt;
&lt;br /&gt;
Beim konkatenieren mit einen NULL-Wert wir das Ergebnis auch NULL. Um dies zu verhindern verwenden Sie am besten [http://www.postgresql.org/docs/current/static/functions-conditional.html| COALESCE()]&lt;br /&gt;
   SELECT &lt;br /&gt;
      COALESCE(col1, '') || COALESCE(col2, '')&lt;br /&gt;
   FROM tab;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um die Spalte danach zu sortieren, ob sie mit NULL belegt ist oder nicht, verwenden Sie die Bedingungen IS NULL bzw. IS NOT NULL in der ORDER BY-Klausel. Da Bedingungen, die wahr sind, höher als das Gegenteil sortiert werden, bewirkt die folgende Abfrage, dass die NULL-Spalten zuerst gelistet werden:&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      (spalte IS NOT NULL)&lt;br /&gt;
&lt;br /&gt;
Ab PostreSQL 8.3 und höher, ist es möglich das standardisierte NULLS FIRST/NULLS LAST zu verwenden um die Position der NULL-Werte im Ergebnis zu bestimmen. (bei FIRST stehen diese zu erst, bei LAST am Ende)&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tab&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      col NULLS FIRST;&lt;br /&gt;
&lt;br /&gt;
=== Was ist der Unterschied zwischen den verschiedenen CHAR-Typen? ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Typ&lt;br /&gt;
!interner Name&lt;br /&gt;
!Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
|VARCHAR(n) &lt;br /&gt;
|varchar&lt;br /&gt;
|die Größe legt die Maximallänge fest; kein Auffüllen mit Leerzeichen&lt;br /&gt;
|-  &lt;br /&gt;
|CHAR(n)&lt;br /&gt;
|bpchar&lt;br /&gt;
|mit Leerzeichen gefüllt bis zur angegebenen Länge&lt;br /&gt;
|-&lt;br /&gt;
|TEXT&lt;br /&gt;
|text&lt;br /&gt;
|keine obere Grenze für die Länge&lt;br /&gt;
|-&lt;br /&gt;
|BYTEA&lt;br /&gt;
|bytea&lt;br /&gt;
|Bytearray mit variabler Länge (auch für '\0'-Bytes geeignet)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;char&amp;quot; (with the quotes)&lt;br /&gt;
|char&lt;br /&gt;
|ein Zeichen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der interne Name kommt vor allem in den Systemkatalogen und in manchen&lt;br /&gt;
Fehlermeldungen vor.&lt;br /&gt;
&lt;br /&gt;
Die ersten vier Typen sind &amp;quot;varlena&amp;quot;-Typen (d.h. die ersten vier Bytes&lt;br /&gt;
geben die Länge an, gefolgt von den Daten). Daher ist der tatsächlich&lt;br /&gt;
belegte Platz immer etwas mehr als die deklarierte Feldgröße.&lt;br /&gt;
Allerdings wird unter Umständen auf diese Datentypen Datenkompression&lt;br /&gt;
durch das TOAST- Verfahren angewendet, womit der tatsächlich belegte&lt;br /&gt;
Platz auch geringer als erwartet ausfallen kann.&lt;br /&gt;
&lt;br /&gt;
Für die Speicherung von Zeichenketten variabler Länge empfiehlt sich&lt;br /&gt;
VARCHAR(n). Die maximale Länge eines VARCHAR(n)-Felds wird bei der&lt;br /&gt;
Tabellendefinition festgelegt. TEXT setzt keine Längengrenze,&lt;br /&gt;
allerdings gibt es eine systembedingte Obergrenze von 1 GB.&lt;br /&gt;
&lt;br /&gt;
CHAR(n) ist geeignet für die Speicherung von Zeichenketten, die alle&lt;br /&gt;
die gleiche Länge haben. Bitte beachten Sie, dass CHAR(n) automatisch&lt;br /&gt;
Zeichenketten bis zur definierten Feldlänge mit Leerzeichen ausfüllt,&lt;br /&gt;
während bei VARCHAR(n) nur die tatsächlich eingegebene Zeichenkette&lt;br /&gt;
gespeichert wird.&lt;br /&gt;
&lt;br /&gt;
BYTEA ist für binäre Daten, besonders für Werte, die NULL-Bytes haben.&lt;br /&gt;
&lt;br /&gt;
Alle der hier erwähnten Typen weisen ähnliche Performanzeigenschaften&lt;br /&gt;
auf.&lt;br /&gt;
&lt;br /&gt;
=== Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Wert? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet einen SERIAL-Datentyp. Dies ist zwar kein richtiger Datentyp. Es ist die Kurzform für das Erstellen einer Spalte vom Typ Integer, die von einer Sequenz befüllt wird. &lt;br /&gt;
&lt;br /&gt;
Zum Beispiel:&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
       id   SERIAL,&lt;br /&gt;
       name TEXT&lt;br /&gt;
   )&lt;br /&gt;
&lt;br /&gt;
wird automatisch in:&lt;br /&gt;
   CREATE SEQUENCE person_id_seq;&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
     id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),&lt;br /&gt;
     name TEXT&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Die automatisch generierte Sequenz besitzt immer folgenden Namen:&lt;br /&gt;
''tabellederspalte''-''namederspalte''_seq&lt;br /&gt;
&lt;br /&gt;
Die Man-Page zu CREATE SEQUENCE beinhaltet mehr Informationen zu Sequenzen.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einen Typ BIGSERIAL, dieser unterscheidet sich aber nur darin dass die Spalte den Typ BIGINTEGER bekommt. BIGSERIAL sollte verwendet werden wenn es zu erwarten ist, dass mehr als 2 Milliarden Sequenz-Werte verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie bekomme ich den Wert einer SERIAL-Sequenz? ===&lt;br /&gt;
  &lt;br /&gt;
Eine Möglichkeit wäre, mit der nextval()-Funktion den nächsten SERIAL-Wert von dem Sequenzobjekt vor der Auszuführung einer INSERT-Anweisung anzufordern und ihn dann explizit in die INSERT-Anweisung einzubinden. Anhand der Beispieltabelle in 4.11.1 könnte dieser Vorgang in einer Pseudosprache so aussehen:&lt;br /&gt;
&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT nextval('person_id_seq')&amp;quot;);&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Danach stünde der neue Wert in der Variablen new_id für die Verwendung in weiteren Abfragen zur Verfügung, zum Beispiel als Fremdschlüssel zur Tabelle 'person'). Bitte beachten Sie, dass der Name des automatisch erstellten SEQUENCE-Objektes folgenden Name hat: «table»_«serialcolumn»_seq wobei 'table' und 'serialcolumn' die Namen&lt;br /&gt;
der jeweils betreffenden Tabelle / Spalte darstellen.&lt;br /&gt;
&lt;br /&gt;
Als weitere Möglichkeit können Sie nach einer INSERT-Anweisung den automatisch eingefügten SERIAL-Wert mit der currval()-Funktion zurückgeben lassen:&lt;br /&gt;
&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT currval('person_id_seq')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Die einfachste Möglichkeit ist es RETURNING zu verwenden. Ein einfaches Beispiel sähe so aus:&lt;br /&gt;
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;&lt;br /&gt;
&lt;br /&gt;
=== Führt currval() zu einer Race-Condition mit anderen Nutzern? ===&lt;br /&gt;
  &lt;br /&gt;
Nein. currval() liefert einen Wert zurück, der von Ihrer&lt;br /&gt;
Datenbank-Session bestimmt wird, und der anderen Sessionen nicht zur&lt;br /&gt;
Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner Sequenz-/SERIAL-Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Um die gleichzeitige Abarbeitung von Transaktionen zu verbessern,&lt;br /&gt;
werden Sequenzen gerade nicht für andere Transaktionen gesperrt,&lt;br /&gt;
sondern die Sequenznummern werden den laufenden Transaktionen sofort&lt;br /&gt;
zugeteilt. Lücken in der Sequenznummerierung werden durch abgebrochene&lt;br /&gt;
Transaktionen verursacht.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein OID? ===&lt;br /&gt;
  &lt;br /&gt;
Jede Zeile, die in PostgreSQL erzeugt wird, bekommt eine eindeutige OID, sofern die Tabelle nicht mit der Option WITHOUT OIDS angelegt wurde. OIDs sind automatisch zugewiesene 4-Byte-Integer, die innerhalb der gesamten Datenbank einmalig sind. Allerdings laufen sie bei einem Wert von ungefähr 4 Milliarden über. PostgreSQL verwendet OIDs, um&lt;br /&gt;
seine interne Systemtabellen zu verbinden.&lt;br /&gt;
&lt;br /&gt;
Um einmalige Idenfikatoren in Datentabellen zu erstellen, wird allerdings empfohlen, statt OIDs Werte zu verwenden, die von SERIAL-Sequenzen erzeugt werden. SERIAL-Sequenzen sind innerhalb einer Tabelle einmalig und daher weniger anfällig für Überläufe. Außerdem können 8-Byte-Sequenzwerte mit BIGSERIAL (SERIAL8) erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein CTID? ===&lt;br /&gt;
&lt;br /&gt;
CTIDs werden benutzt, um bestimmte physikalische Zeilen durch Block und Offset Werte zu identifizieren. CTIDs verändern sich, sobald Zeilen verändert oder zurückgeladen werden. Sie werden in Indexeinträgen benutzt um auf die physikalischen Zeilen zu zeigen.&lt;br /&gt;
&lt;br /&gt;
=== Wieso bekomme ich einen Fehler: &amp;quot;ERROR: Memory exhausted in AllocSetAlloc()&amp;quot;? ===&lt;br /&gt;
  &lt;br /&gt;
Wahrscheinlich gibt es keinen virtuellen Speicher mehr in Ihrem System&lt;br /&gt;
oder Ihr Kernel hat niedrige Höchstgrenzen für bestimmte Ressourcen.&lt;br /&gt;
Probieren Sie vor dem Start von postmaster folgendes:&lt;br /&gt;
   ulimit -d 262144&lt;br /&gt;
   limit datasize 256m&lt;br /&gt;
&lt;br /&gt;
Je nach benutzter Shell wird nur einer dieser Befehle erfolgreich&lt;br /&gt;
ausgeführt werden. Auf jedem Fall wird die Grenze des Datensegments&lt;br /&gt;
für Prozesse erhöht werden und eventuell die erfolgreiche Ausführung&lt;br /&gt;
der Abfrage ermöglichen. Falls Sie ein Problem mit dem SQL-Client&lt;br /&gt;
haben, weil das Backend zu viele Daten zurückliefert, versuchen Sie&lt;br /&gt;
dies vor dem Start des SQL-Clients.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft? ===&lt;br /&gt;
  &lt;br /&gt;
Geben Sie in psql SELECT VERSION(); ein.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine Spalte erstellen, deren Default-Wert immer die aktuelle Uhrzeit enthalten soll? ===&lt;br /&gt;
  &lt;br /&gt;
Dazu verwenden Sie CURRENT_TIMESTAMP:&lt;br /&gt;
   CREATE TABLE test (x INT, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );&lt;br /&gt;
&lt;br /&gt;
=== Wie führe ich eine OUTER JOIN durch? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt OUTER JOINs nach dem SQL- Standardsyntax. Hier&lt;br /&gt;
zwei Beispiele:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 ON (t1.spalte = t2.spalte)&lt;br /&gt;
&lt;br /&gt;
bzw.:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 USING (spalte)&lt;br /&gt;
&lt;br /&gt;
Diese identischen Abfragen verknüpfen tabelle_1 mit tabelle_2 über die&lt;br /&gt;
Spalte 'spalte' und geben außerdem alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_1 (diejenigen, die keine Entsprechung in tabelle_2 haben)&lt;br /&gt;
zurück. Ein RIGHT JOIN würde hingegen alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_2 hinzufügen und ein FULL JOIN würde alle verknüpften Zeilen&lt;br /&gt;
sowie jeweils alle unverknüpften Zeilen aus den beiden Tabellen&lt;br /&gt;
zurückliefern. Die Angabe von OUTER ist nicht zwingend und kann in&lt;br /&gt;
LEFT, RIGHT und FULL-Verknüpfungen weggelassen werden. Normale&lt;br /&gt;
Verknüpfungen sind INNER JOINs.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt keinen Weg, innerhalb einer Abfrage auf mehr als eine&lt;br /&gt;
Datenbank zuzugreifen. Da PostgreSQL datenbank-spezifische&lt;br /&gt;
Systemkataloge lädt, ist eine datenbankübergreifende Abfrage nicht&lt;br /&gt;
möglich.&lt;br /&gt;
&lt;br /&gt;
contrib/dblink ist eine Erweiterung, die datenbankübergreifende&lt;br /&gt;
Abfragen über Funktionsaufrufe ermöglicht.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion zurückgeben lassen? ===&lt;br /&gt;
  &lt;br /&gt;
Funktionen können mehrere Zeilen und Spalten zurückgeben, vgl.:&lt;br /&gt;
http://www.postgresql.org/docs/techdocs.17.&lt;br /&gt;
&lt;br /&gt;
=== Warum bekomme ich eine Fehlermeldung wie &amp;quot;relation with OID ##### does not exist&amp;quot; wenn ich temporäre Tabellen in PL/PgSQL-Funktionen benutze? ===&lt;br /&gt;
  &lt;br /&gt;
In PostgreSQL-Versionen vor 8.3 verarbeitet PL/PgSQL Funktionen in&lt;br /&gt;
einer Cache. Dies hat eine unangenehme Nebenwirkung, nämlich dass wenn&lt;br /&gt;
eine PL/PgSQL-Funktion auf eine temporäre Tabelle zugreift, und diese&lt;br /&gt;
Tabelle anschließend gelöscht bzw. neu erstellt wird, die Funktion&lt;br /&gt;
fehlschlagen wird, da die gecachten Funktionsinhalte noch auf die alte&lt;br /&gt;
temporäre Tabelle zeigen. Die Lösung für diese Probleme besteht darin,&lt;br /&gt;
in der PL/PgSQL- Funktion mittels EXECUTE auf temporäre Tabellen&lt;br /&gt;
zuzugreifen. Dies bewirkt, dass bei jedem Funktionsruf die betreffende&lt;br /&gt;
Abfrage neu geparst wird.&lt;br /&gt;
&lt;br /&gt;
Dieses Problem taucht in PostgreSQL 8.3 und späteren Versionen nicht&lt;br /&gt;
mehr auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Replikationslösungen gibt es? ===&lt;br /&gt;
  &lt;br /&gt;
Der Begriff &amp;quot;replikation&amp;quot; umfasst mehrere verschiedene Technologien,&lt;br /&gt;
jede mit eigenen Vor- und Nachteilen. [http://www.postgresql.org/docs/8.3/static/high-availability.html| Die Dokumentation enthält eine gute Einführung in das Thema Replikation]&lt;br /&gt;
&lt;br /&gt;
Mit &amp;quot;Master/slave&amp;quot;-Replikation werden Änderungen in einer&lt;br /&gt;
Hauptdatenbank durchgeführt und an &amp;quot;Sklaven&amp;quot; verteilt, die im&lt;br /&gt;
Nur-Lese-Modus arbeiten. Die populärste Lösung für PostgreSQL ist&lt;br /&gt;
Slony-I.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Multi-master replication&amp;quot; ermöglicht sowohl lesende als auch&lt;br /&gt;
schreibende Zugriffe über mehrere Datenbank-Server hinweg. Allerdings&lt;br /&gt;
hat diese Art von Replikation eine negative Auswirkung auf die&lt;br /&gt;
Performanz durch die Notwendigkeit, Änderungen zwischen Servern zu&lt;br /&gt;
synchronisieren. Pgcluster ist die populärste freie Lösung für&lt;br /&gt;
PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einige kommerzielle und hardware-basierte&lt;br /&gt;
Replikationslösungen für verschiedene Arten der Replikation.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Tabellen- und Spaltennamen in meiner Abfrage nicht erkannt? Warum werden Großbuchstaben umgewandelt? ===&lt;br /&gt;
  &lt;br /&gt;
Die häufigste Ursache ist die Verwendung von Gänsefüßchen bei der&lt;br /&gt;
Anlegung von Tabellen, z.B.:&lt;br /&gt;
    CREATE TABLE &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
                (&amp;quot;SPALTE1&amp;quot; INT)&lt;br /&gt;
&lt;br /&gt;
Dadurch werden Tabellen- und Spaltennamen (sog. Identifikatoren) in&lt;br /&gt;
genau der Schreibweise gespeichert (vgl. Dokumentation), was dazu&lt;br /&gt;
führt, dass man sie danach immer in Gänsefüßchen angeben muss. Im&lt;br /&gt;
obigen Beispiel muss man also immer etwa SELECT * FROM &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
verwenden. Um dieses Problem zu vermeiden, müssen Sie immer eines der&lt;br /&gt;
folgenden Punkte beachten:&lt;br /&gt;
&lt;br /&gt;
* bei der Tabellenanlegung keine Gänsefüßchen verwenden;&lt;br /&gt;
* in Identifikatoren nur Kleinschreibung verwenden;&lt;br /&gt;
* immer Identifikatoren mit Gänsefüßchen versehen&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen des Übersetzers ==&lt;br /&gt;
  &lt;br /&gt;
Die englische Vorlage dieser FAQ wird ständig überarbeitet. Daher&lt;br /&gt;
liegt die Übersetzung nicht immer auf dem aktuellsten Stand.&lt;br /&gt;
&lt;br /&gt;
Die aktuellste Version der deutschen Übersetzung befindet sich immer&lt;br /&gt;
unter http://sql-info.de/de/postgresql/FAQ_german.html. Diese&lt;br /&gt;
&amp;quot;Arbeitsversion&amp;quot; enthält eventuell Änderungen, die noch nicht auf der&lt;br /&gt;
PostgreSQL-Website eingebunden worden sind.&lt;br /&gt;
&lt;br /&gt;
Über Verbesserungshinweise und Korrekturvorschläge sowie&lt;br /&gt;
Verständnisfragen zum Inhalt der FAQ freue ich mich. Ich nehme auch&lt;br /&gt;
allgemeine Fragen zu PostgreSQL gerne entgegen, verweise jedoch auf&lt;br /&gt;
die Mailing-Listen als schnelle und zuverlässige Anlaufstellen.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/FAQ/de</id>
		<title>FAQ/de</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/FAQ/de"/>
				<updated>2011-12-06T18:38:43Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;another markup fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Was ist PostgreSQL? Wie wird es ausgesprochen? ===&lt;br /&gt;
  &lt;br /&gt;
Die (englische) Aussprache ist &amp;quot;Post-Gres-Q-L&amp;quot;. Im allgemeinen&lt;br /&gt;
Sprachgebrauch hat sich die Kurzform &amp;quot;Postgres&amp;quot; auch durchgesetzt.&lt;br /&gt;
(Für diejenigen, die es interessiert: eine MP3-Datei mit der&lt;br /&gt;
amerikanischen Aussprache befindet sich hier:&lt;br /&gt;
http://www.postgresql.org/files/postgresql.mp3&lt;br /&gt;
&lt;br /&gt;
PostgreSQL ist ein objektrelationales Datenbanksystem, das die Vorzüge&lt;br /&gt;
von kommerziellen Datenbanksystemen mit zukunftsweisenden Innovationen&lt;br /&gt;
kombiniert. PostgreSQL ist freie Software und dessen kompletter&lt;br /&gt;
Quellcode ist öffentlich verfügbar.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Entwicklung wird von einem Team von meist freiwilligen&lt;br /&gt;
Entwicklern durchgeführt. Dieses Team ist für die Gesamtentwicklung&lt;br /&gt;
von PostgreSQL verantwortlich. Es handelt sich um ein&lt;br /&gt;
Gemeinschaftsprojekt, das nicht von einer bestimmten Firma&lt;br /&gt;
kontrolliert wird. Lesen Sie die Entwickler-FAQ:&lt;br /&gt;
http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn Sie an einer&lt;br /&gt;
Mitarbeit interessiert sind.&lt;br /&gt;
&lt;br /&gt;
=== Wer kontrolliert PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Falls Sie nach dem Namen eines etwaigen Inhabers bzw. nach einem&lt;br /&gt;
allmächtigen Zentralkommittee suchen - sparen Sie sich die Mühe, sowas&lt;br /&gt;
existiert gar nicht. Es gibt zwar das &amp;quot;Core Committee&amp;quot; sowie&lt;br /&gt;
Entwickler, die CVS-Schreibberechtigung haben, jedoch haben diese&lt;br /&gt;
Gruppen eher nur eine administrative Rolle. Das Projekt wird durch die&lt;br /&gt;
Community gesteuert, die aus den Entwicklern sowie natürlich auch den&lt;br /&gt;
Nutzern besteht - jeder kann daran teilnehmen. (Lesen Sie die&lt;br /&gt;
Entwickler-FAQ: http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn&lt;br /&gt;
Sie an der PostgreSQL-Entwicklung teilnehmen möchten).&lt;br /&gt;
&lt;br /&gt;
=== Welchem Copyright unterliegt PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL wird unter der klassischen BSD-Lizenz herausgegeben. Im&lt;br /&gt;
Grunde genommen erlaubt diese den Nutzern, beliebig mit dem Code&lt;br /&gt;
umzugehen, auch der Weiterverkauf von Binärversionen ohne Quellcode&lt;br /&gt;
ist erlaubt. Die einzige Einschränkung besteht darin, dass PostgreSQL&lt;br /&gt;
auf keinen Fall für etwaige Probleme mit der Software haftet. Außerdem&lt;br /&gt;
muß der Copyright- Text in allen Kopien der Software enthalten sein.&lt;br /&gt;
Dies ist der Originaltext der BSD-Lizenz:&lt;br /&gt;
 &lt;br /&gt;
 PostgreSQL Data Base Management System&lt;br /&gt;
 &lt;br /&gt;
 Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group&lt;br /&gt;
 Portions Copyright (c) 1994-6 Regents of the University of California&lt;br /&gt;
 &lt;br /&gt;
 Permission to use, copy, modify, and distribute this software and its&lt;br /&gt;
 documentation for any purpose, without fee, and without a written&lt;br /&gt;
 agreement is hereby granted, provided that the above copyright notice&lt;br /&gt;
 and this paragraph and the following two paragraphs appear in all&lt;br /&gt;
 copies.&lt;br /&gt;
 &lt;br /&gt;
 IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY&lt;br /&gt;
 FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,&lt;br /&gt;
 INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND&lt;br /&gt;
 ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN&lt;br /&gt;
 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 &lt;br /&gt;
 THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,&lt;br /&gt;
 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF&lt;br /&gt;
 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE&lt;br /&gt;
 PROVIDED HEREUNDER IS ON AN &amp;quot;AS IS&amp;quot; BASIS, AND THE UNIVERSITY OF&lt;br /&gt;
 CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,&lt;br /&gt;
 UPDATES, ENHANCEMENTS, OR MODIFICATIONS.&lt;br /&gt;
&lt;br /&gt;
Es gilt die Copyright-Klausel im Original!&lt;br /&gt;
&lt;br /&gt;
=== Auf welchen Plattformen läuft PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Normalerweise kann PostgreSQL auf jeder modernen UNIX-kompatiblen&lt;br /&gt;
Plattform eingesetzt werden. Diejenigen Plattformen, die bei der&lt;br /&gt;
jeweiligen Versionsfreigabe getestet wurden, sind in den&lt;br /&gt;
Installationsanleitungen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
PostgreSQL läuft auch auf Microsoft NT-basierten Betriebssystemen wie&lt;br /&gt;
Windows 2000 SP4, XP und Server 2003. Ein vorgefertigtes&lt;br /&gt;
Installationspaket kann von http://pgfoundry.org/projects/pginstaller&lt;br /&gt;
heruntergeladen werden. DOS-basierte Windows-Versionen (Win95, Win98,&lt;br /&gt;
WinMe) können PostgreSQL nur mit Hilfe der Cygwin-Umgebung ausführen.&lt;br /&gt;
&lt;br /&gt;
=== Woher bekomme ich PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Per Web-Browser hier: http://www.postgresql.org/ftp/ und per FTP hier:&lt;br /&gt;
ftp://ftp.postgresql.org/pub/.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die neueste Version von PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die neueste Version von PostgreSQL kann auf der [http://www.postgresql.org/ Website] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Die Freigabe einer neuen Hauptversion erfolgt in der Regel jährlich, kleinere Korrekturversionen alle paar Monaten. Die kleineren Updates werden &amp;quot;Minor&amp;quot;-Updates, die großen jährlich erscheinenden &amp;quot;Major&amp;quot;-Updates genannt. &amp;quot;Minor&amp;quot;-Update erscheinen in der Regel gleichzeitig für alle unterstützten &amp;quot;Major&amp;quot;-Versionen. [http://www.postgresql.org/support/versioning Falls Sie dieses Thema interessiert sollten Sie hier weiterlesen.]&lt;br /&gt;
&lt;br /&gt;
=== Wo bekomme ich Support für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Community bietet Unterstützung per Mailing-Liste. Die&lt;br /&gt;
Web-Seite http://www.postgresql.org/community/lists/ bietet einen&lt;br /&gt;
Überblick. Die Listen general und bugs bieten einen guten Einstieg.&lt;br /&gt;
&lt;br /&gt;
Eine deutschsprachige Mailing-Liste gibt es hier:&lt;br /&gt;
http://archives.postgresql.org/pgsql-de-allgemein/.&lt;br /&gt;
&lt;br /&gt;
Der wichtigsten IRC-Channel ist #postgresql auf Freenode&lt;br /&gt;
(irc.freenode.net). Unter UNIX/Linux können Sie mit z.B. irc -c&lt;br /&gt;
'#postgresql' &amp;quot;$USER&amp;quot; irc.freenode.net. daran teilnehmen. Auf Freenode&lt;br /&gt;
gibt es folgende Channels:&lt;br /&gt;
* #postgresql-es (spanisch)&lt;br /&gt;
* #postgresqlfr (französischen)&lt;br /&gt;
* #postgresql-br (brasilianischen) &lt;br /&gt;
&lt;br /&gt;
Es gibt außerdem einen PostgreSQL-Channel bei EFNet.&lt;br /&gt;
&lt;br /&gt;
Eine Liste von Unternehmen, die Support für PostgreSQL auf kommerzieller Basis leisten, kann unter http://www.postgresql.org/support/professional_support eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich einen Fehlerbericht abgeben? ===&lt;br /&gt;
  &lt;br /&gt;
Nutzen Sie das Formular unter&lt;br /&gt;
http://www.postgresql.org/support/submitbug. Schauen Sie aber vorher&lt;br /&gt;
unter ftp://ftp.postgresql.org/pub/ nach, ob es mittlerweile eine&lt;br /&gt;
neuere PostgreSQL-Version gibt, in der der Fehler behoben wurde.&lt;br /&gt;
&lt;br /&gt;
Bugs, die über das Formular bzw. eine der Mailing-Listen&lt;br /&gt;
bekanntgegeben wurden, erhalten typischerweise einer der folgenden&lt;br /&gt;
Reaktionen:&lt;br /&gt;
&lt;br /&gt;
* es ist kein Bug, der Grund wird benannt&lt;br /&gt;
* es ist ein bereits bekannter Bug, der bereits auf der TODO-Liste aufgenommen wurde&lt;br /&gt;
* der Bug wurde in der aktuellen Version behoben&lt;br /&gt;
* der Bug wurde bereits behoben, befindet sich aber noch nicht in einer offiziell veröffentlichten Version&lt;br /&gt;
* es wird um eingehendere Informationen gebeten, z.B.:&lt;br /&gt;
** Betriebssystem&lt;br /&gt;
** PostgreSQL-Version&lt;br /&gt;
** reproduzierbares Fallbeispiel&lt;br /&gt;
** Debugging-Information&lt;br /&gt;
** Debugger-Backtrace-Ausgabe&lt;br /&gt;
* der Bug ist neu. Folgendes könnte passieren:&lt;br /&gt;
** ein Patch wird erstellt und in der nächsten Version eingebaut&lt;br /&gt;
** der Bug kann nicht sofort behoben werden und wird auf die TODO-Liste gesetzt&lt;br /&gt;
    &lt;br /&gt;
=== Wie erfahre ich von bekannten Bugs oder fehlenden Features? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt eine erweiterte Teilmenge von SQL:2003. Siehe&lt;br /&gt;
unsere TODO-Liste unter http://www.postgresql.org/docs/faqs.TODO.html&lt;br /&gt;
für eine Auflistung der bekannten Bugs, fehlenden Features und&lt;br /&gt;
zukünftigen Pläne.&lt;br /&gt;
&lt;br /&gt;
Eine Anfrage nach einem neuen Feature führt normalerweise zu einer der&lt;br /&gt;
folgenden Antworten:&lt;br /&gt;
&lt;br /&gt;
* das Feature ist bereits auf der TODO-Liste&lt;br /&gt;
* das Feature ist nicht wünschenswert, weil:&lt;br /&gt;
** es vorhandene Funktionalität dupliziert, welche bereits dem SQL-Standard folgt&lt;br /&gt;
** es würde die Komplexität der Code-Basis erhöhen, ohne nennenswerte Vorteile zu bringen&lt;br /&gt;
** es wäre unsicher bzw. unzuverlässig&lt;br /&gt;
* das neue Feature wird der TODO-Liste hinzugefügt&lt;br /&gt;
    &lt;br /&gt;
PostgreSQL verwendet kein Bugtracking-System, da es sich als effizienter erwiesen hat, E-Mails direkt zu beantworten und die TODO-Liste aktuell zu halten. In der Praxis werden Bugs sehr schnell beseitigt, und diejenigen Bugs, die Auswirkungen auf eine große Anzahl von Nutzern haben, werden meist kurzfristig korrigiert. Der einzige Überblick über alle Änderungen, Verbesserungen und Korrekturen in einer PostgreSQL-Version befindet sich in den CVS-Log-Meldungen. Auch die Release-Notes listen nicht jede Änderung in der Software auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Dokumentation ist für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet umfangreiche Dokumentation, darunter ein großes&lt;br /&gt;
Handbuch, man-Pages und einige kleine Testprogramme. Siehe das /doc-&lt;br /&gt;
Verzeichnis. Ausserdem sind alle Handbücher online unter&lt;br /&gt;
http://www.postgresql.org/docs/ verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Bücher zu PostgreSQL sind online verfügbar unter&lt;br /&gt;
http://www.postgresql.org/docs/books/awbook.html und&lt;br /&gt;
http://www.commandprompt.com/ppbook/ .&lt;br /&gt;
&lt;br /&gt;
Eine Liste lieferbarer PostgreSQL-Bücher befindet sich unter&lt;br /&gt;
http://www.postgresql.org/docs/books Diverse technische Artikel&lt;br /&gt;
befinden sich unter http://www.postgresql.org/docs/techdocs .&lt;br /&gt;
&lt;br /&gt;
psql hat einige nützliche \d-Befehle, um Informationen über Typen,&lt;br /&gt;
Operatoren, Funktionen, Aggregate, usw. zu zeigen.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Website enthält noch mehr Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich SQL lernen? ===&lt;br /&gt;
  &lt;br /&gt;
Die oben erwähnten PostgreSQL-spezifische Bücher bieten einen guten&lt;br /&gt;
Einstieg. Viele PostgreSQL-Anwender mögen &amp;quot;The Practical SQL Handbook&amp;quot;&lt;br /&gt;
(Bowman et al., Addison Wesley). Andere dagegen mögen &amp;quot;The Complete&lt;br /&gt;
Reference SQL&amp;quot; (Groff et al., McGraw-Hill).&lt;br /&gt;
&lt;br /&gt;
Es gibt ausserdem einige nützliche Online-Tutorials:&lt;br /&gt;
&lt;br /&gt;
* http://www.intermedia.net/support/sql/sqltut.shtm&lt;br /&gt;
* http://sqlcourse.com&lt;br /&gt;
* http://www.w3schools.com/sql/default.asp&lt;br /&gt;
* http://mysite.verizon.net/Graeme_Birchall/id1.html&lt;br /&gt;
    &lt;br /&gt;
=== Wie kann ich im Entwicklerteam mitarbeiten? ===&lt;br /&gt;
  &lt;br /&gt;
Lesen Sie in der Entwickler-FAQ unter&lt;br /&gt;
[[Developer_FAQ | Developer FAQ]] nach.&lt;br /&gt;
&lt;br /&gt;
=== Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt verschiedene Methoden, Software zu messen: Eigenschaften,&lt;br /&gt;
Performanz, Zuverlässigkeit, Support und Preis.&lt;br /&gt;
&lt;br /&gt;
==== Eigenschaften ====&lt;br /&gt;
&lt;br /&gt;
       PostgreSQL besitzt die meisten Eigenschaften - wie&lt;br /&gt;
       Transaktionen, Unterabfragen (Subqueries), Trigger, Views,&lt;br /&gt;
       referenzielle Integrität bei Fremdschlüsseln und verfeinertes&lt;br /&gt;
       Locking - die bei großen kommerziellen DBMS vorhanden sind. Es&lt;br /&gt;
       bietet außerdem einige anderen Eigenschaften, die diese nicht&lt;br /&gt;
       immer haben, wie benutzerbestimmte Typen, Vererbung, Regeln,&lt;br /&gt;
       und die Multi-Versionen-Steuerung zum Verringern&lt;br /&gt;
       konkurrierender Locks.&lt;br /&gt;
       &lt;br /&gt;
==== Performanz ====&lt;br /&gt;
       Die Performanz von PostgreSQL ist mit der von kommerziellen und&lt;br /&gt;
       anderen Open-Source-Datenbanken vergleichbar. In manchen&lt;br /&gt;
       Bereichen ist es schneller, in anderen langsamer. In der Regel&lt;br /&gt;
       beträgt der Unterschied +/-10%.&lt;br /&gt;
       &lt;br /&gt;
==== Zuverlässigkeit ====&lt;br /&gt;
       Es ist selbstredend, dass ein DBMS wertlos ist, wenn es nicht&lt;br /&gt;
       zuverlässig arbeitet. Daher bemühen wir uns, nur streng&lt;br /&gt;
       geprüften und beständigen Code freizugeben, der nur ein Minimum&lt;br /&gt;
       an Programmfehlern aufweist. Jede Freigabe hat mindestens einen&lt;br /&gt;
       Monat Betatest-Phase hinter sich, und unsere Freigabehistorie&lt;br /&gt;
       beweist, dass wir stabile und solide Versionen freigeben, die&lt;br /&gt;
       im Produktionsbetrieb genutzt werden können. Wir glauben, dass&lt;br /&gt;
       wir im Vergleich mit anderer Datenbanksoftware vorteilhaft&lt;br /&gt;
       dastehen.&lt;br /&gt;
       &lt;br /&gt;
==== Support ====&lt;br /&gt;
       Unsere Mailinglisten bieten die Möglichkeit, gemeinsam mit&lt;br /&gt;
       einer großen Gruppe von Entwicklern und Benutzern mögliche&lt;br /&gt;
       Probleme zu lösen. Wir können nicht immer eine Fehlerbehebung&lt;br /&gt;
       garantieren, kommerzielle DBMS tun dies aber auch nicht. Der&lt;br /&gt;
       direkte Kontakt zur Entwickler- und Benutzergemeinschaft und&lt;br /&gt;
       der Zugriff auf die Handbücher und den Quellcode ermöglicht&lt;br /&gt;
       einen im Vergleich zu anderen DBMS höherwertigeren Support. Es&lt;br /&gt;
       gibt jedoch auch Anbieter von kommerziellen Support-Leistungen&lt;br /&gt;
       (siehe FAQ-Punkt 1.7).&lt;br /&gt;
       &lt;br /&gt;
==== Preis ====&lt;br /&gt;
       PostgreSQL ist frei verfügbar, sowohl für die kommerzielle wie&lt;br /&gt;
       auch für die nicht-kommerzielle Nutzung. Sie können den&lt;br /&gt;
       PostgreSQL-Code ohne Einschränkungen (außer denjenigen, die in&lt;br /&gt;
       der oben angegebene BSD-artigen Lizenz erwähnt werden) in Ihr&lt;br /&gt;
       Produkt integrieren.&lt;br /&gt;
&lt;br /&gt;
=== Kann PostgreSQL eingebettet (embedded) werden? ===&lt;br /&gt;
PostgreSQL basiert auf einer Server/Client-Architektur, diese benötigt separate Prozesse für jeden Klient und Server, hinzukommen auch noch weitere &amp;quot;Helfer-Prozesse&amp;quot; (z. B. für autovacuum und stats-collector). Zwar können einige &amp;quot;embedded-Architekturen&amp;quot; diese Anforderungen erfüllen, aber wenn der Datenbank-Prozess innerhalb des Applikations-Prozesses laufen muss, kann PostgreSQL nicht verwendet werden. Dazu sollte man leichtere Datenbanken nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mich von einer Maillingliste abmelden? Wie verhindere ich es, dass ich doppelte E-Mails bekomme? ===&lt;br /&gt;
Majordomo ermöglicht es sich von allen Maillinglisten an- und abzumelden, ggf. müssen Sie sich zuerst ihr Majordomo-Passwort zuschicken lassen.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr|PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Maillinglisten sind so konfiguriert, dass Antworten an den ursprünglichen Autor und an die Maillingliste verschickt werden. Somit soll erreicht werden dass Benutzer immer schnellstmöglichst eine Antwort erhalten können. Diese Einstellungen können Sie auch über die Konfiguration von Majordomo ändern, ändern Sie dafür die Einstellung für ''eliminatecc''. Sie können auch einstellen dass Sie selbst keine Antwort auf Ihre eigenen E-Mails bekommen, ändern sie dafür die Einstellung für ''selfcopy''.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr|PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
       &lt;br /&gt;
== Fragen zu Benutzerprogrammen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Welche Schnittstellen gibt es für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Installation stellt nur Schnittstellen für C und&lt;br /&gt;
Embedded C bereit. Alle weitere Schnittstellen sind unabhängige&lt;br /&gt;
Projekte, die einzeln heruntergeladen werden werden müssen. Diese&lt;br /&gt;
Trennung ermöglicht individuelle Entwickler-Teams und&lt;br /&gt;
Entwicklungszyklen für die jeweiligen Projekte.&lt;br /&gt;
&lt;br /&gt;
Einige Programmiersprachen wie PHP haben eine PostgreSQL-&lt;br /&gt;
Schnittstelle bereits eingebaut. Schnittstellen für Sprachen wie Perl,&lt;br /&gt;
TCL, Python und viele anderen sind unter http://gborg.postgresql.org&lt;br /&gt;
im Bereich Drivers/Interfaces verfügbar sowie per Internet-Suche.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann man PostgreSQL in einer Website nutzen? ===&lt;br /&gt;
  &lt;br /&gt;
Eine nette Einführung zu datenbank-gestützten Webseiten kann unter&lt;br /&gt;
http://www.webreview.com (engl.) eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Für die Web-Integration ist PHP eine ausgezeichnete Schnittstelle. PHP&lt;br /&gt;
gibt es bei http://www.php.net&lt;br /&gt;
&lt;br /&gt;
Desweiteren bietet sich die Perl-Schnittstelle mit CGI.pm&lt;br /&gt;
oder mod_perl auch an.&lt;br /&gt;
&lt;br /&gt;
=== Hat PostgreSQL eine grafische Benutzerschnittstelle? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt eine große Anzahl von GUI-Programmen für PostgreSQL - sowohl&lt;br /&gt;
kommerziell als auch Open-Source. [http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools| Eine englische Liste befindet sich hier.]&lt;br /&gt;
&lt;br /&gt;
== Administrative Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql? ===&lt;br /&gt;
  &lt;br /&gt;
Bei der Ausführung von configure die Option --prefix mit dem Zielverzeichnis angeben.&lt;br /&gt;
&lt;br /&gt;
=== Wie regle ich Zugriffe von anderen Rechnern? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL ist standardmäßig so eingestellt, dass Verbindungen nur vom&lt;br /&gt;
lokalen Rechner über Unix Domain Sockets bzw. TCP/IP möglich sind.&lt;br /&gt;
Verbindungen von anderen Rechnern werden erst dann ermöglicht, wenn&lt;br /&gt;
Sie in der Datei postgresql.conf die Einstellung listen_addresses&lt;br /&gt;
anpassen, in der Datei $PGDATA/pg_hba.conf host-basierte&lt;br /&gt;
Authentifizierung einschalten und den Server neu starten.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine bessere Performanz erreichen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt drei große Bereiche, in denen Performanzverbesserungen erzielt&lt;br /&gt;
werden können:&lt;br /&gt;
&lt;br /&gt;
==== Abfrageoptimierung ====&lt;br /&gt;
Die Modifizierung von Abfragen kann eine bessere Performanz erzielen:&lt;br /&gt;
       &lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/indexes.html Erstellung von Indexen, einschliesslich partieller Indexe sowie Expressionsindexe]&lt;br /&gt;
* Einsatz von COPY anstelle multipler INSERT-Anweisungen&lt;br /&gt;
* Gruppierung von mehreren Abfragen innerhalb einer Transaktion, um Aufwand beim Abschluss von Transaktionen    einzusparen&lt;br /&gt;
* Einsatz von CLUSTER beim Holen von einer großen Anzahl von Datenreihen aus einem Index&lt;br /&gt;
* Einsatz von LIMIT, um eine Untermenge der Abfragenergebnisse zurückzuliefern&lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/sql-prepare.html Einsatz von vorbereiteten Befehlen (prepared queries)]&lt;br /&gt;
* Einsatz von ANALYZE, um die Datenbankstatistik für den Abfragenplaner aktuell zu halten&lt;br /&gt;
* [http://www.postgresql.org/docs/current/static/routine-vacuuming.html Regelmäßiger Einsatz von VACUUM bzw. pg_autovacuum (autovacuum ist seit Version 8.3 standardmäßig aktiviert)]&lt;br /&gt;
* Bei großen Datenveränderungen die Löschung von Indexen&lt;br /&gt;
&lt;br /&gt;
==== Server-Konfiguration ====&lt;br /&gt;
Einige Einstellungen in der Datei postgresql.conf wirken sich auf die Performanz aus. Das Handbuch enthält unter      http://www.postgresql.org/docs/current/static/runtime-config.html eine komplette Auflistung. &lt;br /&gt;
&lt;br /&gt;
Kommentare zu den jeweiligen Einstellungen gibt es unter http://www.varlena.com/varlena/GeneralBits/Tidbitsannotated_conf_e.html und http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.&lt;br /&gt;
       &lt;br /&gt;
==== Hardware-Auswahl ====&lt;br /&gt;
Die Auswirkung von Hardware auf Performanz wird unter http://momjian.us/main/writings/pgsql/hw_performance/index.html und http://www.powerpostgresql.com/PerfList/ erläutert.&lt;br /&gt;
       &lt;br /&gt;
=== Welche Debugging-Funktionen sind für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
Unter den Optionen für die Server-Konfigurierung gibt es zahlreiche&lt;br /&gt;
log_*-Variablen, die die Ausgabe von Abfrage- und Prozessstatistiken&lt;br /&gt;
ermöglichen. Diese können für Debugging-Zwecke sowie Performanz-Tests&lt;br /&gt;
sehr nützlich sein.&lt;br /&gt;
&lt;br /&gt;
=== Ich bekomme die Meldung &amp;quot;Sorry, too many clients&amp;quot;, wenn ich eine Verbindung aufzubauen versuche. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Ihr System hat die maximal zulässige Anzahl von Datenbankverbindungen&lt;br /&gt;
erreicht (Voreinstellung 100). Sie müssen die maximale Anzahl der&lt;br /&gt;
gleichzeitig ausführbaren Backend-Prozesse hochsetzen, indem Sie in&lt;br /&gt;
postgresql.conf den Wert max_connections ändern und den Server&lt;br /&gt;
neustarten.&lt;br /&gt;
&lt;br /&gt;
=== Wie wird PostgreSQL aktualisiert? ===&lt;br /&gt;
  &lt;br /&gt;
Allgemeine Informationen zur Aktualisierung von PostgreSQL gibt es auf&lt;br /&gt;
der Seite http://www.postgresql.org/support/versioning. Detaillierte&lt;br /&gt;
technische Informationen gibt es auf der Seite&lt;br /&gt;
http://www.postgresql.org/docs/current/static/install-upgrading.html&lt;br /&gt;
&lt;br /&gt;
=== Kommt PostgreSQL mit den Anpassungen der Sommerzeit in verschiedenen Ländern klar? ===&lt;br /&gt;
  &lt;br /&gt;
Für die Berücksichtigung der Sommerzeit verwendet PostgreSQL Seit dem Release 8.0 die weiterverbreitete tzdata-Datenbank (auch bekannt als &amp;quot;zoneinfo database&amp;quot; oder &amp;quot;[http://www.twinsun.com/tz/tz-link.htm| Olzen timezone database]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jedes Update von PostgreSQL beinhaltet die aktuellen tzdata Dateien, daher sollte es reichen die Minor-Updates der eingesetzten Major Version im Auge zu behalten.&lt;br /&gt;
&lt;br /&gt;
Unter der Vorraussetzung dass das Betriebssystem diese Dateien schon in einer stets aktuellen Version vorbehält, ist es üblich, dass man diese Dateien verwendet. PostgreSQL bietet dazu eine compile-option an.&lt;br /&gt;
&lt;br /&gt;
=== Welche Hardware eignet sich für den Betrieb mit PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL läuft auf fast jeder Hardware-Kombination. Im PC-Bereich&lt;br /&gt;
gibt es allerdings sehr große Abweichungen in der Qualität. Für einen&lt;br /&gt;
Arbeitsplatz- oder Entwicklungsrechner mag dies nicht so bedeutend&lt;br /&gt;
sein, im Server-Betrieb jedoch lohnt sich auf jeden Fall die&lt;br /&gt;
Investition in teurere Bestandteile (Stichwörter ECC-Speicher, SCSI,&lt;br /&gt;
Hauptplatinen und Netzteile von namhaften Herstellern). Nutzen Sie&lt;br /&gt;
unsere Mailing-Listen, um Hardware-Optionen zu diskutieren.&lt;br /&gt;
&lt;br /&gt;
== Fragen zum Betrieb ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie wähle ich per SELECT-Anweisung nur die ersten paar Zeilen bzw. eine beliebige Zeile in einer Abfrage aus? ===&lt;br /&gt;
  &lt;br /&gt;
Wenn Sie bei der Ausführung der Abfrage die Anzahl der anzufordenden&lt;br /&gt;
Reihen bereits kennen, nutzen Sie LIMIT. Wenn die ORDER BY- Anweisung&lt;br /&gt;
mit einem Index verwendet wird, ist es möglich, dass die gesamte&lt;br /&gt;
Abfrage nicht ausgeführt werden muss. Wenn Sie die Anzahl der der&lt;br /&gt;
anzufordenden Reihen nicht kennen, verwenden Sie einen Cursor und&lt;br /&gt;
FETCH.&lt;br /&gt;
&lt;br /&gt;
Um eine beliebige Zeile auszuwählen, nutzen Sie ORDER BY random():&lt;br /&gt;
    SELECT spalte&lt;br /&gt;
      FROM tabelle&lt;br /&gt;
  ORDER BY random()&lt;br /&gt;
     LIMIT 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Wie finde ich heraus, welche Tabellen, Indexe, Datenbanken oder Benutzer in der Datenbank definiert sind? Wie bekomme ich die von psql verwendeten Abfragen? ===&lt;br /&gt;
  &lt;br /&gt;
In psql zeigt der Befehl \dt eine Liste der Datenbanktabellen. Weitere&lt;br /&gt;
psql-Befehle lassen sich mit \? anzeigen. Sie können sich die Datei&lt;br /&gt;
pgsql/src/bin/psql/describe.c mit dem Quellcode für psql ansehen. Sie&lt;br /&gt;
enthält die SQL-Abfragen, die die Backslash-Kommandos (\) ausführen.&lt;br /&gt;
Sie können psql auch mit der -E Option starten. Danach gibt psql die&lt;br /&gt;
Abfragen aus, die es bei der Ausführung der Befehle benutzt. Außerdem&lt;br /&gt;
biete PostgreSQL ein SQL-kompatibles INFORMATION SCHEMA, das&lt;br /&gt;
Metainformation über die Datenbank zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
Mit psql -l können Sie alle Datenbanken anzeigen lassen.&lt;br /&gt;
&lt;br /&gt;
Die Datei pgsql/src/tutorial/syscat.source enthält außerdem viele&lt;br /&gt;
SELECT- Abfragen, mit deren Hilfe man Information über die&lt;br /&gt;
Systemtabellen erhalten kann.&lt;br /&gt;
&lt;br /&gt;
=== Wie ändere ich den Datentyp einer Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Ab Version 8.0 kann der Datentyp einer Spalte mit ALTER TABLE ALTER&lt;br /&gt;
COLUMN TYPE geändert werden, sofern der neue Datentyp die Werte des&lt;br /&gt;
alten Datentype aufnehmen kann.&lt;br /&gt;
&lt;br /&gt;
Bei früheren Versionen gehen Sie wie folgt vor:&lt;br /&gt;
    BEGIN;&lt;br /&gt;
    ALTER TABLE tabelle ADD COLUMN neue_spalte neuer_datentyp;&lt;br /&gt;
    UPDATE tabelle SET neue_spalte = CAST(alte_spalte AS neuer_datentyp);&lt;br /&gt;
    ALTER TABLE tabelle DROP COLUMN alte_spalte;&lt;br /&gt;
    COMMIT;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Speicherplatz freizugeben, der von der gelöschten Spalte&lt;br /&gt;
verwendet wurde, führen Sie VACUUM FULL aus.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank? ===&lt;br /&gt;
  &lt;br /&gt;
Es bestehen folgende Obergrenzen:&lt;br /&gt;
 Maximale Größe eine Datenbank?           unbeschränkt (es existieren&lt;br /&gt;
                                            Datenbanken mit 32 TB)&lt;br /&gt;
 Maximale Größe einer Tabelle?            32 TB&lt;br /&gt;
 Maximale Größe einer Zeile?              400 GB&lt;br /&gt;
 Maximale Größe einer Spalte?             1 GB&lt;br /&gt;
 Maximale Anzahl von Zeilen in einer Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
 Maximale Anzahl von Spalten in einer Tabelle?&lt;br /&gt;
                                          250-1600 je nach Spaltentyp&lt;br /&gt;
 Maximale Anzahl von Indexen für eine Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich sind dies theoretische Werte, die oft durch die&lt;br /&gt;
verfügbaren Platten- und Speicherressourcen beschränkt werden. Extreme&lt;br /&gt;
Größen können zu Leistungseinbußen führen.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße von 32 TB benötigt keine&lt;br /&gt;
Large-File-Unterstützung im Betriebssystem. Große Tabellen werden in&lt;br /&gt;
Dateien mit einer Größe von je 1 GB aufgeteilt, wodurch etwaige&lt;br /&gt;
dateisystem-bedingte Beschränkungen nicht relevant sind.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße und die maximale Anzahl von Spalten können&lt;br /&gt;
vervierfacht werden, indem man die Default-Blockgröße auf 32 KB&lt;br /&gt;
heraufsetzt. Die Tabellengröße kann auch durch Tabellenpartitionierung&lt;br /&gt;
vergrößert werden.&lt;br /&gt;
&lt;br /&gt;
Eine Einschränkung ist, dass Indexe nur auf Spalten erstellt werden&lt;br /&gt;
können, die bis etwa 2.000 Zeichen groß sind. Um auf größere Spalten&lt;br /&gt;
eine UNIQUE-Constraint setzen zu können, nutzen Sie einen funktionalen&lt;br /&gt;
Index mit dem MD5-Hash-Wert der Spalte. Um innerhalb einer großen, mit&lt;br /&gt;
Text belegten Spalte suchen zu können, verwenden Sie einen&lt;br /&gt;
Volltext-Index.&lt;br /&gt;
&lt;br /&gt;
=== Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen Textdatei abzuspeichern? ===&lt;br /&gt;
  &lt;br /&gt;
Eine PostgreSQL-Datenbank kann beim Abspeichern einer einfachen&lt;br /&gt;
Textdatei bis zu fünfmal mehr Platz gegenüber der eigentlichen Größe&lt;br /&gt;
der Datei beanspruchen.&lt;br /&gt;
&lt;br /&gt;
Betrachten wir eine Datei mit 100.000 Zeilen mit einem Integer und&lt;br /&gt;
einer Textbeschreibung pro Zeile. Gehen wir davon aus, dass die&lt;br /&gt;
durchschnittliche Länge der Textbeschreibung 20 Byte beträgt. Die&lt;br /&gt;
einfache Datei würde 2,8 MB groß sein. Die Größe der&lt;br /&gt;
PostgreSQL-Datenbankdatei, die diese Daten enthält, liegt ungefähr bei&lt;br /&gt;
5,2 MB:&lt;br /&gt;
 24 Bytes: jeder Zeilenkopf (ungefähr)&lt;br /&gt;
+24 Bytes: ein Integer-Feld und ein Textfeld&lt;br /&gt;
+ 4 Bytes: Zeiger auf der Datenseite auf den Tupel&lt;br /&gt;
-----------------------------------------------&lt;br /&gt;
 52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
Die Größe einer Datenseite in PostgreSQL beträgt 8192 Bytes (8 KB),&lt;br /&gt;
also:&lt;br /&gt;
8192 Bytes pro Seite&lt;br /&gt;
---------------------   =  146 Zeilen pro Seite (abgerundet)&lt;br /&gt;
  52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
100.000 Datenzeilen&lt;br /&gt;
------------------------  =  685 Datenbankseiten (aufgerundet)&lt;br /&gt;
    158 Zeilen pro Seite&lt;br /&gt;
&lt;br /&gt;
633 Datenbankseiten * 8192 Bytes pro Seite  =  5,185,536 bytes (5,2 MB)&lt;br /&gt;
&lt;br /&gt;
Indexe beanspruchen nicht so viel Platz. Da sie jedoch die Daten&lt;br /&gt;
beinhalten, die sie indizieren, können auch sie sehr groß werden.&lt;br /&gt;
&lt;br /&gt;
NULL-Werte werden als Bitmaps gespeichert, wodurch sie sehr wenig&lt;br /&gt;
Platz in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Meine Abfragen sind langsam oder benutzen die Indexe nicht. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Indexe werden nicht automatisch bei jeder Abfrage verwendet. Indexe&lt;br /&gt;
werden nur dann verwendet, wenn die abzufragende Tabelle eine&lt;br /&gt;
bestimmte Größe übersteigt, und die Abfrage nur eine kleine&lt;br /&gt;
Prozentzahl der Tabellenzeilen abfragt. Der Grund hierfür ist der,&lt;br /&gt;
dass die durch einen Index verursachten Festplattenzugriffe manchmal&lt;br /&gt;
länger dauern würden als ein einfaches Auslesen aller Tabellenzeilen&lt;br /&gt;
(sequentieller Scan).&lt;br /&gt;
&lt;br /&gt;
Um festzustellen, ob ein Index verwendet werden soll, braucht&lt;br /&gt;
PostgreSQL Statistiken über die Tabelle. Diese Statistiken werden&lt;br /&gt;
durch die Anweisungen VACUUM ANALYZE bzw. ANALYZE berechnet. Anhand&lt;br /&gt;
der Statistiken kennt der Abfragenoptimierer die Anzahl der&lt;br /&gt;
Tabellenzeilen und kann besser entscheiden, ob Indexe verwendet werden&lt;br /&gt;
sollen. Statistiken sind auch bei der Ermittlung der optimalen&lt;br /&gt;
JOIN-Reihenfolgen und -Methoden wertvoll. Daher sollten diese&lt;br /&gt;
regelmässig durchgeführt werden, da sich der Inhalt einer Tabelle ja&lt;br /&gt;
auch verändert.&lt;br /&gt;
&lt;br /&gt;
Indexe werden normalerweise nicht in ORDER BY-Abfrage oder in JOINs&lt;br /&gt;
verwendet. Ein sequentieller Scan mit anschließendem explizitem&lt;br /&gt;
Sortiervorgang ist normalerweise schneller als ein Index-Scan einer&lt;br /&gt;
großen Tabelle. Jedoch wird bei einer Abfrage, in der LIMIT zusammen&lt;br /&gt;
mit ORDER BY verwendet wird, oftmals ein Index verwendet, da nur ein&lt;br /&gt;
kleiner Abschnitt der Tabelle zurückgeliefert wird.&lt;br /&gt;
&lt;br /&gt;
Sollte es danach aussehen, also ob der Optimierer irrtümlich einen&lt;br /&gt;
sequentiellen Scan ausführt, führen Sie SET enable_seqscan TO 'off'&lt;br /&gt;
aus und prüfen Sie, ob die Indexabfrage dadurch scheller geworden ist.&lt;br /&gt;
&lt;br /&gt;
Bei der Nutzung von Wildcard-Operatoren wie LIKE oder ~, können Indexe&lt;br /&gt;
nur unter bestimmten Umständen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
* Das Suchmuster muss sich an Anfang des Strings befinden, d.h.:&lt;br /&gt;
** LIKE-Suchmuster dürfen nicht mit % anfangen;&lt;br /&gt;
** ~ (reguläre Ausdrücke) müssen mit ^ anfangen.&lt;br /&gt;
* Das Suchmuster darf nicht mit einer Zeichenklasse (z.B. [a-e]) beginnen.&lt;br /&gt;
* Suchmuster, die Gross- und Kleinschreibung nicht berücksichtigen (z.B. ILIKE bzw. ~*), verwenden keine Indexe. Stattdessen können funktionale Indexe verwendet werden, die im Punkt 4.8 beschrieben werden.&lt;br /&gt;
* Die Standard-Locale &amp;quot;C&amp;quot; muss während der Datenbank-Initialisierung mit initdb verwendet worden sein, da andere locales den nächstgrößten Wert nicht ermitteln können. Es ist allerdings möglich, einen besonderen text_pattern_ops-Index für solche Fälle zu erstellen.&lt;br /&gt;
    &lt;br /&gt;
In Versionen vor 8.0 werden Indexe oft nicht benutzt, wenn die&lt;br /&gt;
jeweiligen Datentypen nicht genau übereinstimmen. Dies gilt besonders&lt;br /&gt;
für Indexe auf Spalten mit den Datentypen INT2, INT8 und NUMERIC&lt;br /&gt;
&lt;br /&gt;
=== Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine Abfrage auswertet? ===&lt;br /&gt;
  &lt;br /&gt;
Eine ausführliche Erklärung zu diesem Thema findet sich in der [http://www.postgresql.org/docs/current/static/sql-explain.html EXPLAIN] Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie änder ich das Sortierverhalten von textähnlichen Daten? ===&lt;br /&gt;
PostgreSQL sortiert Daten anhand dem bei initdb gesetzten Locale. (Ab 8.4 wird es es möglich sein pro Datenbank ein eigenes Locale zu definieren)&lt;br /&gt;
&lt;br /&gt;
Entspricht das Sortierverhalten nicht dem gewünschten muss man die Locale ändern. Die meisten Locales, außer &amp;quot;C&amp;quot;, sortieren anhand der Reihenfolge des entsprechenden Wörterbuches. Das Locale &amp;quot;C&amp;quot; ignoriert jegliche Punktuation und Zwischenraum.&lt;br /&gt;
&lt;br /&gt;
=== Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei einer Suche, bei der Groß- und Kleinschreibweisen ignoriert werden? Wie verwende ich einen Index bei solchen Suchabfragen? ===&lt;br /&gt;
  &lt;br /&gt;
Der Operator ~ wendet einen regulären Ausdruck an und ~* wendet ihn&lt;br /&gt;
an, ohne die Groß- und Kleinschreibung zu beachten. Ebenso beachtet&lt;br /&gt;
LIKE die Groß- und Kleinschreibung, und ILIKE nicht.&lt;br /&gt;
&lt;br /&gt;
Gleichheitsvergleiche, die Groß- und Kleinschreibung ignorieren,&lt;br /&gt;
werden in der Regel so ausgedruckt:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle&lt;br /&gt;
    WHERE LOWER(spalte) = 'abc'&lt;br /&gt;
&lt;br /&gt;
Hier wird kein normaler Index benutzt. Legt man hingegen einen&lt;br /&gt;
funktionalen Index an, so wird er auf jeden Fall verwendet:&lt;br /&gt;
   CREATE INDEX tabelle_index ON tabelle (LOWER(spalte))&lt;br /&gt;
&lt;br /&gt;
Falls der obige Index als einen UNIQUE-Index angelegt wird, können&lt;br /&gt;
keine Werte in die Spalte eingefügt werden, die sich nur durch ihre&lt;br /&gt;
Groß- und Kleinschreibung unterscheiden. Um Fehler zu vermeiden muß&lt;br /&gt;
ein CHECK-Constraint oder ein Trigger eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist? Kann nach der NULL-Belegung sortiert werden? ===&lt;br /&gt;
  &lt;br /&gt;
Testen Sie die Spalte mit IS NULL bzw. IS NOT NULL.&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   WHERE &lt;br /&gt;
      spalte IS NULL&lt;br /&gt;
&lt;br /&gt;
Beim konkatenieren mit einen NULL-Wert wir das Ergebnis auch NULL. Um dies zu verhindern verwenden Sie am besten [http://www.postgresql.org/docs/current/static/functions-conditional.html| COALESCE()]&lt;br /&gt;
   SELECT &lt;br /&gt;
      COALESCE(col1, '') || COALESCE(col2, '')&lt;br /&gt;
   FROM tab;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um die Spalte danach zu sortieren, ob sie mit NULL belegt ist oder nicht, verwenden Sie die Bedingungen IS NULL bzw. IS NOT NULL in der ORDER BY-Klausel. Da Bedingungen, die wahr sind, höher als das Gegenteil sortiert werden, bewirkt die folgende Abfrage, dass die NULL-Spalten zuerst gelistet werden:&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      (spalte IS NOT NULL)&lt;br /&gt;
&lt;br /&gt;
Ab PostreSQL 8.3 und höher, ist es möglich das standardisierte NULLS FIRST/NULLS LAST zu verwenden um die Position der NULL-Werte im Ergebnis zu bestimmen. (bei FIRST stehen diese zu erst, bei LAST am Ende)&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tab&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      col NULLS FIRST;&lt;br /&gt;
&lt;br /&gt;
=== Was ist der Unterschied zwischen den verschiedenen CHAR-Typen? ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Typ&lt;br /&gt;
!interner Name&lt;br /&gt;
!Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
|VARCHAR(n) &lt;br /&gt;
|varchar&lt;br /&gt;
|die Größe legt die Maximallänge fest; kein Auffüllen mit Leerzeichen&lt;br /&gt;
|-  &lt;br /&gt;
|CHAR(n)&lt;br /&gt;
|bpchar&lt;br /&gt;
|mit Leerzeichen gefüllt bis zur angegebenen Länge&lt;br /&gt;
|-&lt;br /&gt;
|TEXT&lt;br /&gt;
|text&lt;br /&gt;
|keine obere Grenze für die Länge&lt;br /&gt;
|-&lt;br /&gt;
|BYTEA&lt;br /&gt;
|bytea&lt;br /&gt;
|Bytearray mit variabler Länge (auch für '\0'-Bytes geeignet)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;char&amp;quot; (with the quotes)&lt;br /&gt;
|char&lt;br /&gt;
|ein Zeichen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der interne Name kommt vor allem in den Systemkatalogen und in manchen&lt;br /&gt;
Fehlermeldungen vor.&lt;br /&gt;
&lt;br /&gt;
Die ersten vier Typen sind &amp;quot;varlena&amp;quot;-Typen (d.h. die ersten vier Bytes&lt;br /&gt;
geben die Länge an, gefolgt von den Daten). Daher ist der tatsächlich&lt;br /&gt;
belegte Platz immer etwas mehr als die deklarierte Feldgröße.&lt;br /&gt;
Allerdings wird unter Umständen auf diese Datentypen Datenkompression&lt;br /&gt;
durch das TOAST- Verfahren angewendet, womit der tatsächlich belegte&lt;br /&gt;
Platz auch geringer als erwartet ausfallen kann.&lt;br /&gt;
&lt;br /&gt;
Für die Speicherung von Zeichenketten variabler Länge empfiehlt sich&lt;br /&gt;
VARCHAR(n). Die maximale Länge eines VARCHAR(n)-Felds wird bei der&lt;br /&gt;
Tabellendefinition festgelegt. TEXT setzt keine Längengrenze,&lt;br /&gt;
allerdings gibt es eine systembedingte Obergrenze von 1 GB.&lt;br /&gt;
&lt;br /&gt;
CHAR(n) ist geeignet für die Speicherung von Zeichenketten, die alle&lt;br /&gt;
die gleiche Länge haben. Bitte beachten Sie, dass CHAR(n) automatisch&lt;br /&gt;
Zeichenketten bis zur definierten Feldlänge mit Leerzeichen ausfüllt,&lt;br /&gt;
während bei VARCHAR(n) nur die tatsächlich eingegebene Zeichenkette&lt;br /&gt;
gespeichert wird.&lt;br /&gt;
&lt;br /&gt;
BYTEA ist für binäre Daten, besonders für Werte, die NULL-Bytes haben.&lt;br /&gt;
&lt;br /&gt;
Alle der hier erwähnten Typen weisen ähnliche Performanzeigenschaften&lt;br /&gt;
auf.&lt;br /&gt;
&lt;br /&gt;
=== Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Wert? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet einen SERIAL-Datentyp. Dies ist zwar kein richtiger Datentyp. Es ist die Kurzform für das Erstellen einer Spalte vom Typ Integer, die von einer Sequenz befüllt wird. &lt;br /&gt;
&lt;br /&gt;
Zum Beispiel:&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
       id   SERIAL,&lt;br /&gt;
       name TEXT&lt;br /&gt;
   )&lt;br /&gt;
&lt;br /&gt;
wird automatisch in:&lt;br /&gt;
   CREATE SEQUENCE person_id_seq;&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
     id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),&lt;br /&gt;
     name TEXT&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Die automatisch generierte Sequenz besitzt immer folgenden Namen:&lt;br /&gt;
''tabellederspalte''-''namederspalte''_seq&lt;br /&gt;
&lt;br /&gt;
Die Man-Page zu CREATE SEQUENCE beinhaltet mehr Informationen zu Sequenzen.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einen Typ BIGSERIAL, dieser unterscheidet sich aber nur darin dass die Spalte den Typ BIGINTEGER bekommt. BIGSERIAL sollte verwendet werden wenn es zu erwarten ist, dass mehr als 2 Milliarden Sequenz-Werte verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie bekomme ich den Wert einer SERIAL-Sequenz? ===&lt;br /&gt;
  &lt;br /&gt;
Eine Möglichkeit wäre, mit der nextval()-Funktion den nächsten SERIAL-Wert von dem Sequenzobjekt vor der Auszuführung einer INSERT-Anweisung anzufordern und ihn dann explizit in die INSERT-Anweisung einzubinden. Anhand der Beispieltabelle in 4.11.1 könnte dieser Vorgang in einer Pseudosprache so aussehen:&lt;br /&gt;
&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT nextval('person_id_seq')&amp;quot;);&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Danach stünde der neue Wert in der Variablen new_id für die Verwendung in weiteren Abfragen zur Verfügung, zum Beispiel als Fremdschlüssel zur Tabelle 'person'). Bitte beachten Sie, dass der Name des automatisch erstellten SEQUENCE-Objektes folgenden Name hat: «table»_«serialcolumn»_seq wobei 'table' und 'serialcolumn' die Namen&lt;br /&gt;
der jeweils betreffenden Tabelle / Spalte darstellen.&lt;br /&gt;
&lt;br /&gt;
Als weitere Möglichkeit können Sie nach einer INSERT-Anweisung den automatisch eingefügten SERIAL-Wert mit der currval()-Funktion zurückgeben lassen:&lt;br /&gt;
&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT currval('person_id_seq')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Die einfachste Möglichkeit ist es RETURNING zu verwenden. Ein einfaches Beispiel sähe so aus:&lt;br /&gt;
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;&lt;br /&gt;
&lt;br /&gt;
=== Führt currval() zu einer Race-Condition mit anderen Nutzern? ===&lt;br /&gt;
  &lt;br /&gt;
Nein. currval() liefert einen Wert zurück, der von Ihrer&lt;br /&gt;
Datenbank-Session bestimmt wird, und der anderen Sessionen nicht zur&lt;br /&gt;
Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner Sequenz-/SERIAL-Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Um die gleichzeitige Abarbeitung von Transaktionen zu verbessern,&lt;br /&gt;
werden Sequenzen gerade nicht für andere Transaktionen gesperrt,&lt;br /&gt;
sondern die Sequenznummern werden den laufenden Transaktionen sofort&lt;br /&gt;
zugeteilt. Lücken in der Sequenznummerierung werden durch abgebrochene&lt;br /&gt;
Transaktionen verursacht.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein OID? ===&lt;br /&gt;
  &lt;br /&gt;
Jede Zeile, die in PostgreSQL erzeugt wird, bekommt eine eindeutige OID, sofern die Tabelle nicht mit der Option WITHOUT OIDS angelegt wurde. OIDs sind automatisch zugewiesene 4-Byte-Integer, die innerhalb der gesamten Datenbank einmalig sind. Allerdings laufen sie bei einem Wert von ungefähr 4 Milliarden über. PostgreSQL verwendet OIDs, um&lt;br /&gt;
seine interne Systemtabellen zu verbinden.&lt;br /&gt;
&lt;br /&gt;
Um einmalige Idenfikatoren in Datentabellen zu erstellen, wird allerdings empfohlen, statt OIDs Werte zu verwenden, die von SERIAL-Sequenzen erzeugt werden. SERIAL-Sequenzen sind innerhalb einer Tabelle einmalig und daher weniger anfällig für Überläufe. Außerdem können 8-Byte-Sequenzwerte mit BIGSERIAL (SERIAL8) erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein CTID? ===&lt;br /&gt;
&lt;br /&gt;
CTIDs werden benutzt, um bestimmte physikalische Zeilen durch Block und Offset Werte zu identifizieren. CTIDs verändern sich, sobald Zeilen verändert oder zurückgeladen werden. Sie werden in Indexeinträgen benutzt um auf die physikalischen Zeilen zu zeigen.&lt;br /&gt;
&lt;br /&gt;
=== Wieso bekomme ich einen Fehler: &amp;quot;ERROR: Memory exhausted in AllocSetAlloc()&amp;quot;? ===&lt;br /&gt;
  &lt;br /&gt;
Wahrscheinlich gibt es keinen virtuellen Speicher mehr in Ihrem System&lt;br /&gt;
oder Ihr Kernel hat niedrige Höchstgrenzen für bestimmte Ressourcen.&lt;br /&gt;
Probieren Sie vor dem Start von postmaster folgendes:&lt;br /&gt;
   ulimit -d 262144&lt;br /&gt;
   limit datasize 256m&lt;br /&gt;
&lt;br /&gt;
Je nach benutzter Shell wird nur einer dieser Befehle erfolgreich&lt;br /&gt;
ausgeführt werden. Auf jedem Fall wird die Grenze des Datensegments&lt;br /&gt;
für Prozesse erhöht werden und eventuell die erfolgreiche Ausführung&lt;br /&gt;
der Abfrage ermöglichen. Falls Sie ein Problem mit dem SQL-Client&lt;br /&gt;
haben, weil das Backend zu viele Daten zurückliefert, versuchen Sie&lt;br /&gt;
dies vor dem Start des SQL-Clients.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft? ===&lt;br /&gt;
  &lt;br /&gt;
Geben Sie in psql SELECT VERSION(); ein.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine Spalte erstellen, deren Default-Wert immer die aktuelle Uhrzeit enthalten soll? ===&lt;br /&gt;
  &lt;br /&gt;
Dazu verwenden Sie CURRENT_TIMESTAMP:&lt;br /&gt;
   CREATE TABLE test (x INT, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );&lt;br /&gt;
&lt;br /&gt;
=== Wie führe ich eine OUTER JOIN durch? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt OUTER JOINs nach dem SQL- Standardsyntax. Hier&lt;br /&gt;
zwei Beispiele:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 ON (t1.spalte = t2.spalte)&lt;br /&gt;
&lt;br /&gt;
bzw.:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 USING (spalte)&lt;br /&gt;
&lt;br /&gt;
Diese identischen Abfragen verknüpfen tabelle_1 mit tabelle_2 über die&lt;br /&gt;
Spalte 'spalte' und geben außerdem alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_1 (diejenigen, die keine Entsprechung in tabelle_2 haben)&lt;br /&gt;
zurück. Ein RIGHT JOIN würde hingegen alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_2 hinzufügen und ein FULL JOIN würde alle verknüpften Zeilen&lt;br /&gt;
sowie jeweils alle unverknüpften Zeilen aus den beiden Tabellen&lt;br /&gt;
zurückliefern. Die Angabe von OUTER ist nicht zwingend und kann in&lt;br /&gt;
LEFT, RIGHT und FULL-Verknüpfungen weggelassen werden. Normale&lt;br /&gt;
Verknüpfungen sind INNER JOINs.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt keinen Weg, innerhalb einer Abfrage auf mehr als eine&lt;br /&gt;
Datenbank zuzugreifen. Da PostgreSQL datenbank-spezifische&lt;br /&gt;
Systemkataloge lädt, ist eine datenbankübergreifende Abfrage nicht&lt;br /&gt;
möglich.&lt;br /&gt;
&lt;br /&gt;
contrib/dblink ist eine Erweiterung, die datenbankübergreifende&lt;br /&gt;
Abfragen über Funktionsaufrufe ermöglicht.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion zurückgeben lassen? ===&lt;br /&gt;
  &lt;br /&gt;
Funktionen können mehrere Zeilen und Spalten zurückgeben, vgl.:&lt;br /&gt;
http://www.postgresql.org/docs/techdocs.17.&lt;br /&gt;
&lt;br /&gt;
=== Warum bekomme ich eine Fehlermeldung wie &amp;quot;relation with OID ##### does not exist&amp;quot; wenn ich temporäre Tabellen in PL/PgSQL-Funktionen benutze? ===&lt;br /&gt;
  &lt;br /&gt;
In PostgreSQL-Versionen vor 8.3 verarbeitet PL/PgSQL Funktionen in&lt;br /&gt;
einer Cache. Dies hat eine unangenehme Nebenwirkung, nämlich dass wenn&lt;br /&gt;
eine PL/PgSQL-Funktion auf eine temporäre Tabelle zugreift, und diese&lt;br /&gt;
Tabelle anschließend gelöscht bzw. neu erstellt wird, die Funktion&lt;br /&gt;
fehlschlagen wird, da die gecachten Funktionsinhalte noch auf die alte&lt;br /&gt;
temporäre Tabelle zeigen. Die Lösung für diese Probleme besteht darin,&lt;br /&gt;
in der PL/PgSQL- Funktion mittels EXECUTE auf temporäre Tabellen&lt;br /&gt;
zuzugreifen. Dies bewirkt, dass bei jedem Funktionsruf die betreffende&lt;br /&gt;
Abfrage neu geparst wird.&lt;br /&gt;
&lt;br /&gt;
Dieses Problem taucht in PostgreSQL 8.3 und späteren Versionen nicht&lt;br /&gt;
mehr auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Replikationslösungen gibt es? ===&lt;br /&gt;
  &lt;br /&gt;
Der Begriff &amp;quot;replikation&amp;quot; umfasst mehrere verschiedene Technologien,&lt;br /&gt;
jede mit eigenen Vor- und Nachteilen. [http://www.postgresql.org/docs/8.3/static/high-availability.html| Die Dokumentation enthält eine gute Einführung in das Thema Replikation]&lt;br /&gt;
&lt;br /&gt;
Mit &amp;quot;Master/slave&amp;quot;-Replikation werden Änderungen in einer&lt;br /&gt;
Hauptdatenbank durchgeführt und an &amp;quot;Sklaven&amp;quot; verteilt, die im&lt;br /&gt;
Nur-Lese-Modus arbeiten. Die populärste Lösung für PostgreSQL ist&lt;br /&gt;
Slony-I.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Multi-master replication&amp;quot; ermöglicht sowohl lesende als auch&lt;br /&gt;
schreibende Zugriffe über mehrere Datenbank-Server hinweg. Allerdings&lt;br /&gt;
hat diese Art von Replikation eine negative Auswirkung auf die&lt;br /&gt;
Performanz durch die Notwendigkeit, Änderungen zwischen Servern zu&lt;br /&gt;
synchronisieren. Pgcluster ist die populärste freie Lösung für&lt;br /&gt;
PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einige kommerzielle und hardware-basierte&lt;br /&gt;
Replikationslösungen für verschiedene Arten der Replikation.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Tabellen- und Spaltennamen in meiner Abfrage nicht erkannt? Warum werden Großbuchstaben umgewandelt? ===&lt;br /&gt;
  &lt;br /&gt;
Die häufigste Ursache ist die Verwendung von Gänsefüßchen bei der&lt;br /&gt;
Anlegung von Tabellen, z.B.:&lt;br /&gt;
    CREATE TABLE &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
                (&amp;quot;SPALTE1&amp;quot; INT)&lt;br /&gt;
&lt;br /&gt;
Dadurch werden Tabellen- und Spaltennamen (sog. Identifikatoren) in&lt;br /&gt;
genau der Schreibweise gespeichert (vgl. Dokumentation), was dazu&lt;br /&gt;
führt, dass man sie danach immer in Gänsefüßchen angeben muss. Im&lt;br /&gt;
obigen Beispiel muss man also immer etwa SELECT * FROM &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
verwenden. Um dieses Problem zu vermeiden, müssen Sie immer eines der&lt;br /&gt;
folgenden Punkte beachten:&lt;br /&gt;
&lt;br /&gt;
* bei der Tabellenanlegung keine Gänsefüßchen verwenden;&lt;br /&gt;
* in Identifikatoren nur Kleinschreibung verwenden;&lt;br /&gt;
* immer Identifikatoren mit Gänsefüßchen versehen&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen des Übersetzers ==&lt;br /&gt;
  &lt;br /&gt;
Die englische Vorlage dieser FAQ wird ständig überarbeitet. Daher&lt;br /&gt;
liegt die Übersetzung nicht immer auf dem aktuellsten Stand.&lt;br /&gt;
&lt;br /&gt;
Die aktuellste Version der deutschen Übersetzung befindet sich immer&lt;br /&gt;
unter http://sql-info.de/de/postgresql/FAQ_german.html. Diese&lt;br /&gt;
&amp;quot;Arbeitsversion&amp;quot; enthält eventuell Änderungen, die noch nicht auf der&lt;br /&gt;
PostgreSQL-Website eingebunden worden sind.&lt;br /&gt;
&lt;br /&gt;
Über Verbesserungshinweise und Korrekturvorschläge sowie&lt;br /&gt;
Verständnisfragen zum Inhalt der FAQ freue ich mich. Ich nehme auch&lt;br /&gt;
allgemeine Fragen zu PostgreSQL gerne entgegen, verweise jedoch auf&lt;br /&gt;
die Mailing-Listen als schnelle und zuverlässige Anlaufstellen.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/FAQ/de</id>
		<title>FAQ/de</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/FAQ/de"/>
				<updated>2011-12-06T18:37:44Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;correct markup to make the links working&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Was ist PostgreSQL? Wie wird es ausgesprochen? ===&lt;br /&gt;
  &lt;br /&gt;
Die (englische) Aussprache ist &amp;quot;Post-Gres-Q-L&amp;quot;. Im allgemeinen&lt;br /&gt;
Sprachgebrauch hat sich die Kurzform &amp;quot;Postgres&amp;quot; auch durchgesetzt.&lt;br /&gt;
(Für diejenigen, die es interessiert: eine MP3-Datei mit der&lt;br /&gt;
amerikanischen Aussprache befindet sich hier:&lt;br /&gt;
http://www.postgresql.org/files/postgresql.mp3&lt;br /&gt;
&lt;br /&gt;
PostgreSQL ist ein objektrelationales Datenbanksystem, das die Vorzüge&lt;br /&gt;
von kommerziellen Datenbanksystemen mit zukunftsweisenden Innovationen&lt;br /&gt;
kombiniert. PostgreSQL ist freie Software und dessen kompletter&lt;br /&gt;
Quellcode ist öffentlich verfügbar.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Entwicklung wird von einem Team von meist freiwilligen&lt;br /&gt;
Entwicklern durchgeführt. Dieses Team ist für die Gesamtentwicklung&lt;br /&gt;
von PostgreSQL verantwortlich. Es handelt sich um ein&lt;br /&gt;
Gemeinschaftsprojekt, das nicht von einer bestimmten Firma&lt;br /&gt;
kontrolliert wird. Lesen Sie die Entwickler-FAQ:&lt;br /&gt;
http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn Sie an einer&lt;br /&gt;
Mitarbeit interessiert sind.&lt;br /&gt;
&lt;br /&gt;
=== Wer kontrolliert PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Falls Sie nach dem Namen eines etwaigen Inhabers bzw. nach einem&lt;br /&gt;
allmächtigen Zentralkommittee suchen - sparen Sie sich die Mühe, sowas&lt;br /&gt;
existiert gar nicht. Es gibt zwar das &amp;quot;Core Committee&amp;quot; sowie&lt;br /&gt;
Entwickler, die CVS-Schreibberechtigung haben, jedoch haben diese&lt;br /&gt;
Gruppen eher nur eine administrative Rolle. Das Projekt wird durch die&lt;br /&gt;
Community gesteuert, die aus den Entwicklern sowie natürlich auch den&lt;br /&gt;
Nutzern besteht - jeder kann daran teilnehmen. (Lesen Sie die&lt;br /&gt;
Entwickler-FAQ: http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn&lt;br /&gt;
Sie an der PostgreSQL-Entwicklung teilnehmen möchten).&lt;br /&gt;
&lt;br /&gt;
=== Welchem Copyright unterliegt PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL wird unter der klassischen BSD-Lizenz herausgegeben. Im&lt;br /&gt;
Grunde genommen erlaubt diese den Nutzern, beliebig mit dem Code&lt;br /&gt;
umzugehen, auch der Weiterverkauf von Binärversionen ohne Quellcode&lt;br /&gt;
ist erlaubt. Die einzige Einschränkung besteht darin, dass PostgreSQL&lt;br /&gt;
auf keinen Fall für etwaige Probleme mit der Software haftet. Außerdem&lt;br /&gt;
muß der Copyright- Text in allen Kopien der Software enthalten sein.&lt;br /&gt;
Dies ist der Originaltext der BSD-Lizenz:&lt;br /&gt;
 &lt;br /&gt;
 PostgreSQL Data Base Management System&lt;br /&gt;
 &lt;br /&gt;
 Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group&lt;br /&gt;
 Portions Copyright (c) 1994-6 Regents of the University of California&lt;br /&gt;
 &lt;br /&gt;
 Permission to use, copy, modify, and distribute this software and its&lt;br /&gt;
 documentation for any purpose, without fee, and without a written&lt;br /&gt;
 agreement is hereby granted, provided that the above copyright notice&lt;br /&gt;
 and this paragraph and the following two paragraphs appear in all&lt;br /&gt;
 copies.&lt;br /&gt;
 &lt;br /&gt;
 IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY&lt;br /&gt;
 FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,&lt;br /&gt;
 INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND&lt;br /&gt;
 ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN&lt;br /&gt;
 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 &lt;br /&gt;
 THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,&lt;br /&gt;
 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF&lt;br /&gt;
 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE&lt;br /&gt;
 PROVIDED HEREUNDER IS ON AN &amp;quot;AS IS&amp;quot; BASIS, AND THE UNIVERSITY OF&lt;br /&gt;
 CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,&lt;br /&gt;
 UPDATES, ENHANCEMENTS, OR MODIFICATIONS.&lt;br /&gt;
&lt;br /&gt;
Es gilt die Copyright-Klausel im Original!&lt;br /&gt;
&lt;br /&gt;
=== Auf welchen Plattformen läuft PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Normalerweise kann PostgreSQL auf jeder modernen UNIX-kompatiblen&lt;br /&gt;
Plattform eingesetzt werden. Diejenigen Plattformen, die bei der&lt;br /&gt;
jeweiligen Versionsfreigabe getestet wurden, sind in den&lt;br /&gt;
Installationsanleitungen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
PostgreSQL läuft auch auf Microsoft NT-basierten Betriebssystemen wie&lt;br /&gt;
Windows 2000 SP4, XP und Server 2003. Ein vorgefertigtes&lt;br /&gt;
Installationspaket kann von http://pgfoundry.org/projects/pginstaller&lt;br /&gt;
heruntergeladen werden. DOS-basierte Windows-Versionen (Win95, Win98,&lt;br /&gt;
WinMe) können PostgreSQL nur mit Hilfe der Cygwin-Umgebung ausführen.&lt;br /&gt;
&lt;br /&gt;
=== Woher bekomme ich PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Per Web-Browser hier: http://www.postgresql.org/ftp/ und per FTP hier:&lt;br /&gt;
ftp://ftp.postgresql.org/pub/.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die neueste Version von PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die neueste Version von PostgreSQL kann auf der [http://www.postgresql.org/ Website] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Die Freigabe einer neuen Hauptversion erfolgt in der Regel jährlich, kleinere Korrekturversionen alle paar Monaten. Die kleineren Updates werden &amp;quot;Minor&amp;quot;-Updates, die großen jährlich erscheinenden &amp;quot;Major&amp;quot;-Updates genannt. &amp;quot;Minor&amp;quot;-Update erscheinen in der Regel gleichzeitig für alle unterstützten &amp;quot;Major&amp;quot;-Versionen. [http://www.postgresql.org/support/versioning| Falls Sie dieses Thema interessiert sollten Sie hier weiterlesen.]&lt;br /&gt;
&lt;br /&gt;
=== Wo bekomme ich Support für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Community bietet Unterstützung per Mailing-Liste. Die&lt;br /&gt;
Web-Seite http://www.postgresql.org/community/lists/ bietet einen&lt;br /&gt;
Überblick. Die Listen general und bugs bieten einen guten Einstieg.&lt;br /&gt;
&lt;br /&gt;
Eine deutschsprachige Mailing-Liste gibt es hier:&lt;br /&gt;
http://archives.postgresql.org/pgsql-de-allgemein/.&lt;br /&gt;
&lt;br /&gt;
Der wichtigsten IRC-Channel ist #postgresql auf Freenode&lt;br /&gt;
(irc.freenode.net). Unter UNIX/Linux können Sie mit z.B. irc -c&lt;br /&gt;
'#postgresql' &amp;quot;$USER&amp;quot; irc.freenode.net. daran teilnehmen. Auf Freenode&lt;br /&gt;
gibt es folgende Channels:&lt;br /&gt;
* #postgresql-es (spanisch)&lt;br /&gt;
* #postgresqlfr (französischen)&lt;br /&gt;
* #postgresql-br (brasilianischen) &lt;br /&gt;
&lt;br /&gt;
Es gibt außerdem einen PostgreSQL-Channel bei EFNet.&lt;br /&gt;
&lt;br /&gt;
Eine Liste von Unternehmen, die Support für PostgreSQL auf kommerzieller Basis leisten, kann unter http://www.postgresql.org/support/professional_support eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich einen Fehlerbericht abgeben? ===&lt;br /&gt;
  &lt;br /&gt;
Nutzen Sie das Formular unter&lt;br /&gt;
http://www.postgresql.org/support/submitbug. Schauen Sie aber vorher&lt;br /&gt;
unter ftp://ftp.postgresql.org/pub/ nach, ob es mittlerweile eine&lt;br /&gt;
neuere PostgreSQL-Version gibt, in der der Fehler behoben wurde.&lt;br /&gt;
&lt;br /&gt;
Bugs, die über das Formular bzw. eine der Mailing-Listen&lt;br /&gt;
bekanntgegeben wurden, erhalten typischerweise einer der folgenden&lt;br /&gt;
Reaktionen:&lt;br /&gt;
&lt;br /&gt;
* es ist kein Bug, der Grund wird benannt&lt;br /&gt;
* es ist ein bereits bekannter Bug, der bereits auf der TODO-Liste aufgenommen wurde&lt;br /&gt;
* der Bug wurde in der aktuellen Version behoben&lt;br /&gt;
* der Bug wurde bereits behoben, befindet sich aber noch nicht in einer offiziell veröffentlichten Version&lt;br /&gt;
* es wird um eingehendere Informationen gebeten, z.B.:&lt;br /&gt;
** Betriebssystem&lt;br /&gt;
** PostgreSQL-Version&lt;br /&gt;
** reproduzierbares Fallbeispiel&lt;br /&gt;
** Debugging-Information&lt;br /&gt;
** Debugger-Backtrace-Ausgabe&lt;br /&gt;
* der Bug ist neu. Folgendes könnte passieren:&lt;br /&gt;
** ein Patch wird erstellt und in der nächsten Version eingebaut&lt;br /&gt;
** der Bug kann nicht sofort behoben werden und wird auf die TODO-Liste gesetzt&lt;br /&gt;
    &lt;br /&gt;
=== Wie erfahre ich von bekannten Bugs oder fehlenden Features? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt eine erweiterte Teilmenge von SQL:2003. Siehe&lt;br /&gt;
unsere TODO-Liste unter http://www.postgresql.org/docs/faqs.TODO.html&lt;br /&gt;
für eine Auflistung der bekannten Bugs, fehlenden Features und&lt;br /&gt;
zukünftigen Pläne.&lt;br /&gt;
&lt;br /&gt;
Eine Anfrage nach einem neuen Feature führt normalerweise zu einer der&lt;br /&gt;
folgenden Antworten:&lt;br /&gt;
&lt;br /&gt;
* das Feature ist bereits auf der TODO-Liste&lt;br /&gt;
* das Feature ist nicht wünschenswert, weil:&lt;br /&gt;
** es vorhandene Funktionalität dupliziert, welche bereits dem SQL-Standard folgt&lt;br /&gt;
** es würde die Komplexität der Code-Basis erhöhen, ohne nennenswerte Vorteile zu bringen&lt;br /&gt;
** es wäre unsicher bzw. unzuverlässig&lt;br /&gt;
* das neue Feature wird der TODO-Liste hinzugefügt&lt;br /&gt;
    &lt;br /&gt;
PostgreSQL verwendet kein Bugtracking-System, da es sich als effizienter erwiesen hat, E-Mails direkt zu beantworten und die TODO-Liste aktuell zu halten. In der Praxis werden Bugs sehr schnell beseitigt, und diejenigen Bugs, die Auswirkungen auf eine große Anzahl von Nutzern haben, werden meist kurzfristig korrigiert. Der einzige Überblick über alle Änderungen, Verbesserungen und Korrekturen in einer PostgreSQL-Version befindet sich in den CVS-Log-Meldungen. Auch die Release-Notes listen nicht jede Änderung in der Software auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Dokumentation ist für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet umfangreiche Dokumentation, darunter ein großes&lt;br /&gt;
Handbuch, man-Pages und einige kleine Testprogramme. Siehe das /doc-&lt;br /&gt;
Verzeichnis. Ausserdem sind alle Handbücher online unter&lt;br /&gt;
http://www.postgresql.org/docs/ verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Bücher zu PostgreSQL sind online verfügbar unter&lt;br /&gt;
http://www.postgresql.org/docs/books/awbook.html und&lt;br /&gt;
http://www.commandprompt.com/ppbook/ .&lt;br /&gt;
&lt;br /&gt;
Eine Liste lieferbarer PostgreSQL-Bücher befindet sich unter&lt;br /&gt;
http://www.postgresql.org/docs/books Diverse technische Artikel&lt;br /&gt;
befinden sich unter http://www.postgresql.org/docs/techdocs .&lt;br /&gt;
&lt;br /&gt;
psql hat einige nützliche \d-Befehle, um Informationen über Typen,&lt;br /&gt;
Operatoren, Funktionen, Aggregate, usw. zu zeigen.&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Website enthält noch mehr Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich SQL lernen? ===&lt;br /&gt;
  &lt;br /&gt;
Die oben erwähnten PostgreSQL-spezifische Bücher bieten einen guten&lt;br /&gt;
Einstieg. Viele PostgreSQL-Anwender mögen &amp;quot;The Practical SQL Handbook&amp;quot;&lt;br /&gt;
(Bowman et al., Addison Wesley). Andere dagegen mögen &amp;quot;The Complete&lt;br /&gt;
Reference SQL&amp;quot; (Groff et al., McGraw-Hill).&lt;br /&gt;
&lt;br /&gt;
Es gibt ausserdem einige nützliche Online-Tutorials:&lt;br /&gt;
&lt;br /&gt;
* http://www.intermedia.net/support/sql/sqltut.shtm&lt;br /&gt;
* http://sqlcourse.com&lt;br /&gt;
* http://www.w3schools.com/sql/default.asp&lt;br /&gt;
* http://mysite.verizon.net/Graeme_Birchall/id1.html&lt;br /&gt;
    &lt;br /&gt;
=== Wie kann ich im Entwicklerteam mitarbeiten? ===&lt;br /&gt;
  &lt;br /&gt;
Lesen Sie in der Entwickler-FAQ unter&lt;br /&gt;
[[Developer_FAQ | Developer FAQ]] nach.&lt;br /&gt;
&lt;br /&gt;
=== Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt verschiedene Methoden, Software zu messen: Eigenschaften,&lt;br /&gt;
Performanz, Zuverlässigkeit, Support und Preis.&lt;br /&gt;
&lt;br /&gt;
==== Eigenschaften ====&lt;br /&gt;
&lt;br /&gt;
       PostgreSQL besitzt die meisten Eigenschaften - wie&lt;br /&gt;
       Transaktionen, Unterabfragen (Subqueries), Trigger, Views,&lt;br /&gt;
       referenzielle Integrität bei Fremdschlüsseln und verfeinertes&lt;br /&gt;
       Locking - die bei großen kommerziellen DBMS vorhanden sind. Es&lt;br /&gt;
       bietet außerdem einige anderen Eigenschaften, die diese nicht&lt;br /&gt;
       immer haben, wie benutzerbestimmte Typen, Vererbung, Regeln,&lt;br /&gt;
       und die Multi-Versionen-Steuerung zum Verringern&lt;br /&gt;
       konkurrierender Locks.&lt;br /&gt;
       &lt;br /&gt;
==== Performanz ====&lt;br /&gt;
       Die Performanz von PostgreSQL ist mit der von kommerziellen und&lt;br /&gt;
       anderen Open-Source-Datenbanken vergleichbar. In manchen&lt;br /&gt;
       Bereichen ist es schneller, in anderen langsamer. In der Regel&lt;br /&gt;
       beträgt der Unterschied +/-10%.&lt;br /&gt;
       &lt;br /&gt;
==== Zuverlässigkeit ====&lt;br /&gt;
       Es ist selbstredend, dass ein DBMS wertlos ist, wenn es nicht&lt;br /&gt;
       zuverlässig arbeitet. Daher bemühen wir uns, nur streng&lt;br /&gt;
       geprüften und beständigen Code freizugeben, der nur ein Minimum&lt;br /&gt;
       an Programmfehlern aufweist. Jede Freigabe hat mindestens einen&lt;br /&gt;
       Monat Betatest-Phase hinter sich, und unsere Freigabehistorie&lt;br /&gt;
       beweist, dass wir stabile und solide Versionen freigeben, die&lt;br /&gt;
       im Produktionsbetrieb genutzt werden können. Wir glauben, dass&lt;br /&gt;
       wir im Vergleich mit anderer Datenbanksoftware vorteilhaft&lt;br /&gt;
       dastehen.&lt;br /&gt;
       &lt;br /&gt;
==== Support ====&lt;br /&gt;
       Unsere Mailinglisten bieten die Möglichkeit, gemeinsam mit&lt;br /&gt;
       einer großen Gruppe von Entwicklern und Benutzern mögliche&lt;br /&gt;
       Probleme zu lösen. Wir können nicht immer eine Fehlerbehebung&lt;br /&gt;
       garantieren, kommerzielle DBMS tun dies aber auch nicht. Der&lt;br /&gt;
       direkte Kontakt zur Entwickler- und Benutzergemeinschaft und&lt;br /&gt;
       der Zugriff auf die Handbücher und den Quellcode ermöglicht&lt;br /&gt;
       einen im Vergleich zu anderen DBMS höherwertigeren Support. Es&lt;br /&gt;
       gibt jedoch auch Anbieter von kommerziellen Support-Leistungen&lt;br /&gt;
       (siehe FAQ-Punkt 1.7).&lt;br /&gt;
       &lt;br /&gt;
==== Preis ====&lt;br /&gt;
       PostgreSQL ist frei verfügbar, sowohl für die kommerzielle wie&lt;br /&gt;
       auch für die nicht-kommerzielle Nutzung. Sie können den&lt;br /&gt;
       PostgreSQL-Code ohne Einschränkungen (außer denjenigen, die in&lt;br /&gt;
       der oben angegebene BSD-artigen Lizenz erwähnt werden) in Ihr&lt;br /&gt;
       Produkt integrieren.&lt;br /&gt;
&lt;br /&gt;
=== Kann PostgreSQL eingebettet (embedded) werden? ===&lt;br /&gt;
PostgreSQL basiert auf einer Server/Client-Architektur, diese benötigt separate Prozesse für jeden Klient und Server, hinzukommen auch noch weitere &amp;quot;Helfer-Prozesse&amp;quot; (z. B. für autovacuum und stats-collector). Zwar können einige &amp;quot;embedded-Architekturen&amp;quot; diese Anforderungen erfüllen, aber wenn der Datenbank-Prozess innerhalb des Applikations-Prozesses laufen muss, kann PostgreSQL nicht verwendet werden. Dazu sollte man leichtere Datenbanken nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mich von einer Maillingliste abmelden? Wie verhindere ich es, dass ich doppelte E-Mails bekomme? ===&lt;br /&gt;
Majordomo ermöglicht es sich von allen Maillinglisten an- und abzumelden, ggf. müssen Sie sich zuerst ihr Majordomo-Passwort zuschicken lassen.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr|PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
&lt;br /&gt;
Die PostgreSQL-Maillinglisten sind so konfiguriert, dass Antworten an den ursprünglichen Autor und an die Maillingliste verschickt werden. Somit soll erreicht werden dass Benutzer immer schnellstmöglichst eine Antwort erhalten können. Diese Einstellungen können Sie auch über die Konfiguration von Majordomo ändern, ändern Sie dafür die Einstellung für ''eliminatecc''. Sie können auch einstellen dass Sie selbst keine Antwort auf Ihre eigenen E-Mails bekommen, ändern sie dafür die Einstellung für ''selfcopy''.&lt;br /&gt;
[http://mail.postgresql.org/mj/mj_wwwusr|PostgreSQLs Majordomo erreichen Sie hier.]&lt;br /&gt;
       &lt;br /&gt;
== Fragen zu Benutzerprogrammen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Welche Schnittstellen gibt es für PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
Die PostgreSQL-Installation stellt nur Schnittstellen für C und&lt;br /&gt;
Embedded C bereit. Alle weitere Schnittstellen sind unabhängige&lt;br /&gt;
Projekte, die einzeln heruntergeladen werden werden müssen. Diese&lt;br /&gt;
Trennung ermöglicht individuelle Entwickler-Teams und&lt;br /&gt;
Entwicklungszyklen für die jeweiligen Projekte.&lt;br /&gt;
&lt;br /&gt;
Einige Programmiersprachen wie PHP haben eine PostgreSQL-&lt;br /&gt;
Schnittstelle bereits eingebaut. Schnittstellen für Sprachen wie Perl,&lt;br /&gt;
TCL, Python und viele anderen sind unter http://gborg.postgresql.org&lt;br /&gt;
im Bereich Drivers/Interfaces verfügbar sowie per Internet-Suche.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann man PostgreSQL in einer Website nutzen? ===&lt;br /&gt;
  &lt;br /&gt;
Eine nette Einführung zu datenbank-gestützten Webseiten kann unter&lt;br /&gt;
http://www.webreview.com (engl.) eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
Für die Web-Integration ist PHP eine ausgezeichnete Schnittstelle. PHP&lt;br /&gt;
gibt es bei http://www.php.net&lt;br /&gt;
&lt;br /&gt;
Desweiteren bietet sich die Perl-Schnittstelle mit CGI.pm&lt;br /&gt;
oder mod_perl auch an.&lt;br /&gt;
&lt;br /&gt;
=== Hat PostgreSQL eine grafische Benutzerschnittstelle? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt eine große Anzahl von GUI-Programmen für PostgreSQL - sowohl&lt;br /&gt;
kommerziell als auch Open-Source. [http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools| Eine englische Liste befindet sich hier.]&lt;br /&gt;
&lt;br /&gt;
== Administrative Fragen ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql? ===&lt;br /&gt;
  &lt;br /&gt;
Bei der Ausführung von configure die Option --prefix mit dem Zielverzeichnis angeben.&lt;br /&gt;
&lt;br /&gt;
=== Wie regle ich Zugriffe von anderen Rechnern? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL ist standardmäßig so eingestellt, dass Verbindungen nur vom&lt;br /&gt;
lokalen Rechner über Unix Domain Sockets bzw. TCP/IP möglich sind.&lt;br /&gt;
Verbindungen von anderen Rechnern werden erst dann ermöglicht, wenn&lt;br /&gt;
Sie in der Datei postgresql.conf die Einstellung listen_addresses&lt;br /&gt;
anpassen, in der Datei $PGDATA/pg_hba.conf host-basierte&lt;br /&gt;
Authentifizierung einschalten und den Server neu starten.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine bessere Performanz erreichen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt drei große Bereiche, in denen Performanzverbesserungen erzielt&lt;br /&gt;
werden können:&lt;br /&gt;
&lt;br /&gt;
==== Abfrageoptimierung ====&lt;br /&gt;
Die Modifizierung von Abfragen kann eine bessere Performanz erzielen:&lt;br /&gt;
       &lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/indexes.html Erstellung von Indexen, einschliesslich partieller Indexe sowie Expressionsindexe]&lt;br /&gt;
* Einsatz von COPY anstelle multipler INSERT-Anweisungen&lt;br /&gt;
* Gruppierung von mehreren Abfragen innerhalb einer Transaktion, um Aufwand beim Abschluss von Transaktionen    einzusparen&lt;br /&gt;
* Einsatz von CLUSTER beim Holen von einer großen Anzahl von Datenreihen aus einem Index&lt;br /&gt;
* Einsatz von LIMIT, um eine Untermenge der Abfragenergebnisse zurückzuliefern&lt;br /&gt;
* [http://www.postgresql.org/docs/current/interactive/sql-prepare.html Einsatz von vorbereiteten Befehlen (prepared queries)]&lt;br /&gt;
* Einsatz von ANALYZE, um die Datenbankstatistik für den Abfragenplaner aktuell zu halten&lt;br /&gt;
* [http://www.postgresql.org/docs/current/static/routine-vacuuming.html Regelmäßiger Einsatz von VACUUM bzw. pg_autovacuum (autovacuum ist seit Version 8.3 standardmäßig aktiviert)]&lt;br /&gt;
* Bei großen Datenveränderungen die Löschung von Indexen&lt;br /&gt;
&lt;br /&gt;
==== Server-Konfiguration ====&lt;br /&gt;
Einige Einstellungen in der Datei postgresql.conf wirken sich auf die Performanz aus. Das Handbuch enthält unter      http://www.postgresql.org/docs/current/static/runtime-config.html eine komplette Auflistung. &lt;br /&gt;
&lt;br /&gt;
Kommentare zu den jeweiligen Einstellungen gibt es unter http://www.varlena.com/varlena/GeneralBits/Tidbitsannotated_conf_e.html und http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.&lt;br /&gt;
       &lt;br /&gt;
==== Hardware-Auswahl ====&lt;br /&gt;
Die Auswirkung von Hardware auf Performanz wird unter http://momjian.us/main/writings/pgsql/hw_performance/index.html und http://www.powerpostgresql.com/PerfList/ erläutert.&lt;br /&gt;
       &lt;br /&gt;
=== Welche Debugging-Funktionen sind für PostgreSQL verfügbar? ===&lt;br /&gt;
  &lt;br /&gt;
Unter den Optionen für die Server-Konfigurierung gibt es zahlreiche&lt;br /&gt;
log_*-Variablen, die die Ausgabe von Abfrage- und Prozessstatistiken&lt;br /&gt;
ermöglichen. Diese können für Debugging-Zwecke sowie Performanz-Tests&lt;br /&gt;
sehr nützlich sein.&lt;br /&gt;
&lt;br /&gt;
=== Ich bekomme die Meldung &amp;quot;Sorry, too many clients&amp;quot;, wenn ich eine Verbindung aufzubauen versuche. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Ihr System hat die maximal zulässige Anzahl von Datenbankverbindungen&lt;br /&gt;
erreicht (Voreinstellung 100). Sie müssen die maximale Anzahl der&lt;br /&gt;
gleichzeitig ausführbaren Backend-Prozesse hochsetzen, indem Sie in&lt;br /&gt;
postgresql.conf den Wert max_connections ändern und den Server&lt;br /&gt;
neustarten.&lt;br /&gt;
&lt;br /&gt;
=== Wie wird PostgreSQL aktualisiert? ===&lt;br /&gt;
  &lt;br /&gt;
Allgemeine Informationen zur Aktualisierung von PostgreSQL gibt es auf&lt;br /&gt;
der Seite http://www.postgresql.org/support/versioning. Detaillierte&lt;br /&gt;
technische Informationen gibt es auf der Seite&lt;br /&gt;
http://www.postgresql.org/docs/current/static/install-upgrading.html&lt;br /&gt;
&lt;br /&gt;
=== Kommt PostgreSQL mit den Anpassungen der Sommerzeit in verschiedenen Ländern klar? ===&lt;br /&gt;
  &lt;br /&gt;
Für die Berücksichtigung der Sommerzeit verwendet PostgreSQL Seit dem Release 8.0 die weiterverbreitete tzdata-Datenbank (auch bekannt als &amp;quot;zoneinfo database&amp;quot; oder &amp;quot;[http://www.twinsun.com/tz/tz-link.htm| Olzen timezone database]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jedes Update von PostgreSQL beinhaltet die aktuellen tzdata Dateien, daher sollte es reichen die Minor-Updates der eingesetzten Major Version im Auge zu behalten.&lt;br /&gt;
&lt;br /&gt;
Unter der Vorraussetzung dass das Betriebssystem diese Dateien schon in einer stets aktuellen Version vorbehält, ist es üblich, dass man diese Dateien verwendet. PostgreSQL bietet dazu eine compile-option an.&lt;br /&gt;
&lt;br /&gt;
=== Welche Hardware eignet sich für den Betrieb mit PostgreSQL? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL läuft auf fast jeder Hardware-Kombination. Im PC-Bereich&lt;br /&gt;
gibt es allerdings sehr große Abweichungen in der Qualität. Für einen&lt;br /&gt;
Arbeitsplatz- oder Entwicklungsrechner mag dies nicht so bedeutend&lt;br /&gt;
sein, im Server-Betrieb jedoch lohnt sich auf jeden Fall die&lt;br /&gt;
Investition in teurere Bestandteile (Stichwörter ECC-Speicher, SCSI,&lt;br /&gt;
Hauptplatinen und Netzteile von namhaften Herstellern). Nutzen Sie&lt;br /&gt;
unsere Mailing-Listen, um Hardware-Optionen zu diskutieren.&lt;br /&gt;
&lt;br /&gt;
== Fragen zum Betrieb ==&lt;br /&gt;
                                   &lt;br /&gt;
=== Wie wähle ich per SELECT-Anweisung nur die ersten paar Zeilen bzw. eine beliebige Zeile in einer Abfrage aus? ===&lt;br /&gt;
  &lt;br /&gt;
Wenn Sie bei der Ausführung der Abfrage die Anzahl der anzufordenden&lt;br /&gt;
Reihen bereits kennen, nutzen Sie LIMIT. Wenn die ORDER BY- Anweisung&lt;br /&gt;
mit einem Index verwendet wird, ist es möglich, dass die gesamte&lt;br /&gt;
Abfrage nicht ausgeführt werden muss. Wenn Sie die Anzahl der der&lt;br /&gt;
anzufordenden Reihen nicht kennen, verwenden Sie einen Cursor und&lt;br /&gt;
FETCH.&lt;br /&gt;
&lt;br /&gt;
Um eine beliebige Zeile auszuwählen, nutzen Sie ORDER BY random():&lt;br /&gt;
    SELECT spalte&lt;br /&gt;
      FROM tabelle&lt;br /&gt;
  ORDER BY random()&lt;br /&gt;
     LIMIT 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Wie finde ich heraus, welche Tabellen, Indexe, Datenbanken oder Benutzer in der Datenbank definiert sind? Wie bekomme ich die von psql verwendeten Abfragen? ===&lt;br /&gt;
  &lt;br /&gt;
In psql zeigt der Befehl \dt eine Liste der Datenbanktabellen. Weitere&lt;br /&gt;
psql-Befehle lassen sich mit \? anzeigen. Sie können sich die Datei&lt;br /&gt;
pgsql/src/bin/psql/describe.c mit dem Quellcode für psql ansehen. Sie&lt;br /&gt;
enthält die SQL-Abfragen, die die Backslash-Kommandos (\) ausführen.&lt;br /&gt;
Sie können psql auch mit der -E Option starten. Danach gibt psql die&lt;br /&gt;
Abfragen aus, die es bei der Ausführung der Befehle benutzt. Außerdem&lt;br /&gt;
biete PostgreSQL ein SQL-kompatibles INFORMATION SCHEMA, das&lt;br /&gt;
Metainformation über die Datenbank zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
Mit psql -l können Sie alle Datenbanken anzeigen lassen.&lt;br /&gt;
&lt;br /&gt;
Die Datei pgsql/src/tutorial/syscat.source enthält außerdem viele&lt;br /&gt;
SELECT- Abfragen, mit deren Hilfe man Information über die&lt;br /&gt;
Systemtabellen erhalten kann.&lt;br /&gt;
&lt;br /&gt;
=== Wie ändere ich den Datentyp einer Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Ab Version 8.0 kann der Datentyp einer Spalte mit ALTER TABLE ALTER&lt;br /&gt;
COLUMN TYPE geändert werden, sofern der neue Datentyp die Werte des&lt;br /&gt;
alten Datentype aufnehmen kann.&lt;br /&gt;
&lt;br /&gt;
Bei früheren Versionen gehen Sie wie folgt vor:&lt;br /&gt;
    BEGIN;&lt;br /&gt;
    ALTER TABLE tabelle ADD COLUMN neue_spalte neuer_datentyp;&lt;br /&gt;
    UPDATE tabelle SET neue_spalte = CAST(alte_spalte AS neuer_datentyp);&lt;br /&gt;
    ALTER TABLE tabelle DROP COLUMN alte_spalte;&lt;br /&gt;
    COMMIT;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Speicherplatz freizugeben, der von der gelöschten Spalte&lt;br /&gt;
verwendet wurde, führen Sie VACUUM FULL aus.&lt;br /&gt;
&lt;br /&gt;
=== Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank? ===&lt;br /&gt;
  &lt;br /&gt;
Es bestehen folgende Obergrenzen:&lt;br /&gt;
 Maximale Größe eine Datenbank?           unbeschränkt (es existieren&lt;br /&gt;
                                            Datenbanken mit 32 TB)&lt;br /&gt;
 Maximale Größe einer Tabelle?            32 TB&lt;br /&gt;
 Maximale Größe einer Zeile?              400 GB&lt;br /&gt;
 Maximale Größe einer Spalte?             1 GB&lt;br /&gt;
 Maximale Anzahl von Zeilen in einer Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
 Maximale Anzahl von Spalten in einer Tabelle?&lt;br /&gt;
                                          250-1600 je nach Spaltentyp&lt;br /&gt;
 Maximale Anzahl von Indexen für eine Tabelle?&lt;br /&gt;
                                          unbeschränkt&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich sind dies theoretische Werte, die oft durch die&lt;br /&gt;
verfügbaren Platten- und Speicherressourcen beschränkt werden. Extreme&lt;br /&gt;
Größen können zu Leistungseinbußen führen.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße von 32 TB benötigt keine&lt;br /&gt;
Large-File-Unterstützung im Betriebssystem. Große Tabellen werden in&lt;br /&gt;
Dateien mit einer Größe von je 1 GB aufgeteilt, wodurch etwaige&lt;br /&gt;
dateisystem-bedingte Beschränkungen nicht relevant sind.&lt;br /&gt;
&lt;br /&gt;
Die maximale Tabellengröße und die maximale Anzahl von Spalten können&lt;br /&gt;
vervierfacht werden, indem man die Default-Blockgröße auf 32 KB&lt;br /&gt;
heraufsetzt. Die Tabellengröße kann auch durch Tabellenpartitionierung&lt;br /&gt;
vergrößert werden.&lt;br /&gt;
&lt;br /&gt;
Eine Einschränkung ist, dass Indexe nur auf Spalten erstellt werden&lt;br /&gt;
können, die bis etwa 2.000 Zeichen groß sind. Um auf größere Spalten&lt;br /&gt;
eine UNIQUE-Constraint setzen zu können, nutzen Sie einen funktionalen&lt;br /&gt;
Index mit dem MD5-Hash-Wert der Spalte. Um innerhalb einer großen, mit&lt;br /&gt;
Text belegten Spalte suchen zu können, verwenden Sie einen&lt;br /&gt;
Volltext-Index.&lt;br /&gt;
&lt;br /&gt;
=== Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen Textdatei abzuspeichern? ===&lt;br /&gt;
  &lt;br /&gt;
Eine PostgreSQL-Datenbank kann beim Abspeichern einer einfachen&lt;br /&gt;
Textdatei bis zu fünfmal mehr Platz gegenüber der eigentlichen Größe&lt;br /&gt;
der Datei beanspruchen.&lt;br /&gt;
&lt;br /&gt;
Betrachten wir eine Datei mit 100.000 Zeilen mit einem Integer und&lt;br /&gt;
einer Textbeschreibung pro Zeile. Gehen wir davon aus, dass die&lt;br /&gt;
durchschnittliche Länge der Textbeschreibung 20 Byte beträgt. Die&lt;br /&gt;
einfache Datei würde 2,8 MB groß sein. Die Größe der&lt;br /&gt;
PostgreSQL-Datenbankdatei, die diese Daten enthält, liegt ungefähr bei&lt;br /&gt;
5,2 MB:&lt;br /&gt;
 24 Bytes: jeder Zeilenkopf (ungefähr)&lt;br /&gt;
+24 Bytes: ein Integer-Feld und ein Textfeld&lt;br /&gt;
+ 4 Bytes: Zeiger auf der Datenseite auf den Tupel&lt;br /&gt;
-----------------------------------------------&lt;br /&gt;
 52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
Die Größe einer Datenseite in PostgreSQL beträgt 8192 Bytes (8 KB),&lt;br /&gt;
also:&lt;br /&gt;
8192 Bytes pro Seite&lt;br /&gt;
---------------------   =  146 Zeilen pro Seite (abgerundet)&lt;br /&gt;
  52 Bytes pro Zeile&lt;br /&gt;
&lt;br /&gt;
100.000 Datenzeilen&lt;br /&gt;
------------------------  =  685 Datenbankseiten (aufgerundet)&lt;br /&gt;
    158 Zeilen pro Seite&lt;br /&gt;
&lt;br /&gt;
633 Datenbankseiten * 8192 Bytes pro Seite  =  5,185,536 bytes (5,2 MB)&lt;br /&gt;
&lt;br /&gt;
Indexe beanspruchen nicht so viel Platz. Da sie jedoch die Daten&lt;br /&gt;
beinhalten, die sie indizieren, können auch sie sehr groß werden.&lt;br /&gt;
&lt;br /&gt;
NULL-Werte werden als Bitmaps gespeichert, wodurch sie sehr wenig&lt;br /&gt;
Platz in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
=== Meine Abfragen sind langsam oder benutzen die Indexe nicht. Warum? ===&lt;br /&gt;
  &lt;br /&gt;
Indexe werden nicht automatisch bei jeder Abfrage verwendet. Indexe&lt;br /&gt;
werden nur dann verwendet, wenn die abzufragende Tabelle eine&lt;br /&gt;
bestimmte Größe übersteigt, und die Abfrage nur eine kleine&lt;br /&gt;
Prozentzahl der Tabellenzeilen abfragt. Der Grund hierfür ist der,&lt;br /&gt;
dass die durch einen Index verursachten Festplattenzugriffe manchmal&lt;br /&gt;
länger dauern würden als ein einfaches Auslesen aller Tabellenzeilen&lt;br /&gt;
(sequentieller Scan).&lt;br /&gt;
&lt;br /&gt;
Um festzustellen, ob ein Index verwendet werden soll, braucht&lt;br /&gt;
PostgreSQL Statistiken über die Tabelle. Diese Statistiken werden&lt;br /&gt;
durch die Anweisungen VACUUM ANALYZE bzw. ANALYZE berechnet. Anhand&lt;br /&gt;
der Statistiken kennt der Abfragenoptimierer die Anzahl der&lt;br /&gt;
Tabellenzeilen und kann besser entscheiden, ob Indexe verwendet werden&lt;br /&gt;
sollen. Statistiken sind auch bei der Ermittlung der optimalen&lt;br /&gt;
JOIN-Reihenfolgen und -Methoden wertvoll. Daher sollten diese&lt;br /&gt;
regelmässig durchgeführt werden, da sich der Inhalt einer Tabelle ja&lt;br /&gt;
auch verändert.&lt;br /&gt;
&lt;br /&gt;
Indexe werden normalerweise nicht in ORDER BY-Abfrage oder in JOINs&lt;br /&gt;
verwendet. Ein sequentieller Scan mit anschließendem explizitem&lt;br /&gt;
Sortiervorgang ist normalerweise schneller als ein Index-Scan einer&lt;br /&gt;
großen Tabelle. Jedoch wird bei einer Abfrage, in der LIMIT zusammen&lt;br /&gt;
mit ORDER BY verwendet wird, oftmals ein Index verwendet, da nur ein&lt;br /&gt;
kleiner Abschnitt der Tabelle zurückgeliefert wird.&lt;br /&gt;
&lt;br /&gt;
Sollte es danach aussehen, also ob der Optimierer irrtümlich einen&lt;br /&gt;
sequentiellen Scan ausführt, führen Sie SET enable_seqscan TO 'off'&lt;br /&gt;
aus und prüfen Sie, ob die Indexabfrage dadurch scheller geworden ist.&lt;br /&gt;
&lt;br /&gt;
Bei der Nutzung von Wildcard-Operatoren wie LIKE oder ~, können Indexe&lt;br /&gt;
nur unter bestimmten Umständen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
* Das Suchmuster muss sich an Anfang des Strings befinden, d.h.:&lt;br /&gt;
** LIKE-Suchmuster dürfen nicht mit % anfangen;&lt;br /&gt;
** ~ (reguläre Ausdrücke) müssen mit ^ anfangen.&lt;br /&gt;
* Das Suchmuster darf nicht mit einer Zeichenklasse (z.B. [a-e]) beginnen.&lt;br /&gt;
* Suchmuster, die Gross- und Kleinschreibung nicht berücksichtigen (z.B. ILIKE bzw. ~*), verwenden keine Indexe. Stattdessen können funktionale Indexe verwendet werden, die im Punkt 4.8 beschrieben werden.&lt;br /&gt;
* Die Standard-Locale &amp;quot;C&amp;quot; muss während der Datenbank-Initialisierung mit initdb verwendet worden sein, da andere locales den nächstgrößten Wert nicht ermitteln können. Es ist allerdings möglich, einen besonderen text_pattern_ops-Index für solche Fälle zu erstellen.&lt;br /&gt;
    &lt;br /&gt;
In Versionen vor 8.0 werden Indexe oft nicht benutzt, wenn die&lt;br /&gt;
jeweiligen Datentypen nicht genau übereinstimmen. Dies gilt besonders&lt;br /&gt;
für Indexe auf Spalten mit den Datentypen INT2, INT8 und NUMERIC&lt;br /&gt;
&lt;br /&gt;
=== Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine Abfrage auswertet? ===&lt;br /&gt;
  &lt;br /&gt;
Eine ausführliche Erklärung zu diesem Thema findet sich in der [http://www.postgresql.org/docs/current/static/sql-explain.html EXPLAIN] Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Wie änder ich das Sortierverhalten von textähnlichen Daten? ===&lt;br /&gt;
PostgreSQL sortiert Daten anhand dem bei initdb gesetzten Locale. (Ab 8.4 wird es es möglich sein pro Datenbank ein eigenes Locale zu definieren)&lt;br /&gt;
&lt;br /&gt;
Entspricht das Sortierverhalten nicht dem gewünschten muss man die Locale ändern. Die meisten Locales, außer &amp;quot;C&amp;quot;, sortieren anhand der Reihenfolge des entsprechenden Wörterbuches. Das Locale &amp;quot;C&amp;quot; ignoriert jegliche Punktuation und Zwischenraum.&lt;br /&gt;
&lt;br /&gt;
=== Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei einer Suche, bei der Groß- und Kleinschreibweisen ignoriert werden? Wie verwende ich einen Index bei solchen Suchabfragen? ===&lt;br /&gt;
  &lt;br /&gt;
Der Operator ~ wendet einen regulären Ausdruck an und ~* wendet ihn&lt;br /&gt;
an, ohne die Groß- und Kleinschreibung zu beachten. Ebenso beachtet&lt;br /&gt;
LIKE die Groß- und Kleinschreibung, und ILIKE nicht.&lt;br /&gt;
&lt;br /&gt;
Gleichheitsvergleiche, die Groß- und Kleinschreibung ignorieren,&lt;br /&gt;
werden in der Regel so ausgedruckt:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle&lt;br /&gt;
    WHERE LOWER(spalte) = 'abc'&lt;br /&gt;
&lt;br /&gt;
Hier wird kein normaler Index benutzt. Legt man hingegen einen&lt;br /&gt;
funktionalen Index an, so wird er auf jeden Fall verwendet:&lt;br /&gt;
   CREATE INDEX tabelle_index ON tabelle (LOWER(spalte))&lt;br /&gt;
&lt;br /&gt;
Falls der obige Index als einen UNIQUE-Index angelegt wird, können&lt;br /&gt;
keine Werte in die Spalte eingefügt werden, die sich nur durch ihre&lt;br /&gt;
Groß- und Kleinschreibung unterscheiden. Um Fehler zu vermeiden muß&lt;br /&gt;
ein CHECK-Constraint oder ein Trigger eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist? Kann nach der NULL-Belegung sortiert werden? ===&lt;br /&gt;
  &lt;br /&gt;
Testen Sie die Spalte mit IS NULL bzw. IS NOT NULL.&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   WHERE &lt;br /&gt;
      spalte IS NULL&lt;br /&gt;
&lt;br /&gt;
Beim konkatenieren mit einen NULL-Wert wir das Ergebnis auch NULL. Um dies zu verhindern verwenden Sie am besten [http://www.postgresql.org/docs/current/static/functions-conditional.html| COALESCE()]&lt;br /&gt;
   SELECT &lt;br /&gt;
      COALESCE(col1, '') || COALESCE(col2, '')&lt;br /&gt;
   FROM tab;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um die Spalte danach zu sortieren, ob sie mit NULL belegt ist oder nicht, verwenden Sie die Bedingungen IS NULL bzw. IS NOT NULL in der ORDER BY-Klausel. Da Bedingungen, die wahr sind, höher als das Gegenteil sortiert werden, bewirkt die folgende Abfrage, dass die NULL-Spalten zuerst gelistet werden:&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tabelle&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      (spalte IS NOT NULL)&lt;br /&gt;
&lt;br /&gt;
Ab PostreSQL 8.3 und höher, ist es möglich das standardisierte NULLS FIRST/NULLS LAST zu verwenden um die Position der NULL-Werte im Ergebnis zu bestimmen. (bei FIRST stehen diese zu erst, bei LAST am Ende)&lt;br /&gt;
   SELECT &lt;br /&gt;
      *&lt;br /&gt;
   FROM &lt;br /&gt;
      tab&lt;br /&gt;
   ORDER BY &lt;br /&gt;
      col NULLS FIRST;&lt;br /&gt;
&lt;br /&gt;
=== Was ist der Unterschied zwischen den verschiedenen CHAR-Typen? ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Typ&lt;br /&gt;
!interner Name&lt;br /&gt;
!Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
|VARCHAR(n) &lt;br /&gt;
|varchar&lt;br /&gt;
|die Größe legt die Maximallänge fest; kein Auffüllen mit Leerzeichen&lt;br /&gt;
|-  &lt;br /&gt;
|CHAR(n)&lt;br /&gt;
|bpchar&lt;br /&gt;
|mit Leerzeichen gefüllt bis zur angegebenen Länge&lt;br /&gt;
|-&lt;br /&gt;
|TEXT&lt;br /&gt;
|text&lt;br /&gt;
|keine obere Grenze für die Länge&lt;br /&gt;
|-&lt;br /&gt;
|BYTEA&lt;br /&gt;
|bytea&lt;br /&gt;
|Bytearray mit variabler Länge (auch für '\0'-Bytes geeignet)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;char&amp;quot; (with the quotes)&lt;br /&gt;
|char&lt;br /&gt;
|ein Zeichen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der interne Name kommt vor allem in den Systemkatalogen und in manchen&lt;br /&gt;
Fehlermeldungen vor.&lt;br /&gt;
&lt;br /&gt;
Die ersten vier Typen sind &amp;quot;varlena&amp;quot;-Typen (d.h. die ersten vier Bytes&lt;br /&gt;
geben die Länge an, gefolgt von den Daten). Daher ist der tatsächlich&lt;br /&gt;
belegte Platz immer etwas mehr als die deklarierte Feldgröße.&lt;br /&gt;
Allerdings wird unter Umständen auf diese Datentypen Datenkompression&lt;br /&gt;
durch das TOAST- Verfahren angewendet, womit der tatsächlich belegte&lt;br /&gt;
Platz auch geringer als erwartet ausfallen kann.&lt;br /&gt;
&lt;br /&gt;
Für die Speicherung von Zeichenketten variabler Länge empfiehlt sich&lt;br /&gt;
VARCHAR(n). Die maximale Länge eines VARCHAR(n)-Felds wird bei der&lt;br /&gt;
Tabellendefinition festgelegt. TEXT setzt keine Längengrenze,&lt;br /&gt;
allerdings gibt es eine systembedingte Obergrenze von 1 GB.&lt;br /&gt;
&lt;br /&gt;
CHAR(n) ist geeignet für die Speicherung von Zeichenketten, die alle&lt;br /&gt;
die gleiche Länge haben. Bitte beachten Sie, dass CHAR(n) automatisch&lt;br /&gt;
Zeichenketten bis zur definierten Feldlänge mit Leerzeichen ausfüllt,&lt;br /&gt;
während bei VARCHAR(n) nur die tatsächlich eingegebene Zeichenkette&lt;br /&gt;
gespeichert wird.&lt;br /&gt;
&lt;br /&gt;
BYTEA ist für binäre Daten, besonders für Werte, die NULL-Bytes haben.&lt;br /&gt;
&lt;br /&gt;
Alle der hier erwähnten Typen weisen ähnliche Performanzeigenschaften&lt;br /&gt;
auf.&lt;br /&gt;
&lt;br /&gt;
=== Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Wert? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL bietet einen SERIAL-Datentyp. Dies ist zwar kein richtiger Datentyp. Es ist die Kurzform für das Erstellen einer Spalte vom Typ Integer, die von einer Sequenz befüllt wird. &lt;br /&gt;
&lt;br /&gt;
Zum Beispiel:&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
       id   SERIAL,&lt;br /&gt;
       name TEXT&lt;br /&gt;
   )&lt;br /&gt;
&lt;br /&gt;
wird automatisch in:&lt;br /&gt;
   CREATE SEQUENCE person_id_seq;&lt;br /&gt;
   CREATE TABLE person (&lt;br /&gt;
     id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),&lt;br /&gt;
     name TEXT&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Die automatisch generierte Sequenz besitzt immer folgenden Namen:&lt;br /&gt;
''tabellederspalte''-''namederspalte''_seq&lt;br /&gt;
&lt;br /&gt;
Die Man-Page zu CREATE SEQUENCE beinhaltet mehr Informationen zu Sequenzen.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einen Typ BIGSERIAL, dieser unterscheidet sich aber nur darin dass die Spalte den Typ BIGINTEGER bekommt. BIGSERIAL sollte verwendet werden wenn es zu erwarten ist, dass mehr als 2 Milliarden Sequenz-Werte verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Wie bekomme ich den Wert einer SERIAL-Sequenz? ===&lt;br /&gt;
  &lt;br /&gt;
Eine Möglichkeit wäre, mit der nextval()-Funktion den nächsten SERIAL-Wert von dem Sequenzobjekt vor der Auszuführung einer INSERT-Anweisung anzufordern und ihn dann explizit in die INSERT-Anweisung einzubinden. Anhand der Beispieltabelle in 4.11.1 könnte dieser Vorgang in einer Pseudosprache so aussehen:&lt;br /&gt;
&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT nextval('person_id_seq')&amp;quot;);&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Danach stünde der neue Wert in der Variablen new_id für die Verwendung in weiteren Abfragen zur Verfügung, zum Beispiel als Fremdschlüssel zur Tabelle 'person'). Bitte beachten Sie, dass der Name des automatisch erstellten SEQUENCE-Objektes folgenden Name hat: «table»_«serialcolumn»_seq wobei 'table' und 'serialcolumn' die Namen&lt;br /&gt;
der jeweils betreffenden Tabelle / Spalte darstellen.&lt;br /&gt;
&lt;br /&gt;
Als weitere Möglichkeit können Sie nach einer INSERT-Anweisung den automatisch eingefügten SERIAL-Wert mit der currval()-Funktion zurückgeben lassen:&lt;br /&gt;
&lt;br /&gt;
 execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);&lt;br /&gt;
 new_id = output of execute(&amp;quot;SELECT currval('person_id_seq')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Die einfachste Möglichkeit ist es RETURNING zu verwenden. Ein einfaches Beispiel sähe so aus:&lt;br /&gt;
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;&lt;br /&gt;
&lt;br /&gt;
=== Führt currval() zu einer Race-Condition mit anderen Nutzern? ===&lt;br /&gt;
  &lt;br /&gt;
Nein. currval() liefert einen Wert zurück, der von Ihrer&lt;br /&gt;
Datenbank-Session bestimmt wird, und der anderen Sessionen nicht zur&lt;br /&gt;
Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner Sequenz-/SERIAL-Spalte? ===&lt;br /&gt;
  &lt;br /&gt;
Um die gleichzeitige Abarbeitung von Transaktionen zu verbessern,&lt;br /&gt;
werden Sequenzen gerade nicht für andere Transaktionen gesperrt,&lt;br /&gt;
sondern die Sequenznummern werden den laufenden Transaktionen sofort&lt;br /&gt;
zugeteilt. Lücken in der Sequenznummerierung werden durch abgebrochene&lt;br /&gt;
Transaktionen verursacht.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein OID? ===&lt;br /&gt;
  &lt;br /&gt;
Jede Zeile, die in PostgreSQL erzeugt wird, bekommt eine eindeutige OID, sofern die Tabelle nicht mit der Option WITHOUT OIDS angelegt wurde. OIDs sind automatisch zugewiesene 4-Byte-Integer, die innerhalb der gesamten Datenbank einmalig sind. Allerdings laufen sie bei einem Wert von ungefähr 4 Milliarden über. PostgreSQL verwendet OIDs, um&lt;br /&gt;
seine interne Systemtabellen zu verbinden.&lt;br /&gt;
&lt;br /&gt;
Um einmalige Idenfikatoren in Datentabellen zu erstellen, wird allerdings empfohlen, statt OIDs Werte zu verwenden, die von SERIAL-Sequenzen erzeugt werden. SERIAL-Sequenzen sind innerhalb einer Tabelle einmalig und daher weniger anfällig für Überläufe. Außerdem können 8-Byte-Sequenzwerte mit BIGSERIAL (SERIAL8) erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
=== Was ist ein CTID? ===&lt;br /&gt;
&lt;br /&gt;
CTIDs werden benutzt, um bestimmte physikalische Zeilen durch Block und Offset Werte zu identifizieren. CTIDs verändern sich, sobald Zeilen verändert oder zurückgeladen werden. Sie werden in Indexeinträgen benutzt um auf die physikalischen Zeilen zu zeigen.&lt;br /&gt;
&lt;br /&gt;
=== Wieso bekomme ich einen Fehler: &amp;quot;ERROR: Memory exhausted in AllocSetAlloc()&amp;quot;? ===&lt;br /&gt;
  &lt;br /&gt;
Wahrscheinlich gibt es keinen virtuellen Speicher mehr in Ihrem System&lt;br /&gt;
oder Ihr Kernel hat niedrige Höchstgrenzen für bestimmte Ressourcen.&lt;br /&gt;
Probieren Sie vor dem Start von postmaster folgendes:&lt;br /&gt;
   ulimit -d 262144&lt;br /&gt;
   limit datasize 256m&lt;br /&gt;
&lt;br /&gt;
Je nach benutzter Shell wird nur einer dieser Befehle erfolgreich&lt;br /&gt;
ausgeführt werden. Auf jedem Fall wird die Grenze des Datensegments&lt;br /&gt;
für Prozesse erhöht werden und eventuell die erfolgreiche Ausführung&lt;br /&gt;
der Abfrage ermöglichen. Falls Sie ein Problem mit dem SQL-Client&lt;br /&gt;
haben, weil das Backend zu viele Daten zurückliefert, versuchen Sie&lt;br /&gt;
dies vor dem Start des SQL-Clients.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft? ===&lt;br /&gt;
  &lt;br /&gt;
Geben Sie in psql SELECT VERSION(); ein.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich eine Spalte erstellen, deren Default-Wert immer die aktuelle Uhrzeit enthalten soll? ===&lt;br /&gt;
  &lt;br /&gt;
Dazu verwenden Sie CURRENT_TIMESTAMP:&lt;br /&gt;
   CREATE TABLE test (x INT, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );&lt;br /&gt;
&lt;br /&gt;
=== Wie führe ich eine OUTER JOIN durch? ===&lt;br /&gt;
  &lt;br /&gt;
PostgreSQL unterstützt OUTER JOINs nach dem SQL- Standardsyntax. Hier&lt;br /&gt;
zwei Beispiele:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 ON (t1.spalte = t2.spalte)&lt;br /&gt;
&lt;br /&gt;
bzw.:&lt;br /&gt;
   SELECT *&lt;br /&gt;
     FROM tabelle_1 t1&lt;br /&gt;
          LEFT OUTER JOIN tabelle_2 t2 USING (spalte)&lt;br /&gt;
&lt;br /&gt;
Diese identischen Abfragen verknüpfen tabelle_1 mit tabelle_2 über die&lt;br /&gt;
Spalte 'spalte' und geben außerdem alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_1 (diejenigen, die keine Entsprechung in tabelle_2 haben)&lt;br /&gt;
zurück. Ein RIGHT JOIN würde hingegen alle unverknüpften Zeilen in&lt;br /&gt;
tabelle_2 hinzufügen und ein FULL JOIN würde alle verknüpften Zeilen&lt;br /&gt;
sowie jeweils alle unverknüpften Zeilen aus den beiden Tabellen&lt;br /&gt;
zurückliefern. Die Angabe von OUTER ist nicht zwingend und kann in&lt;br /&gt;
LEFT, RIGHT und FULL-Verknüpfungen weggelassen werden. Normale&lt;br /&gt;
Verknüpfungen sind INNER JOINs.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen? ===&lt;br /&gt;
  &lt;br /&gt;
Es gibt keinen Weg, innerhalb einer Abfrage auf mehr als eine&lt;br /&gt;
Datenbank zuzugreifen. Da PostgreSQL datenbank-spezifische&lt;br /&gt;
Systemkataloge lädt, ist eine datenbankübergreifende Abfrage nicht&lt;br /&gt;
möglich.&lt;br /&gt;
&lt;br /&gt;
contrib/dblink ist eine Erweiterung, die datenbankübergreifende&lt;br /&gt;
Abfragen über Funktionsaufrufe ermöglicht.&lt;br /&gt;
&lt;br /&gt;
=== Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion zurückgeben lassen? ===&lt;br /&gt;
  &lt;br /&gt;
Funktionen können mehrere Zeilen und Spalten zurückgeben, vgl.:&lt;br /&gt;
http://www.postgresql.org/docs/techdocs.17.&lt;br /&gt;
&lt;br /&gt;
=== Warum bekomme ich eine Fehlermeldung wie &amp;quot;relation with OID ##### does not exist&amp;quot; wenn ich temporäre Tabellen in PL/PgSQL-Funktionen benutze? ===&lt;br /&gt;
  &lt;br /&gt;
In PostgreSQL-Versionen vor 8.3 verarbeitet PL/PgSQL Funktionen in&lt;br /&gt;
einer Cache. Dies hat eine unangenehme Nebenwirkung, nämlich dass wenn&lt;br /&gt;
eine PL/PgSQL-Funktion auf eine temporäre Tabelle zugreift, und diese&lt;br /&gt;
Tabelle anschließend gelöscht bzw. neu erstellt wird, die Funktion&lt;br /&gt;
fehlschlagen wird, da die gecachten Funktionsinhalte noch auf die alte&lt;br /&gt;
temporäre Tabelle zeigen. Die Lösung für diese Probleme besteht darin,&lt;br /&gt;
in der PL/PgSQL- Funktion mittels EXECUTE auf temporäre Tabellen&lt;br /&gt;
zuzugreifen. Dies bewirkt, dass bei jedem Funktionsruf die betreffende&lt;br /&gt;
Abfrage neu geparst wird.&lt;br /&gt;
&lt;br /&gt;
Dieses Problem taucht in PostgreSQL 8.3 und späteren Versionen nicht&lt;br /&gt;
mehr auf.&lt;br /&gt;
&lt;br /&gt;
=== Welche Replikationslösungen gibt es? ===&lt;br /&gt;
  &lt;br /&gt;
Der Begriff &amp;quot;replikation&amp;quot; umfasst mehrere verschiedene Technologien,&lt;br /&gt;
jede mit eigenen Vor- und Nachteilen. [http://www.postgresql.org/docs/8.3/static/high-availability.html| Die Dokumentation enthält eine gute Einführung in das Thema Replikation]&lt;br /&gt;
&lt;br /&gt;
Mit &amp;quot;Master/slave&amp;quot;-Replikation werden Änderungen in einer&lt;br /&gt;
Hauptdatenbank durchgeführt und an &amp;quot;Sklaven&amp;quot; verteilt, die im&lt;br /&gt;
Nur-Lese-Modus arbeiten. Die populärste Lösung für PostgreSQL ist&lt;br /&gt;
Slony-I.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Multi-master replication&amp;quot; ermöglicht sowohl lesende als auch&lt;br /&gt;
schreibende Zugriffe über mehrere Datenbank-Server hinweg. Allerdings&lt;br /&gt;
hat diese Art von Replikation eine negative Auswirkung auf die&lt;br /&gt;
Performanz durch die Notwendigkeit, Änderungen zwischen Servern zu&lt;br /&gt;
synchronisieren. Pgcluster ist die populärste freie Lösung für&lt;br /&gt;
PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch einige kommerzielle und hardware-basierte&lt;br /&gt;
Replikationslösungen für verschiedene Arten der Replikation.&lt;br /&gt;
&lt;br /&gt;
=== Warum werden die Tabellen- und Spaltennamen in meiner Abfrage nicht erkannt? Warum werden Großbuchstaben umgewandelt? ===&lt;br /&gt;
  &lt;br /&gt;
Die häufigste Ursache ist die Verwendung von Gänsefüßchen bei der&lt;br /&gt;
Anlegung von Tabellen, z.B.:&lt;br /&gt;
    CREATE TABLE &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
                (&amp;quot;SPALTE1&amp;quot; INT)&lt;br /&gt;
&lt;br /&gt;
Dadurch werden Tabellen- und Spaltennamen (sog. Identifikatoren) in&lt;br /&gt;
genau der Schreibweise gespeichert (vgl. Dokumentation), was dazu&lt;br /&gt;
führt, dass man sie danach immer in Gänsefüßchen angeben muss. Im&lt;br /&gt;
obigen Beispiel muss man also immer etwa SELECT * FROM &amp;quot;Tabelle&amp;quot;&lt;br /&gt;
verwenden. Um dieses Problem zu vermeiden, müssen Sie immer eines der&lt;br /&gt;
folgenden Punkte beachten:&lt;br /&gt;
&lt;br /&gt;
* bei der Tabellenanlegung keine Gänsefüßchen verwenden;&lt;br /&gt;
* in Identifikatoren nur Kleinschreibung verwenden;&lt;br /&gt;
* immer Identifikatoren mit Gänsefüßchen versehen&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen des Übersetzers ==&lt;br /&gt;
  &lt;br /&gt;
Die englische Vorlage dieser FAQ wird ständig überarbeitet. Daher&lt;br /&gt;
liegt die Übersetzung nicht immer auf dem aktuellsten Stand.&lt;br /&gt;
&lt;br /&gt;
Die aktuellste Version der deutschen Übersetzung befindet sich immer&lt;br /&gt;
unter http://sql-info.de/de/postgresql/FAQ_german.html. Diese&lt;br /&gt;
&amp;quot;Arbeitsversion&amp;quot; enthält eventuell Änderungen, die noch nicht auf der&lt;br /&gt;
PostgreSQL-Website eingebunden worden sind.&lt;br /&gt;
&lt;br /&gt;
Über Verbesserungshinweise und Korrekturvorschläge sowie&lt;br /&gt;
Verständnisfragen zum Inhalt der FAQ freue ich mich. Ich nehme auch&lt;br /&gt;
allgemeine Fragen zu PostgreSQL gerne entgegen, verweise jedoch auf&lt;br /&gt;
die Mailing-Listen als schnelle und zuverlässige Anlaufstellen.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PostgreSQL_Conference_Europe_Talks_2011</id>
		<title>PostgreSQL Conference Europe Talks 2011</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PostgreSQL_Conference_Europe_Talks_2011"/>
				<updated>2011-10-19T16:18:35Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;add datacenter slide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= PostgreSQL Conference Europe 2011 Talks =&lt;br /&gt;
&lt;br /&gt;
== Talks: Wednesday 18th October, 2011 ==&lt;br /&gt;
&lt;br /&gt;
=== Ams 1 ===&lt;br /&gt;
* [[Media:Mohan_PGCon_Keynote_10-19-2011.pdf|Ram Mohan Keynote: Afilias Winning Bet on Open Source]]&lt;br /&gt;
* [http://www.oslandia.com/files/1646fd60f9b0a4558d1e256cf3264572/pgconfeu2011_vincent_picavet_postgis.pdf Vincent Picavet - Geo in your database : Postgis]&lt;br /&gt;
* [http://pgeu-plv8.herokuapp.com Will Leinweber: heralding the death of nosql]&lt;br /&gt;
&lt;br /&gt;
=== Ams 2 ===&lt;br /&gt;
&lt;br /&gt;
* [http://ora2pg.darold.net/ora2pg-best-practices.pdf Gilles Darold: Best practices with Ora2Pg]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ams 3 ===&lt;br /&gt;
&lt;br /&gt;
* [[Media:Ciolli-window-2011.pdf|Gianni Ciolli, Look Out The Window Functions (and free your SQL)]]&lt;br /&gt;
plus four 2D heat diffusion movies, with different starting scenarios: [[http://vimeo.com/30797130 a hot point]],&lt;br /&gt;
[[http://vimeo.com/30797509 a hot segment]],&lt;br /&gt;
[[http://vimeo.com/30797715 a hot square]] and&lt;br /&gt;
[[http://vimeo.com/30797797 a cold square]].&lt;br /&gt;
* [[Media:Smartgrid_for_the_datacenter_web.pdf|Stefan Kaltenbrunner, A smartgrid for the datacenter]]&lt;br /&gt;
&lt;br /&gt;
== Talks: Thursday 19th October, 2011 ==&lt;br /&gt;
&lt;br /&gt;
=== Ams 1 ===&lt;br /&gt;
&lt;br /&gt;
=== Ams 2 ===&lt;br /&gt;
&lt;br /&gt;
=== Ams 3 ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Talks: Friday 20th October, 2011 ==&lt;br /&gt;
&lt;br /&gt;
=== Ams 1 ===&lt;br /&gt;
&lt;br /&gt;
=== Ams 2 ===&lt;br /&gt;
&lt;br /&gt;
=== Ams 3 ===&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/File:Smartgrid_for_the_datacenter_web.pdf</id>
		<title>File:Smartgrid for the datacenter web.pdf</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/File:Smartgrid_for_the_datacenter_web.pdf"/>
				<updated>2011-10-19T16:16:45Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;A smartgrid for the datacenter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A smartgrid for the datacenter&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PostgreSQL_Release_Support_Policy</id>
		<title>PostgreSQL Release Support Policy</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PostgreSQL_Release_Support_Policy"/>
				<updated>2011-10-01T19:39:09Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;mark the whole rows in italics for EOL'd releases to make the table a bit more readable&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The PostgreSQL project aims to fully support a major release for '''five years''', under the terms of the [http://www.postgresql.org/support/versioning Versioning policy]&lt;br /&gt;
&lt;br /&gt;
After a release falls out of full support, we may (at our committers' discretion) continue to apply further critical fixes to the source code, on a best-effort basis.  No formal releases or binary packages will be produced by the project, but the updated source code will be available from our source code control system.&lt;br /&gt;
&lt;br /&gt;
This policy will be followed on a best-effort basis. In extreme cases it may not be possible to support a release for the planned lifetime; for example if a serious bug is found that cannot be resolved in a given major version without significant risk to the stability of the code or loss of application compatibility. In such cases, early retirement of a major version may be required.&lt;br /&gt;
&lt;br /&gt;
The first version update released after the EOL date will normally be the final one for that version.  Note that this can extend support shortly past the listed date.  For example, [http://www.postgresql.org/docs/7.4/static/release.html 7.4.30] and [http://www.postgresql.org/docs/8.0/static/release.html 8.0.26] were the EOL releases for those two versions.  They were originally targeted for EOL as of July 2010, but those final versions were not actually released until October 2010.&lt;br /&gt;
&lt;br /&gt;
=== End Of Life (EOL) dates ===&lt;br /&gt;
&lt;br /&gt;
Releases which have already reached an EOL release are italicized:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Version&lt;br /&gt;
!EOL Date&lt;br /&gt;
!Release Date&lt;br /&gt;
|-&lt;br /&gt;
|''PostgreSQL 7.4''&lt;br /&gt;
|''October 2010 (extended)''&lt;br /&gt;
|''November 2003''&lt;br /&gt;
|-&lt;br /&gt;
|''PostgreSQL 8.0''&lt;br /&gt;
|''October 2010 (extended)''&lt;br /&gt;
|''January 2005''&lt;br /&gt;
|-&lt;br /&gt;
|''PostgreSQL 8.1''&lt;br /&gt;
|''November 2010''&lt;br /&gt;
|''November 2005''&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL 8.2&lt;br /&gt;
|December 2011&lt;br /&gt;
|December 2006&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL 8.3&lt;br /&gt;
|February 2013&lt;br /&gt;
|February 2008&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL 8.4&lt;br /&gt;
|July 2014&lt;br /&gt;
|July 2009&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL 9.0&lt;br /&gt;
|September 2015&lt;br /&gt;
|September 2010&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL 9.1&lt;br /&gt;
|September 2016&lt;br /&gt;
|September 2011&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PostgreSQL_Release_Support_Policy</id>
		<title>PostgreSQL Release Support Policy</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PostgreSQL_Release_Support_Policy"/>
				<updated>2011-10-01T19:19:51Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;add 9.1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The PostgreSQL project aims to fully support a major release for '''five years''', under the terms of the [http://www.postgresql.org/support/versioning Versioning policy]&lt;br /&gt;
&lt;br /&gt;
After a release falls out of full support, we may (at our committers' discretion) continue to apply further critical fixes to the source code, on a best-effort basis.  No formal releases or binary packages will be produced by the project, but the updated source code will be available from our source code control system.&lt;br /&gt;
&lt;br /&gt;
This policy will be followed on a best-effort basis. In extreme cases it may not be possible to support a release for the planned lifetime; for example if a serious bug is found that cannot be resolved in a given major version without significant risk to the stability of the code or loss of application compatibility. In such cases, early retirement of a major version may be required.&lt;br /&gt;
&lt;br /&gt;
The first version update released after the EOL date will normally be the final one for that version.  Note that this can extend support shortly past the listed date.  For example, [http://www.postgresql.org/docs/7.4/static/release.html 7.4.30] and [http://www.postgresql.org/docs/8.0/static/release.html 8.0.26] were the EOL releases for those two versions.  They were originally targeted for EOL as of July 2010, but those final versions were not actually released until October 2010.&lt;br /&gt;
&lt;br /&gt;
=== End Of Life (EOL) dates ===&lt;br /&gt;
&lt;br /&gt;
Releases which have already reached an EOL release are italicized:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Version&lt;br /&gt;
!EOL Date&lt;br /&gt;
!Release Date&lt;br /&gt;
|-&lt;br /&gt;
|''PostgreSQL 7.4''&lt;br /&gt;
|October 2010 (extended)&lt;br /&gt;
|November 2003&lt;br /&gt;
|-&lt;br /&gt;
|''PostgreSQL 8.0''&lt;br /&gt;
|October 2010 (extended)&lt;br /&gt;
|January 2005&lt;br /&gt;
|-&lt;br /&gt;
|''PostgreSQL 8.1''&lt;br /&gt;
|November 2010&lt;br /&gt;
|November 2005&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL 8.2&lt;br /&gt;
|December 2011&lt;br /&gt;
|December 2006&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL 8.3&lt;br /&gt;
|February 2013&lt;br /&gt;
|February 2008&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL 8.4&lt;br /&gt;
|July 2014&lt;br /&gt;
|July 2009&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL 9.0&lt;br /&gt;
|September 2015&lt;br /&gt;
|September 2010&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL 9.1&lt;br /&gt;
|September 2016&lt;br /&gt;
|September 2011&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Tracker:BugzillaTest</id>
		<title>Tracker:BugzillaTest</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Tracker:BugzillaTest"/>
				<updated>2011-05-29T18:04:06Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;remove dead link to trackerdemo installation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PgTracker Demo Installation ==&lt;br /&gt;
 &lt;br /&gt;
the old demo installation ran on a modified version of Bugzilla 3.0. It is had the following additional features over the stock version:&lt;br /&gt;
&lt;br /&gt;
* full integration with the main website community login feature&lt;br /&gt;
* better creation of bugs via the email interface&lt;br /&gt;
* integration with the main website bug reporting form via the XML-RPC interface&lt;br /&gt;
* modifications to the internal API for some operations (like being able to &amp;quot;impersonate&amp;quot; reporters over the XML-RPC interface to get correct attribution)&lt;br /&gt;
&lt;br /&gt;
=== basic concepts ===&lt;br /&gt;
&lt;br /&gt;
pgtracker is currently supposed to be a bug and issue tracker primarily for pgsql-bugs@. It does not intent to replace the mailinglist in any way but it is supposed to augment and support it.&lt;br /&gt;
To do that the main bug reporting form on the Website is now generating a Bug report using the XML-RPC interface(so that BZ can drive the generation of the bug id which needs to be unique). &lt;br /&gt;
&lt;br /&gt;
The resulting bug is either:&lt;br /&gt;
&lt;br /&gt;
* only made visible to people part of the &amp;quot;Tracker Team&amp;quot; in case it is a normal bug report&lt;br /&gt;
&lt;br /&gt;
* only made visible to people part of the &amp;quot;Security Team&amp;quot; in case it is reported as a security bug&lt;br /&gt;
&lt;br /&gt;
&amp;quot;visible&amp;quot; in this context means that the bug cannot be viewed by the public and needs to be verified by a member of the respective team. Those bugs are initially tagged as UNCONFIRMED which is a special state that will not cause any (email) notifications to be sent.&lt;br /&gt;
This scheme can support both bugs sent via the bug reporting form and bugs submitted by the native BZ interface.&lt;br /&gt;
Issues on pgsql-bugs@postgresql.org however tend to generate responses (both &amp;quot;this is not a bug&amp;quot; and &amp;quot;oh yeah this is a bug please try the following patch&amp;quot;) pretty quickly - to cope with that the bugzilla installation is subscribed to the mailinglist and will simply add each reply as a comment to the tracker entry.&lt;br /&gt;
&lt;br /&gt;
XXX: discuss handling of mails sent directly to the list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== email interface ===&lt;br /&gt;
&lt;br /&gt;
the bugzilla installation provides an email based interface that can be used or basic interaction with the tracker. The interface [http://www.bugzilla.org/docs/3.0/html/api/email_in.html#Modifying_an_Existing_Bug is documented here].&lt;br /&gt;
&lt;br /&gt;
this docs lack a bit of information on what fields one can manipulate through that interface so here are some examples:&lt;br /&gt;
&lt;br /&gt;
replying to a bugreport with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 @resolution = INVALID&lt;br /&gt;
 this is not a bug please look at the docs to find out why&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in the body of an email will result in the mentioned bug to get:&lt;br /&gt;
&lt;br /&gt;
* a status of &amp;quot;RESOLVED&amp;quot;&lt;br /&gt;
* a resolution of &amp;quot;INVALID&amp;quot;&lt;br /&gt;
* a comment of &amp;quot;this is not a bug please look at the docs to find out why&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(selected) list of available commands(all ned to be prefixed with an @ to be recognized by the email interface):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 bug_id -- bug identifer (needs to be either in the Subject in the form of &amp;quot;[Bug 1234]&amp;quot; or mentioned in the mail)&lt;br /&gt;
 short_desc -- sets/updates the summary text of the bug&lt;br /&gt;
 classification&lt;br /&gt;
 product -- name of the product (ie PostgreSQL)&lt;br /&gt;
 version -- PostgreSQL Version&lt;br /&gt;
 rep_platform&lt;br /&gt;
 op_sys -- Operating system&lt;br /&gt;
 bug_status -- Status of the bug (one of RESOLVED,ASSIGNED,REOPENED,CLOSED,VERIFIED)&lt;br /&gt;
 status_whiteboard&lt;br /&gt;
 keywords&lt;br /&gt;
 resolution -- sets the resolution of the bug (one of FIXED, INVALID, WORKSFORME, DUPLICATE, WONTFIX)&lt;br /&gt;
 bug_severity&lt;br /&gt;
 priority&lt;br /&gt;
 component -- component this bug can be attributed too&lt;br /&gt;
 assigned_to&lt;br /&gt;
 qa_contact&lt;br /&gt;
 cc&lt;br /&gt;
 dependson&lt;br /&gt;
 blocked&lt;br /&gt;
 longdesc&lt;br /&gt;
 content&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''WARNING: the current version of the email interface will only recognize commands if it is in the very first line of the email'''&lt;br /&gt;
&lt;br /&gt;
=== bug states ===&lt;br /&gt;
&lt;br /&gt;
general descriptions of the available bug states are available [http://trackerdemo.postgresql.org/page.cgi?id=fields.html#status here]&lt;br /&gt;
&lt;br /&gt;
* UNCONFIRMED (this state is only visible to members of the bug tracker team)&lt;br /&gt;
* NEW (this is the default state for all accepted bugs)&lt;br /&gt;
* ASSIGNED&lt;br /&gt;
* REOPENED&lt;br /&gt;
* VERIFIED&lt;br /&gt;
* CLOSED&lt;br /&gt;
&lt;br /&gt;
=== components ===&lt;br /&gt;
&lt;br /&gt;
* plperl&lt;br /&gt;
* plpgsql&lt;br /&gt;
* optimizer&lt;br /&gt;
* documentation&lt;br /&gt;
* psql&lt;br /&gt;
* backend&lt;br /&gt;
* contrib&lt;br /&gt;
* libpq&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== loose ends ===&lt;br /&gt;
&lt;br /&gt;
* robustify the email interface&lt;br /&gt;
* make the site look prettier&lt;br /&gt;
* emails sent directly to the list&lt;br /&gt;
* submit some of our modifications to upstream&lt;br /&gt;
* deal with people changing their emailaddress in the community login profile&lt;br /&gt;
* document that bz can only deal with the emailaddress for login and not the username&lt;br /&gt;
* explain the &amp;quot;logged in vs. not&amp;quot; business&lt;br /&gt;
* commands are case sensitive ie. &amp;quot;@resolution=wontfix&amp;quot; != &amp;quot;@resolution=WONTFIX&amp;quot;&lt;br /&gt;
* automatically handle attachments&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/TrackerDiscussion</id>
		<title>TrackerDiscussion</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/TrackerDiscussion"/>
				<updated>2011-05-29T17:59:52Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;remove the &amp;quot;talk to me before you edit&amp;quot; - per discussion on -hackers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is purely a space to dump some of the stuff that was discussed on the now defunct tracker list and has no real official character.&lt;br /&gt;
&lt;br /&gt;
See [[Tracker:BugzillaTest]] for information on our test tracker.&lt;br /&gt;
&lt;br /&gt;
=== basic criteria ===&lt;br /&gt;
&lt;br /&gt;
==== basic technical and operational requirements ====&lt;br /&gt;
&lt;br /&gt;
* must work on common unix platforms&lt;br /&gt;
* must support postgresql as a backend&lt;br /&gt;
* must require no/minimal customization work for community adoption&lt;br /&gt;
* must have community login integration&lt;br /&gt;
&lt;br /&gt;
==== Management of bugs and issues ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;font-size: 85%; border: gray solid 1px; border-collapse: collapse; text-align: center; width: 100%; table-layout: fixed;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:16em&amp;quot; |&lt;br /&gt;
! Requirement (yes/no/optional)&lt;br /&gt;
! Bugzilla 3.0&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Creation of bugs&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Creation of bugs via web interface&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Creation of bugs via mail interface&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | optional&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Creation of bugs via external interface&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | optional&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; colspan=&amp;quot;3&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Ability to query open bugs&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Ability to query open bugs via web interface&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Ability to query open bugs via external interface&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes(SOAP/XML-RPC)&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; colspan=&amp;quot;3&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Ability to query historical bug data&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Ability to change/set bug status&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Ability to set and track people working on a given bug&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Ability to categorize bugs by severity and release&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Ability to moderate bug listing (not listed publicly until evaluator accepts)&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Full-text searching of bug reports&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Links to source control system events&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | optional&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Management of feature requests ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;font-size: 85%; border: gray solid 1px; border-collapse: collapse; text-align: center; width: 100%; table-layout: fixed;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:16em&amp;quot; |&lt;br /&gt;
! Requirement (yes/no/optional)&lt;br /&gt;
! Bugzilla 3.0&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Creation of feature requests&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Creation of feature requests via web interface&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Creation of feature requests via mail interface&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | Creation of feature requests via external interface&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | optional&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | yes (soap/XML-RPC)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Record Keeping === &lt;br /&gt;
#	Some way of capturing the discussion around feature requests&lt;br /&gt;
#	Some way of capturing links to the mailing list discussion around feature requests&lt;br /&gt;
#	Ability to reject feature requests (for historical purposes)&lt;br /&gt;
#	Link between feature request/discussion and bug that triggered the request&lt;br /&gt;
=== Ease of use for developers ===&lt;br /&gt;
#	Low overhead in accessing the system&lt;br /&gt;
#	Email interface&lt;br /&gt;
#	Some way of uploading content (design plans, &amp;amp;c.)&lt;br /&gt;
#	Easy way of linking trouble reports together&lt;br /&gt;
#	Plain delineations (i.e. just the right number of categories, modules, &amp;amp;c.)&lt;br /&gt;
#	Obvious how to use (not a lot of work to start using)&lt;br /&gt;
#	Can be used by &amp;quot;experts&amp;quot; (f. doesn't make the tool so dumb that experienced users have to click 43 things all the time.)&lt;br /&gt;
#	At least as reliable as CVS&lt;br /&gt;
#	Facilities for flexible &amp;quot;triage&amp;quot; work&lt;br /&gt;
=== Ease of use for community members ===&lt;br /&gt;
#	Web interface&lt;br /&gt;
#	Communications about bugs are regular and understandable (no &amp;quot;report/request to black hole&amp;quot;)&lt;br /&gt;
=== Ease of use for &amp;quot;non-community members&amp;quot; (e.g. new users, users who don't follow mailing lists regularly, &amp;amp;c.) ===&lt;br /&gt;
#	Bug reports are easy to make (don't need to create an account just to file a bug).&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Performance_QA_Testing</id>
		<title>Performance QA Testing</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Performance_QA_Testing"/>
				<updated>2011-05-20T18:40:16Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;/* Datasets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page centralizes the efforts on performances QA testing: available hardware, available tools, continuous benchmarking effort...&lt;br /&gt;
&lt;br /&gt;
The PostgreSQL Performance lab is being created to allow community members of the Open Source database [http://www.postgresql.org/ PostgreSQL] to have enterprise class hardware to test on.&lt;br /&gt;
&lt;br /&gt;
The testing that will occur includes industry standard workloads such as OLTP, DSS and BI. Furthermore we will also use the hardware for other practical and customer oriented testing to improve scalability (processor utilization, i/o, load balancing, etc.) and managing large data sets (loading, backups, restores, replication, etc).&lt;br /&gt;
&lt;br /&gt;
=== Donations ===&lt;br /&gt;
&lt;br /&gt;
For donation inquiries, please contact [mailto:josh@postgresql.org Josh Berkus &amp;lt;josh @t postgresql.org&amp;gt;] and [mailto:jdrake@postgresql.org Joshua Drake &amp;lt;jdrake @t postgresql.org&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
=== Mailing List ===&lt;br /&gt;
&lt;br /&gt;
There is a [http://lists.pgfoundry.org/mailman/listinfo/perflab-general mailing list] available to discuss administrative aspects of community equipment.  Please continue to use the -hackers and -performance mailing lists for performance and technical discussions.&lt;br /&gt;
&lt;br /&gt;
== QA platforms ==&lt;br /&gt;
&lt;br /&gt;
* [[QA Platform hosted at Command Prompt]] - Portland, Oregon, USA&lt;br /&gt;
* [[QA Platform hosted at Open Wide (France)]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* Former OSDL work: [http://osdldbt.sourceforge.net/ Database Test Suite] and [http://crucible.svn.sourceforge.net/viewvc/crucible/ Web interface]&lt;br /&gt;
* [http://www.westnet.com/~gsmith/content/postgresql/pgbench-tools.htm pgbench-tools from Greg Smith].  See [[Regression Testing with pgbench]].&lt;br /&gt;
* [http://bristlecone.continuent.org/HomePage Bristlecone from Continuent]&lt;br /&gt;
* [http://tsung.erlang-projects.org/ Tsung load injector] allows to define sessions (containing queries and thinktime, etc) and replay them with very high concurrency setup. Can use many loading nodes at a time, multi OS support (written in [http://www.erlang.org/ erlang], extensible in this language)&lt;br /&gt;
* [http://dim.tapoueh.org/temp/tsung-plotter/ Tsung Plotter] plots several tsung runs onto the same graphs set, for easy comparing. Uses python and matplotlib.&lt;br /&gt;
* Tsung DBT2 Implementation (tsung module in erlang), WIP, to get published asap.&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
&lt;br /&gt;
* look into [http://sysbench.sourceforge.net/ sysbench] - it has some issues with locking on postgresql but at least read-only it seems to work fine.  See [[SysBench]] for more info.&lt;br /&gt;
&lt;br /&gt;
* collecting all the various small samples and testcases posted over the last few years on -performance, -hackers &amp;amp; -bugs and put them into a test set&lt;br /&gt;
&lt;br /&gt;
* consider doing tests using pgbench -M (simple|extended|prepared) to catch regressions in one of those modes&lt;br /&gt;
&lt;br /&gt;
* resurrect Jan Wiecks tpc-w implementation available on [http://pgfoundry.org/projects/tpc-w-php/ pgfoundry]&lt;br /&gt;
&lt;br /&gt;
* add full text search benchmarking by using [http://www.sigaev.ru/cvsweb/cvsweb.cgi/ftsbench/ ftsbench] from teodor&lt;br /&gt;
&lt;br /&gt;
* XML benchmarking ?&lt;br /&gt;
&lt;br /&gt;
* investigate [http://advogato.org/person/nconway/diary.html?start=21 QuickCheck] and http://advogato.org/person/nconway/diary/23.html&lt;br /&gt;
&lt;br /&gt;
* Implement the [http://www.cs.umb.edu/~poneil/StarSchemaB.PDF Star Schema Benchmark].&lt;br /&gt;
&lt;br /&gt;
== Datasets ==&lt;br /&gt;
&lt;br /&gt;
[[Sample_Databases|see the sample databases page for some free datasources]]&lt;br /&gt;
&lt;br /&gt;
== Information ==&lt;br /&gt;
* [http://wiki.postgresql.org/wiki/Performance_Optimization In depth performance articles on PostgreSQL]&lt;br /&gt;
* [http://wiki.postgresql.org/wiki/HP_ProLiant_DL380_G5_Tuning_Guide DL380 Tuning Guide]&lt;br /&gt;
* [http://www.vimeo.com/channels/postgres Videos on Performance and other topics]&lt;br /&gt;
* [http://www.commandprompt.com/blogs/joshua_drake/2008/04/is_that_performance_i_smell_ext2_vs_ext3_on_50_spindles_testing_for_postgresql/ Performance measurements between load and filesystems (Linux)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Benchmarking]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Performance_QA_Testing</id>
		<title>Performance QA Testing</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Performance_QA_Testing"/>
				<updated>2011-05-20T18:35:33Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;refer to the free sample dataset page instead of having the information in both places&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page centralizes the efforts on performances QA testing: available hardware, available tools, continuous benchmarking effort...&lt;br /&gt;
&lt;br /&gt;
The PostgreSQL Performance lab is being created to allow community members of the Open Source database [http://www.postgresql.org/ PostgreSQL] to have enterprise class hardware to test on.&lt;br /&gt;
&lt;br /&gt;
The testing that will occur includes industry standard workloads such as OLTP, DSS and BI. Furthermore we will also use the hardware for other practical and customer oriented testing to improve scalability (processor utilization, i/o, load balancing, etc.) and managing large data sets (loading, backups, restores, replication, etc).&lt;br /&gt;
&lt;br /&gt;
=== Donations ===&lt;br /&gt;
&lt;br /&gt;
For donation inquiries, please contact [mailto:josh@postgresql.org Josh Berkus &amp;lt;josh @t postgresql.org&amp;gt;] and [mailto:jdrake@postgresql.org Joshua Drake &amp;lt;jdrake @t postgresql.org&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
=== Mailing List ===&lt;br /&gt;
&lt;br /&gt;
There is a [http://lists.pgfoundry.org/mailman/listinfo/perflab-general mailing list] available to discuss administrative aspects of community equipment.  Please continue to use the -hackers and -performance mailing lists for performance and technical discussions.&lt;br /&gt;
&lt;br /&gt;
== QA platforms ==&lt;br /&gt;
&lt;br /&gt;
* [[QA Platform hosted at Command Prompt]] - Portland, Oregon, USA&lt;br /&gt;
* [[QA Platform hosted at Open Wide (France)]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* Former OSDL work: [http://osdldbt.sourceforge.net/ Database Test Suite] and [http://crucible.svn.sourceforge.net/viewvc/crucible/ Web interface]&lt;br /&gt;
* [http://www.westnet.com/~gsmith/content/postgresql/pgbench-tools.htm pgbench-tools from Greg Smith].  See [[Regression Testing with pgbench]].&lt;br /&gt;
* [http://bristlecone.continuent.org/HomePage Bristlecone from Continuent]&lt;br /&gt;
* [http://tsung.erlang-projects.org/ Tsung load injector] allows to define sessions (containing queries and thinktime, etc) and replay them with very high concurrency setup. Can use many loading nodes at a time, multi OS support (written in [http://www.erlang.org/ erlang], extensible in this language)&lt;br /&gt;
* [http://dim.tapoueh.org/temp/tsung-plotter/ Tsung Plotter] plots several tsung runs onto the same graphs set, for easy comparing. Uses python and matplotlib.&lt;br /&gt;
* Tsung DBT2 Implementation (tsung module in erlang), WIP, to get published asap.&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
&lt;br /&gt;
* look into [http://sysbench.sourceforge.net/ sysbench] - it has some issues with locking on postgresql but at least read-only it seems to work fine.  See [[SysBench]] for more info.&lt;br /&gt;
&lt;br /&gt;
* collecting all the various small samples and testcases posted over the last few years on -performance, -hackers &amp;amp; -bugs and put them into a test set&lt;br /&gt;
&lt;br /&gt;
* consider doing tests using pgbench -M (simple|extended|prepared) to catch regressions in one of those modes&lt;br /&gt;
&lt;br /&gt;
* resurrect Jan Wiecks tpc-w implementation available on [http://pgfoundry.org/projects/tpc-w-php/ pgfoundry]&lt;br /&gt;
&lt;br /&gt;
* add full text search benchmarking by using [http://www.sigaev.ru/cvsweb/cvsweb.cgi/ftsbench/ ftsbench] from teodor&lt;br /&gt;
&lt;br /&gt;
* XML benchmarking ?&lt;br /&gt;
&lt;br /&gt;
* investigate [http://advogato.org/person/nconway/diary.html?start=21 QuickCheck] and http://advogato.org/person/nconway/diary/23.html&lt;br /&gt;
&lt;br /&gt;
* Implement the [http://www.cs.umb.edu/~poneil/StarSchemaB.PDF Star Schema Benchmark].&lt;br /&gt;
&lt;br /&gt;
== Datasets ==&lt;br /&gt;
&lt;br /&gt;
[[Sample_Databases see the sample databases page for some free datasources]]&lt;br /&gt;
&lt;br /&gt;
== Information ==&lt;br /&gt;
* [http://wiki.postgresql.org/wiki/Performance_Optimization In depth performance articles on PostgreSQL]&lt;br /&gt;
* [http://wiki.postgresql.org/wiki/HP_ProLiant_DL380_G5_Tuning_Guide DL380 Tuning Guide]&lt;br /&gt;
* [http://www.vimeo.com/channels/postgres Videos on Performance and other topics]&lt;br /&gt;
* [http://www.commandprompt.com/blogs/joshua_drake/2008/04/is_that_performance_i_smell_ext2_vs_ext3_on_50_spindles_testing_for_postgresql/ Performance measurements between load and filesystems (Linux)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Benchmarking]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Sample_Databases</id>
		<title>Sample Databases</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Sample_Databases"/>
				<updated>2011-05-20T18:30:29Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Many database systems provide sample databases with the product.  A good intro to popular ones that includes discussion of samples available for other databases is [http://www.barik.net/archive/2006/03/28/195425/ Sample Databases for PostgreSQL and More]&lt;br /&gt;
&lt;br /&gt;
One trivial sample that PostgreSQL ships with is the [[Pgbench]].  This has the advantage of being built-in and supporting a scalable data generator--you can make databases of any size ranging from 16MB to 600GB (approximately) with the current version.&lt;br /&gt;
&lt;br /&gt;
== PgFoundry Samples ==&lt;br /&gt;
&lt;br /&gt;
The latest collection of PostgreSQL compatible database samples is at [http://pgfoundry.org/projects/dbsamples/ PgFoundry Sample Databases].  It includes three commonly used benchmark databases:&lt;br /&gt;
&lt;br /&gt;
* World:  Based on the [http://dev.mysql.com/doc/world-setup/en/world-setup.html MySQL World] sample.  Has a list of Cities, Countries, and what language they speak.&lt;br /&gt;
* dellstore2:  PostgreSQL port of a database-neutral e-commerce test application [http://linux.dell.com/dvdstore/ developed by Dell].  The original code supports three size scales in their data generator (10MB, 1GB, 100GB), currently only the normal, smallest sized data set has been ported to PostgreSQL.  [http://www.storytotell.org/blog/2009/08/12/postgresql-84-windowing-functions.html PostgreSQL 8.4: Windowing Functions] uses this test data to show some advanced queries.&lt;br /&gt;
* Pagilia:  Based on MySQL's replacement for World, [http://dev.mysql.com/doc/sakila/en/sakila.html Sakila], which is itself inspired by the Dell DVD Store.&lt;br /&gt;
&lt;br /&gt;
There are some other sample databases there as well, such as a USDA Food database and a large list of country data via ISO-3166 standards.&lt;br /&gt;
&lt;br /&gt;
== Other Samples ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.commandprompt.com/ppbook/booktown.sql Book Town] - used for the examples in [http://www.commandprompt.com/ppbook/ Practical PostgreSQL]&lt;br /&gt;
* Benchmarking databases such as [[DBT-2]] or [[TPC-H]] can be used as samples.&lt;br /&gt;
* [http://www.freebase.com/docs/data_dumps Freebase] - Various wiki style data on places/people/things - ~600MB compressed&lt;br /&gt;
* [http://www.imdb.com/interfaces#plain IMDB] - the IMDB database - see also http://code.google.com/p/imbi/&lt;br /&gt;
* [http://www.data.gov/ ] - US federal government data collection see also [http://www.sunlightlabs.com/ sunlightlabs]&lt;br /&gt;
* [http://wiki.dbpedia.org/Downloads DBpedia] - wikipedia data export project&lt;br /&gt;
* [http://www.eoddata.com/ eoddata] - historic stock market data (requires registration - licence?)&lt;br /&gt;
* [http://www.transtats.bts.gov/Tables.asp?DB_ID=120&amp;amp;DB_Name=Airline%20On-Time%20Performance%20Data&amp;amp;DB_Short_Name=On-Time RITA] - Airline On-Time Performance Data&lt;br /&gt;
* [http://wiki.openstreetmap.org/wiki/Planet.osm Openstreetmap] - Openstreetmap source data&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Sample_Databases</id>
		<title>Sample Databases</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Sample_Databases"/>
				<updated>2011-05-20T18:29:27Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;move sample databases over from the Performance QA page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Many database systems provide sample databases with the product.  A good intro to popular ones that includes discussion of samples available for other databases is [http://www.barik.net/archive/2006/03/28/195425/ Sample Databases for PostgreSQL and More]&lt;br /&gt;
&lt;br /&gt;
One trivial sample that PostgreSQL ships with is the [[Pgbench]].  This has the advantage of being built-in and supporting a scalable data generator--you can make databases of any size ranging from 16MB to 600GB (approximately) with the current version.&lt;br /&gt;
&lt;br /&gt;
== PgFoundry Samples ==&lt;br /&gt;
&lt;br /&gt;
The latest collection of PostgreSQL compatible database samples is at [http://pgfoundry.org/projects/dbsamples/ PgFoundry Sample Databases].  It includes three commonly used benchmark databases:&lt;br /&gt;
&lt;br /&gt;
* World:  Based on the [http://dev.mysql.com/doc/world-setup/en/world-setup.html MySQL World] sample.  Has a list of Cities, Countries, and what language they speak.&lt;br /&gt;
* dellstore2:  PostgreSQL port of a database-neutral e-commerce test application [http://linux.dell.com/dvdstore/ developed by Dell].  The original code supports three size scales in their data generator (10MB, 1GB, 100GB), currently only the normal, smallest sized data set has been ported to PostgreSQL.  [http://www.storytotell.org/blog/2009/08/12/postgresql-84-windowing-functions.html PostgreSQL 8.4: Windowing Functions] uses this test data to show some advanced queries.&lt;br /&gt;
* Pagilia:  Based on MySQL's replacement for World, [http://dev.mysql.com/doc/sakila/en/sakila.html Sakila], which is itself inspired by the Dell DVD Store.&lt;br /&gt;
&lt;br /&gt;
There are some other sample databases there as well, such as a USDA Food database and a large list of country data via ISO-3166 standards.&lt;br /&gt;
&lt;br /&gt;
== Other Samples ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.commandprompt.com/ppbook/booktown.sql Book Town] - used for the examples in [http://www.commandprompt.com/ppbook/ Practical PostgreSQL]&lt;br /&gt;
* Benchmarking databases such as [[DBT-2]] or [[TPC-H]] can be used as samples.&lt;br /&gt;
* [http://www.freebase.com/docs/data_dumps Freebase] - Various wiki style data on places/people/things - ~600MB compressed&lt;br /&gt;
* [http://www.imdb.com/interfaces#plain IMDB] - the IMDB database - see also http://code.google.com/p/imbi/&lt;br /&gt;
* [http://www.data.gov/ ] - US federal government data collection see also [http://www.sunlightlabs.com/ sunlightlabs]&lt;br /&gt;
* [http://wiki.dbpedia.org/Downloads DBpedia] - wikipedia data export project&lt;br /&gt;
* [http://linux.dell.com/dvdstore/ Dell DVDstore] - Dells DVD Store context data&lt;br /&gt;
* [http://www.eoddata.com/ eoddata] - historic stock market data (requires registration - licence?)&lt;br /&gt;
* [http://www.transtats.bts.gov/Tables.asp?DB_ID=120&amp;amp;DB_Name=Airline%20On-Time%20Performance%20Data&amp;amp;DB_Short_Name=On-Time RITA] - Airline On-Time Performance Data&lt;br /&gt;
* [http://wiki.openstreetmap.org/wiki/Planet.osm Openstreetmap] - Openstreetmap source data&lt;br /&gt;
&lt;br /&gt;
[[Category:Benchmarking]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PGDay_Europe_2010_Talks</id>
		<title>PGDay Europe 2010 Talks</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGDay_Europe_2010_Talks"/>
				<updated>2010-12-07T14:09:30Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;link in the right slides&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PGDay.EU 2010 was held in Stuttgart, Germany on December 6th - 8th.&lt;br /&gt;
&lt;br /&gt;
== Monday, December 6, 2010 ==&lt;br /&gt;
&lt;br /&gt;
=== Berlin 1+2 ===&lt;br /&gt;
&lt;br /&gt;
==== 9:45 - 10:45 [[Keynote: Back To The Future of Open Source  (Simon Phipps)]]====&lt;br /&gt;
==== 11:10 - 12:00 [[Play chess against PostgreSQL (and get beaten) (Gianni Ciolli)]] ====&lt;br /&gt;
==== 12:10 - 13:00 [[Rapid Upgrades With Pg_Upgrade (Bruce Momjian)]] ====&lt;br /&gt;
==== 14:00 - 14:50 [[PostGIS 1.5 and beyond: a technical perspective (Mark Cave-Ayland, Olivier Courtin)]] ====&lt;br /&gt;
==== 15:20 - 16:10 [[Managing PostgreSQL Replication (Simon Riggs)]] ====&lt;br /&gt;
&lt;br /&gt;
=== Berlin 3 ===&lt;br /&gt;
&lt;br /&gt;
==== 11:10 - 12:00 [[PostGIS - Das Wo? in der Datenbank (Stefan Keller, Andreas Neumann)]]====&lt;br /&gt;
&lt;br /&gt;
==== 12:10 - 13:00 [[PostgreSQL als Basis für Detailhandels-Anwendungen (Marc Balmer)]]====&lt;br /&gt;
&lt;br /&gt;
==== 14:00 - 14:50 [[Media:Pg-community.pdf|Die PostgreSQL Community (Bernd Helmle)]]====&lt;br /&gt;
&lt;br /&gt;
==== 16:20 - 17:10 [[Media:Pgday-2010-ose-print.pdf|Open Source Entscheidungen]] ([[User:Ads|Andreas Scherbaum]]) ====&lt;br /&gt;
&lt;br /&gt;
=== Glasgow ===&lt;br /&gt;
&lt;br /&gt;
=== Tara ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tuesday, December 7, 2010 ==&lt;br /&gt;
&lt;br /&gt;
=== Berlin 1+2 ===&lt;br /&gt;
&lt;br /&gt;
=== Berlin 3 ===&lt;br /&gt;
&lt;br /&gt;
==== 10:25 - 11:10 [[Media:Pgday_eu_2010_benchmarking.pdf|Benchmarking und Performancetesting von und mit PostgreSQL]] ([[User:mastermind|Stefan Kaltenbrunner]]) ====&lt;br /&gt;
&lt;br /&gt;
==== 11:35 - 12:20 [[Media:Pgday-2010-mysql-to-pg-print.pdf|Datenbanken von MySQL zu PostgreSQL portieren]] ([[User:Ads|Andreas Scherbaum]]) ====&lt;br /&gt;
&lt;br /&gt;
=== Glasgow ===&lt;br /&gt;
&lt;br /&gt;
=== Tara ===&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/File:Pgday_eu_2010_benchmarking.pdf</id>
		<title>File:Pgday eu 2010 benchmarking.pdf</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/File:Pgday_eu_2010_benchmarking.pdf"/>
				<updated>2010-12-07T14:08:34Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;Benchmarking und Performancetesting von und mit PostgreSQL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Benchmarking und Performancetesting von und mit PostgreSQL&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PGDay_Europe_2010_Talks</id>
		<title>PGDay Europe 2010 Talks</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGDay_Europe_2010_Talks"/>
				<updated>2010-12-07T14:07:00Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;add my talk&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PGDay.EU 2010 was held in Stuttgart, Germany on December 6th - 8th.&lt;br /&gt;
&lt;br /&gt;
== Monday, December 6, 2010 ==&lt;br /&gt;
&lt;br /&gt;
=== Berlin 1+2 ===&lt;br /&gt;
&lt;br /&gt;
==== 9:45 - 10:45 [[Keynote: Back To The Future of Open Source  (Simon Phipps)]]====&lt;br /&gt;
==== 11:10 - 12:00 [[Play chess against PostgreSQL (and get beaten) (Gianni Ciolli)]] ====&lt;br /&gt;
==== 12:10 - 13:00 [[Rapid Upgrades With Pg_Upgrade (Bruce Momjian)]] ====&lt;br /&gt;
==== 14:00 - 14:50 [[PostGIS 1.5 and beyond: a technical perspective (Mark Cave-Ayland, Olivier Courtin)]] ====&lt;br /&gt;
==== 15:20 - 16:10 [[Managing PostgreSQL Replication (Simon Riggs)]] ====&lt;br /&gt;
&lt;br /&gt;
=== Berlin 3 ===&lt;br /&gt;
&lt;br /&gt;
==== 11:10 - 12:00 [[PostGIS - Das Wo? in der Datenbank (Stefan Keller, Andreas Neumann)]]====&lt;br /&gt;
&lt;br /&gt;
==== 12:10 - 13:00 [[PostgreSQL als Basis für Detailhandels-Anwendungen (Marc Balmer)]]====&lt;br /&gt;
&lt;br /&gt;
==== 14:00 - 14:50 [[Media:Pg-community.pdf|Die PostgreSQL Community (Bernd Helmle)]]====&lt;br /&gt;
&lt;br /&gt;
==== 16:20 - 17:10 [[Media:Pgday-2010-ose-print.pdf|Open Source Entscheidungen]] ([[User:Ads|Andreas Scherbaum]]) ====&lt;br /&gt;
&lt;br /&gt;
=== Glasgow ===&lt;br /&gt;
&lt;br /&gt;
=== Tara ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tuesday, December 7, 2010 ==&lt;br /&gt;
&lt;br /&gt;
=== Berlin 1+2 ===&lt;br /&gt;
&lt;br /&gt;
=== Berlin 3 ===&lt;br /&gt;
&lt;br /&gt;
==== 10:25 - 11:10 [[Media:Pgday-2010-mysql-to-pg-print.pdf|Benchmarking und Performancetesting von und mit PostgreSQL]] ([[User:mastermind|Stefan Kaltenbrunner]]) ====&lt;br /&gt;
==== 11:35 - 12:20 [[Media:Pgday-2010-mysql-to-pg-print.pdf|Datenbanken von MySQL zu PostgreSQL portieren]] ([[User:Ads|Andreas Scherbaum]]) ====&lt;br /&gt;
&lt;br /&gt;
=== Glasgow ===&lt;br /&gt;
&lt;br /&gt;
=== Tara ===&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Tracker:BugzillaTest</id>
		<title>Tracker:BugzillaTest</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Tracker:BugzillaTest"/>
				<updated>2010-08-17T18:08:31Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;remove link to my development sandbox to prevent people from accidentially trying to submit valid bugs there...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PgTracker Demo Installation ==&lt;br /&gt;
 &lt;br /&gt;
http://trackerdemo.postgresql.org is running a modified version of Bugzilla 3.0. It is has the following additional features over the stock version:&lt;br /&gt;
&lt;br /&gt;
* full integration with the main website community login feature&lt;br /&gt;
* better creation of bugs via the email interface&lt;br /&gt;
* integration with the main website bug reporting form via the XML-RPC interface&lt;br /&gt;
* modifications to the internal API for some operations (like being able to &amp;quot;impersonate&amp;quot; reporters over the XML-RPC interface to get correct attribution)&lt;br /&gt;
&lt;br /&gt;
=== basic concepts ===&lt;br /&gt;
&lt;br /&gt;
pgtracker is currently supposed to be a bug and issue tracker primarily for pgsql-bugs@. It does not intent to replace the mailinglist in any way but it is supposed to augment and support it.&lt;br /&gt;
To do that the main bug reporting form on the Website is now generating a Bug report using the XML-RPC interface(so that BZ can drive the generation of the bug id which needs to be unique). &lt;br /&gt;
&lt;br /&gt;
The resulting bug is either:&lt;br /&gt;
&lt;br /&gt;
* only made visible to people part of the &amp;quot;Tracker Team&amp;quot; in case it is a normal bug report&lt;br /&gt;
&lt;br /&gt;
* only made visible to people part of the &amp;quot;Security Team&amp;quot; in case it is reported as a security bug&lt;br /&gt;
&lt;br /&gt;
&amp;quot;visible&amp;quot; in this context means that the bug cannot be viewed by the public and needs to be verified by a member of the respective team. Those bugs are initially tagged as UNCONFIRMED which is a special state that will not cause any (email) notifications to be sent.&lt;br /&gt;
This scheme can support both bugs sent via the bug reporting form and bugs submitted by the native BZ interface.&lt;br /&gt;
Issues on pgsql-bugs@postgresql.org however tend to generate responses (both &amp;quot;this is not a bug&amp;quot; and &amp;quot;oh yeah this is a bug please try the following patch&amp;quot;) pretty quickly - to cope with that the bugzilla installation is subscribed to the mailinglist and will simply add each reply as a comment to the tracker entry.&lt;br /&gt;
&lt;br /&gt;
XXX: discuss handling of mails sent directly to the list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== email interface ===&lt;br /&gt;
&lt;br /&gt;
the bugzilla installation provides an email based interface that can be used or basic interaction with the tracker. The interface [http://www.bugzilla.org/docs/3.0/html/api/email_in.html#Modifying_an_Existing_Bug is documented here].&lt;br /&gt;
&lt;br /&gt;
this docs lack a bit of information on what fields one can manipulate through that interface so here are some examples:&lt;br /&gt;
&lt;br /&gt;
replying to a bugreport with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 @resolution = INVALID&lt;br /&gt;
 this is not a bug please look at the docs to find out why&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in the body of an email will result in the mentioned bug to get:&lt;br /&gt;
&lt;br /&gt;
* a status of &amp;quot;RESOLVED&amp;quot;&lt;br /&gt;
* a resolution of &amp;quot;INVALID&amp;quot;&lt;br /&gt;
* a comment of &amp;quot;this is not a bug please look at the docs to find out why&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(selected) list of available commands(all ned to be prefixed with an @ to be recognized by the email interface):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 bug_id -- bug identifer (needs to be either in the Subject in the form of &amp;quot;[Bug 1234]&amp;quot; or mentioned in the mail)&lt;br /&gt;
 short_desc -- sets/updates the summary text of the bug&lt;br /&gt;
 classification&lt;br /&gt;
 product -- name of the product (ie PostgreSQL)&lt;br /&gt;
 version -- PostgreSQL Version&lt;br /&gt;
 rep_platform&lt;br /&gt;
 op_sys -- Operating system&lt;br /&gt;
 bug_status -- Status of the bug (one of RESOLVED,ASSIGNED,REOPENED,CLOSED,VERIFIED)&lt;br /&gt;
 status_whiteboard&lt;br /&gt;
 keywords&lt;br /&gt;
 resolution -- sets the resolution of the bug (one of FIXED, INVALID, WORKSFORME, DUPLICATE, WONTFIX)&lt;br /&gt;
 bug_severity&lt;br /&gt;
 priority&lt;br /&gt;
 component -- component this bug can be attributed too&lt;br /&gt;
 assigned_to&lt;br /&gt;
 qa_contact&lt;br /&gt;
 cc&lt;br /&gt;
 dependson&lt;br /&gt;
 blocked&lt;br /&gt;
 longdesc&lt;br /&gt;
 content&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''WARNING: the current version of the email interface will only recognize commands if it is in the very first line of the email'''&lt;br /&gt;
&lt;br /&gt;
=== bug states ===&lt;br /&gt;
&lt;br /&gt;
general descriptions of the available bug states are available [http://trackerdemo.postgresql.org/page.cgi?id=fields.html#status here]&lt;br /&gt;
&lt;br /&gt;
* UNCONFIRMED (this state is only visible to members of the bug tracker team)&lt;br /&gt;
* NEW (this is the default state for all accepted bugs)&lt;br /&gt;
* ASSIGNED&lt;br /&gt;
* REOPENED&lt;br /&gt;
* VERIFIED&lt;br /&gt;
* CLOSED&lt;br /&gt;
&lt;br /&gt;
=== components ===&lt;br /&gt;
&lt;br /&gt;
* plperl&lt;br /&gt;
* plpgsql&lt;br /&gt;
* optimizer&lt;br /&gt;
* documentation&lt;br /&gt;
* psql&lt;br /&gt;
* backend&lt;br /&gt;
* contrib&lt;br /&gt;
* libpq&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== loose ends ===&lt;br /&gt;
&lt;br /&gt;
* robustify the email interface&lt;br /&gt;
* make the site look prettier&lt;br /&gt;
* emails sent directly to the list&lt;br /&gt;
* submit some of our modifications to upstream&lt;br /&gt;
* deal with people changing their emailaddress in the community login profile&lt;br /&gt;
* document that bz can only deal with the emailaddress for login and not the username&lt;br /&gt;
* explain the &amp;quot;logged in vs. not&amp;quot; business&lt;br /&gt;
* commands are case sensitive ie. &amp;quot;@resolution=wontfix&amp;quot; != &amp;quot;@resolution=WONTFIX&amp;quot;&lt;br /&gt;
* automatically handle attachments&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PostgreSQL_Buildfarm_Howto</id>
		<title>PostgreSQL Buildfarm Howto</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PostgreSQL_Buildfarm_Howto"/>
				<updated>2010-05-29T18:57:49Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PostgreSQL BuildFarm is a distributed build system designed to detect &lt;br /&gt;
build failures on a large collection of platforms and configurations. &lt;br /&gt;
This software is written in Perl. If you're not comfortable with Perl&lt;br /&gt;
then you possibly don't want to run this, even though the only adjustment&lt;br /&gt;
you should ever need is to the config file (which is also Perl).&lt;br /&gt;
&lt;br /&gt;
=== Get the Software === &lt;br /&gt;
Download from: [http://pgfoundry.org/frs/?group_id=1000040 pgFoundry]&lt;br /&gt;
Unpack it and put it somewhere. You can put the config file in a different &lt;br /&gt;
place from the run_build.pl script if you want to, but the &lt;br /&gt;
simplest thing is to put it in the same place. Decide which user you will run &lt;br /&gt;
the script as - it must be a user who can run the PostgreSQL server programs (on Unix&lt;br /&gt;
that means it must *not* run as root). Do everything else here as that user.&lt;br /&gt;
&lt;br /&gt;
=== Set up a base git mirror that all your branches will pull from. ===&lt;br /&gt;
Most buildfarm members run on more than one branch, and if you do it's good practice to set up&lt;br /&gt;
a mirror on the buildfarm machine and then just clone that for each branch. As of this writing there are two suitable public git repositories:&lt;br /&gt;
* git://git.postgresql.org/git/postgresql.git&lt;br /&gt;
* git://github.com/oicu/pg-cvs-mirror.git&lt;br /&gt;
The first is the community repository, and is kept very up to date. Unfortunately it is broken on&lt;br /&gt;
branches earlier then REL8_3_STABLE. The second repository is similar to the first but is not broken on any of the live branches (as of the current writing). When the PostgreSQL project finally moves to using Git, currently expect to be around August 2010, both of these will become redundant. To set up a mirror, do something like this:&lt;br /&gt;
  git clone --mirror git://github.com/oicu/pg-cvs-mirror.git pgsql-base.git&lt;br /&gt;
When that is done, add an entry to your crontab to keep it up to date, something like:&lt;br /&gt;
  20,50 * * * * cd /path/to/pgsql-base.git &amp;amp;&amp;amp; git fetch -q&lt;br /&gt;
&lt;br /&gt;
=== Create a directory where builds will run. === &lt;br /&gt;
This should be dedicated to&lt;br /&gt;
the use of the build farm. Make sure there's plenty of space - on my&lt;br /&gt;
machine each branch can use up to about 700Mb during a build. You can use the&lt;br /&gt;
directory where the script lives, or a subdirectory of it, or a completely &lt;br /&gt;
different directory. &lt;br /&gt;
&lt;br /&gt;
=== Edit the build-farm.conf file ===&lt;br /&gt;
Put the location of the directory you just&lt;br /&gt;
created in the config variable &amp;quot;build_root&amp;quot;. Set the &amp;quot;scm&amp;quot; to &amp;quot;git&amp;quot; and the &amp;quot;scmrepo&amp;quot;&lt;br /&gt;
to the path to your git mirror. If you are not using the community git repo, set the &amp;quot;scm_url&amp;quot; to&lt;br /&gt;
point to where to find a givven git commit on the web. e.g. for my mirror on github, the scm_url should be &amp;lt;i&amp;gt;&amp;amp;#x68;ttp://github.com/oicu.pg-cvs-mirror/commit/&amp;lt;/i&amp;gt; (Don't forget the trailing &amp;quot;/&amp;quot;.)&lt;br /&gt;
Adjust the config variables&lt;br /&gt;
&amp;quot;make&amp;quot;, &amp;quot;config_opts&amp;quot;, and (if you don't use ccache) &lt;br /&gt;
&amp;quot;config_env&amp;quot; to suit your environment, and to choose which optional postgres &lt;br /&gt;
coniguration options you want to build with. You should not need to adjust any other variables. &lt;br /&gt;
Check that you didn't screw things up by running &amp;quot;perl -cw build-farm.conf&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
=== Change the shebang line in the run_build script. ===&lt;br /&gt;
If the path to your perl &lt;br /&gt;
installation isn't &amp;quot;/usr/bin/perl&amp;quot;, edit the #! line in run_build.pl so it is correct. &lt;br /&gt;
This is the ONLY line in that file you should ever need to edit. &lt;br /&gt;
&lt;br /&gt;
=== Check that required perl modules are present. ===&lt;br /&gt;
Run &amp;quot;perl -cw run_build.pl&amp;quot;. &lt;br /&gt;
If you get errors about missing perl modules you will need to install them. &lt;br /&gt;
Most of the required modules are standard modules in any perl&lt;br /&gt;
distribution.. The rest are all standard CPAN modules, and available either from there&lt;br /&gt;
or from your OS distribution. When you don't get an error any more, run the same test on&lt;br /&gt;
run_web_txn.pl. When all is clear you are ready to start testing.&lt;br /&gt;
&lt;br /&gt;
=== Run in test mode. ===&lt;br /&gt;
With a PATH that matches what you will have when running from cron, run&lt;br /&gt;
the script in no-send, no-status, verbose mode. Something like this:&lt;br /&gt;
  ./run_build.pl --nosend --nostatus --verbose&lt;br /&gt;
and watch the fun begin. If this results in failures because it can't&lt;br /&gt;
find some executables (especially gmake and git), you might need to change &lt;br /&gt;
the config file again, this time changing the &amp;quot;build_env&amp;quot; with another &lt;br /&gt;
setting something like:&lt;br /&gt;
  PATH =&amp;gt; &amp;quot;/usr/local/bin:$ENV{PATH}&amp;quot;,&lt;br /&gt;
Also, if you put the config file somewhere else, you will need to use &lt;br /&gt;
the --config=/path/to/build-farm.conf option.&lt;br /&gt;
&lt;br /&gt;
=== Test running from cron === &lt;br /&gt;
When you have that running, it's time to try with cron. &lt;br /&gt;
Put a line in your crontab that looks something like this:&lt;br /&gt;
  43 * * * * cd /location/of/run_build.pl/ &amp;amp;&amp;amp; ./run_build.pl --nosend --verbose&lt;br /&gt;
Again, add the --config option if needed. Notice that this time we didn't &lt;br /&gt;
specify --nostatus. That means that (after the first run) the script won't &lt;br /&gt;
do any build work unless the Git repo has changed. Check that your cron &lt;br /&gt;
job runs (it should email you the results, unless you tell it to send them&lt;br /&gt;
elsewhere).&lt;br /&gt;
&lt;br /&gt;
=== Choose which branches you want to build ===  &lt;br /&gt;
By default run_build.pl builds the HEAD branch. If you want to&lt;br /&gt;
build other branches, you can do so by specifying the name on the commandline,&lt;br /&gt;
e.g. &lt;br /&gt;
  run_build.pl REL8_4_STABLE&lt;br /&gt;
so, once you have HEAD working, remove the --verbose flag from your crontab,&lt;br /&gt;
and add extra cron lines for each branch you want to build regularly.&lt;br /&gt;
You could have something like this:&lt;br /&gt;
 6 * * * * cd /home/andrew/buildfarm &amp;amp;&amp;amp; ./run_build.pl --nosend&lt;br /&gt;
 30 4 * * * cd /home/andrew/buildfarm &amp;amp;&amp;amp; ./run_build.pl --nosend REL8_1_STABLE&lt;br /&gt;
&lt;br /&gt;
=== Register your new buildfarm member. === &lt;br /&gt;
Once this is all running happily, you can register to upload your&lt;br /&gt;
results to the central server. Registration can be done on the buildfarm server &lt;br /&gt;
at http://www.pgbuildfarm.org/register.html. When you receive your approval by &lt;br /&gt;
email, you will edit the &amp;quot;animal&amp;quot; and &amp;quot;secret&amp;quot; lines in your config file, &lt;br /&gt;
remove the --nosend flags, and you are done.&lt;br /&gt;
&lt;br /&gt;
=== Bugs === &lt;br /&gt;
Please file bug reports on the tracker at [http://pgfoundry.org/tracker/?atid=238&amp;amp;group_id=1000040&amp;amp;func=browse pgFoundry] &lt;br /&gt;
&lt;br /&gt;
=== Running on Windows ===&lt;br /&gt;
There are three build environments for Windows: Cygwin, MinGW/MSys, and Microsoft Visual C++. The buildfarm can run with each of these environments. This section discusses requirements for the buildfarm, rather than requirements for building on Windows, which are covered elsewhere.&lt;br /&gt;
&lt;br /&gt;
==== Cygwin ==== &lt;br /&gt;
There is almost nothing extra to be done for Cygwin. You need to make sure that cygserver is running, and you should set MAX_CONNECTIONS=&amp;gt;3 and CYGWIN=&amp;gt;'server' in the build_env stanza of the buildfarm config. Other than that it should be just like running on Unix.&lt;br /&gt;
&lt;br /&gt;
==== MinGW/Msys ====&lt;br /&gt;
For MinGW/MSys, you need both the MSys DTK version of perl installed, and a native Windows perl - I have only tested with ActiveState perl, which I have found to be rock solid. You need to run the main buildfarm script using the MSYS DTK perl, and the web transaction script using native Perl. that mean you need to change the first line of the run_web_txn.pl script so it reads something like:&lt;br /&gt;
  #!/c/perl/bin/perl&lt;br /&gt;
You should make sure that the PATH is set in your config file to put the Native perl ahead of the MSys DTK perl.&lt;br /&gt;
It's a good idea to have a runbf.bat file that you can call from the Windows scheduler. Mine looks like this:&lt;br /&gt;
  @echo off&lt;br /&gt;
  setlocal&lt;br /&gt;
  c:&lt;br /&gt;
  cd \msys\1.0\bin&lt;br /&gt;
  c:\msys\1.0\bin\sh.exe --login -c &amp;quot;cd bf &amp;amp;&amp;amp; ./run_build.pl --verbose %1 &amp;gt;&amp;gt; bftask.out 2&amp;gt;&amp;amp;1&amp;quot;&lt;br /&gt;
Set up a non-privileged Windows user to run this jobs as. set up the buildfarm as above as that user. Then create scheduler jobs that call runbf.bat with an optional branch name argument.&lt;br /&gt;
&lt;br /&gt;
==== Microsoft Visual C++ ====&lt;br /&gt;
For MSVC you need to edit the config file more extensively. Make sure the 'using_msvc' setting is on. Also, there is a section of the file specially for MSVC builds. As with MinGW, you need a native Windows perl installed. It appears that Windows Git does not like to clone local repositories specified with forward slashes (this is pretty horrible - almost all Windows programs are quite happy with forward slashes. Make sure you specify the repository using backslashes or weird things will happen. Again, you will need a runbf.bat file for the windows scheduler. Mine looks like this:&lt;br /&gt;
  @echo off&lt;br /&gt;
  c:&lt;br /&gt;
  cd \prog\bf&lt;br /&gt;
  c:\perl\bin\perl run_build.pl --verbose %1 %2 %3 %4 &amp;gt;&amp;gt; bfout.txt&lt;br /&gt;
You will also need a tar command capable of bundling up the logs to send to the server. The best one I have found for use on Windows is bsdtar, part of the libarchive collection at http://sourceforge.net/projects/gnuwin32/files/. This is also a good place to get many of the libraries you need for optional pieces of MSVC and MinGW builds.&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PostgreSQL_Buildfarm_Howto</id>
		<title>PostgreSQL Buildfarm Howto</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PostgreSQL_Buildfarm_Howto"/>
				<updated>2010-05-29T18:55:46Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;some minor copyediting on the buildfarm howto&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PostgreSQL BuildFarm is a distributed build system designed to detect &lt;br /&gt;
build failures on a large collection of platforms and configurations. &lt;br /&gt;
This software is written in Perl. If you're not comfortable with Perl&lt;br /&gt;
then you possibly don't want to run this, even though the only adjustment&lt;br /&gt;
you should ever need is to the config file (which is also Perl).&lt;br /&gt;
&lt;br /&gt;
=== Get the Software === &lt;br /&gt;
Download from: [http://pgfoundry.org/frs/?group_id=1000040 pgFoundry]&lt;br /&gt;
Unpack it and put it somewhere. You can put the config file in a different &lt;br /&gt;
place from the run_build.pl script if you want to, but the &lt;br /&gt;
simplest thing is to put it in the same place. Decide which user you will run &lt;br /&gt;
the script as - it must be a user who can run the PostgreSQL server programs (on Unix&lt;br /&gt;
that means it must *not* run as root). Do everything else here as that user.&lt;br /&gt;
&lt;br /&gt;
=== Set up a base git mirror that all your branches will pull from. ===&lt;br /&gt;
Most buildfarm members run on more than one branch, and if you do it's good practice to set up&lt;br /&gt;
a mirror on the buildfarm machine and then just clone that for each branch. As of this writing there are two suitable public git repositories:&lt;br /&gt;
* git://git.postgresql.org/git/postgresql.git&lt;br /&gt;
* git://github.com/oicu/pg-cvs-mirror.git&lt;br /&gt;
The first is the community repository, and is kept very up to date. Unfortunately it is broken on&lt;br /&gt;
branches earlier then REL8_3_STABLE. The second repository is similar to the first but is not broken on any of the live branches (as of the current writing). When the PostgreSQL project finally moves to using Git, currently expect to be around August 2010, both of these will become redundant. To set up a mirror, do something like this:&lt;br /&gt;
  git clone --mirror git://github.com/oicu/pg-cvs-mirror.git pgsql-base.git&lt;br /&gt;
When that is done, add an entry to your crontab to keep it up to date, something like:&lt;br /&gt;
  20,50 * * * * cd /path/to/pgsql-base.git &amp;amp;&amp;amp; git fetch -q&lt;br /&gt;
&lt;br /&gt;
=== Create a directory where builds will run. === &lt;br /&gt;
This should be dedicated to&lt;br /&gt;
the use of the build farm. Make sure there's plenty of space - on my&lt;br /&gt;
machine each branch can use up to about 700Mb during a build. You can use the&lt;br /&gt;
directory where the script lives, or a subdirectory of it, or a completely &lt;br /&gt;
different directory. &lt;br /&gt;
&lt;br /&gt;
=== Edit the build-farm.conf file ===&lt;br /&gt;
Put the location of the directory you just&lt;br /&gt;
created in the config variable &amp;quot;build_root&amp;quot;. Set the &amp;quot;scm&amp;quot; to &amp;quot;git&amp;quot; and the &amp;quot;scmrepo&amp;quot;&lt;br /&gt;
to the path to your git mirror. If you are not using the community git repo, set the &amp;quot;scm_url&amp;quot; to&lt;br /&gt;
point to where to find a givven git commit on the web. e.g. for my mirror on github, the scm_url should be &amp;lt;i&amp;gt;&amp;amp;#x68;ttp://github.com/oicu.pg-cvs-mirror/commit/&amp;lt;/i&amp;gt; (Don't forget the trailing &amp;quot;/&amp;quot;.)&lt;br /&gt;
Adjust the config variables&lt;br /&gt;
&amp;quot;make&amp;quot;, &amp;quot;config_opts&amp;quot;, and (if you don't use ccache) &lt;br /&gt;
&amp;quot;config_env&amp;quot; to suit your environment, and to choose which optional postgres &lt;br /&gt;
coniguration options you want to build with. You should not need to adjust any other variables. &lt;br /&gt;
Check that you didn't screw things up by running &amp;quot;perl -cw build-farm.conf&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
=== Change the shebang line in the run_build script. ===&lt;br /&gt;
If the path to your perl &lt;br /&gt;
installation isn't &amp;quot;/usr/bin/perl&amp;quot;, edit the #! line in run_build.pl so it is correct. &lt;br /&gt;
This is the ONLY line in that file you should ever need to edit. &lt;br /&gt;
&lt;br /&gt;
=== Check that required perl modules are present. ===&lt;br /&gt;
Run &amp;quot;perl -cw run_build.pl&amp;quot;. &lt;br /&gt;
If you get errors about missing perl modules you will need to install them. &lt;br /&gt;
Most of the required modules are standard modules in any perl&lt;br /&gt;
distribution.. The rest are all standard CPAN modules, and available either from there&lt;br /&gt;
or from your OS distribution. When you don't get an error any more, run the same test on&lt;br /&gt;
run_web_txn.pl. When all is clear you are ready to start testing.&lt;br /&gt;
&lt;br /&gt;
=== Run in test mode. ===&lt;br /&gt;
With a PATH that matches what you will have when running from cron, run&lt;br /&gt;
the script in no-send, no-status, verbose mode. Something like this:&lt;br /&gt;
  ./run_build.pl --nosend --nostatus --verbose&lt;br /&gt;
and watch the fun begin. If this results in failures because it can't&lt;br /&gt;
find some executables (especially gmake and git), you might need to change &lt;br /&gt;
the config file again, this time changing the &amp;quot;build_env&amp;quot; with another &lt;br /&gt;
setting something like:&lt;br /&gt;
  PATH =&amp;gt; &amp;quot;/usr/local/bin:$ENV{PATH}&amp;quot;,&lt;br /&gt;
Also, if you put the config file somewhere else, you will need to use &lt;br /&gt;
the --config=/path/to/build-farm.conf option.&lt;br /&gt;
&lt;br /&gt;
=== Test running from cron === &lt;br /&gt;
When you have that running, it's time to try with cron. &lt;br /&gt;
Put a line in your crontab that looks something like this:&lt;br /&gt;
  43 * * * * cd /location/of/run_build.pl/ &amp;amp;&amp;amp; ./run_build.pl --nosend --verbose&lt;br /&gt;
Again, add the --config option if needed. Notice that this time we didn't &lt;br /&gt;
specify --nostatus. That means that (after the first run) the script won't &lt;br /&gt;
do any build work unless the Git repo has changed. Check that your cron &lt;br /&gt;
job runs (it should email you the results, unless you tell it to send them&lt;br /&gt;
elsewhere).&lt;br /&gt;
&lt;br /&gt;
=== Choose which branches you want to build ===  &lt;br /&gt;
By default run_build.pl builds the HEAD branch. If you want to&lt;br /&gt;
build other branches, you can do so by specifying the name on the commandline,&lt;br /&gt;
e.g. &lt;br /&gt;
  run_build.pl REL8_4_STABLE&lt;br /&gt;
so, once you have HEAD working, remove the --verbose flag from your crontab,&lt;br /&gt;
and add extra cron lines for each branch you want to build regularly.&lt;br /&gt;
You could have something like this:&lt;br /&gt;
 6 * * * * cd /home/andrew/buildfarm &amp;amp;&amp;amp; ./run_build.pl --nosend&lt;br /&gt;
 30 4 * * * cd /home/andrew/buildfarm &amp;amp;&amp;amp; ./run_build.pl --nosend REL8_1_STABLE&lt;br /&gt;
&lt;br /&gt;
=== Register your new buildfarm member. === &lt;br /&gt;
Once this is all running happily, you can register to upload your&lt;br /&gt;
results to the central server. Registration can be done on the buildfarm server &lt;br /&gt;
at http://www.pgbuildfarm.org/register.html. When you receive your approval by &lt;br /&gt;
email, you will edit the &amp;quot;animal&amp;quot; and &amp;quot;secret&amp;quot; lines in your config file, &lt;br /&gt;
remove the --nosend flags, and you are done.&lt;br /&gt;
&lt;br /&gt;
=== Bugs === &lt;br /&gt;
Please file bug reports on the tracker at [http://pgfoundry.org/tracker/?atid=238&amp;amp;group_id=1000040&amp;amp;func=browse | pgFoundry ] &lt;br /&gt;
&lt;br /&gt;
=== Running on Windows ===&lt;br /&gt;
There are three build environments for Windows: Cygwin, MinGW/MSys, and Microsoft Visual C++. The buildfarm can run with each of these environments. This section discusses requirements for the buildfarm, rather than requirements for building on Windows, which are covered elsewhere.&lt;br /&gt;
&lt;br /&gt;
==== Cygwin ==== &lt;br /&gt;
There is almost nothing extra to be done for Cygwin. You need to make sure that cygserver is running, and you should set MAX_CONNECTIONS=&amp;gt;3 and CYGWIN=&amp;gt;'server' in the build_env stanza of the buildfarm config. Other than that it should be just like running on Unix.&lt;br /&gt;
&lt;br /&gt;
==== MinGW/Msys ====&lt;br /&gt;
For MinGW/MSys, you need both the MSys DTK version of perl installed, and a native Windows perl - I have only tested with ActiveState perl, which I have found to be rock solid. You need to run the main buildfarm script using the MSYS DTK perl, and the web transaction script using native Perl. that mean you need to change the first line of the run_web_txn.pl script so it reads something like:&lt;br /&gt;
  #!/c/perl/bin/perl&lt;br /&gt;
You should make sure that the PATH is set in your config file to put the Native perl ahead of the MSys DTK perl.&lt;br /&gt;
It's a good idea to have a runbf.bat file that you can call from the Windows scheduler. Mine looks like this:&lt;br /&gt;
  @echo off&lt;br /&gt;
  setlocal&lt;br /&gt;
  c:&lt;br /&gt;
  cd \msys\1.0\bin&lt;br /&gt;
  c:\msys\1.0\bin\sh.exe --login -c &amp;quot;cd bf &amp;amp;&amp;amp; ./run_build.pl --verbose %1 &amp;gt;&amp;gt; bftask.out 2&amp;gt;&amp;amp;1&amp;quot;&lt;br /&gt;
Set up a non-privileged Windows user to run this jobs as. set up the buildfarm as above as that user. Then create scheduler jobs that call runbf.bat with an optional branch name argument.&lt;br /&gt;
&lt;br /&gt;
==== Microsoft Visual C++ ====&lt;br /&gt;
For MSVC you need to edit the config file more extensively. Make sure the 'using_msvc' setting is on. Also, there is a section of the file specially for MSVC builds. As with MinGW, you need a native Windows perl installed. It appears that Windows Git does not like to clone local repositories specified with forward slashes (this is pretty horrible - almost all Windows programs are quite happy with forward slashes. Make sure you specify the repository using backslashes or weird things will happen. Again, you will need a runbf.bat file for the windows scheduler. Mine looks like this:&lt;br /&gt;
  @echo off&lt;br /&gt;
  c:&lt;br /&gt;
  cd \prog\bf&lt;br /&gt;
  c:\perl\bin\perl run_build.pl --verbose %1 %2 %3 %4 &amp;gt;&amp;gt; bfout.txt&lt;br /&gt;
You will also need a tar command capable of bundling up the logs to send to the server. The best one I have found for use on Windows is bsdtar, part of the libarchive collection at http://sourceforge.net/projects/gnuwin32/files/. This is also a good place to get many of the libraries you need for optional pieces of MSVC and MinGW builds.&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PgCon_2010_Developer_Meeting</id>
		<title>PgCon 2010 Developer Meeting</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PgCon_2010_Developer_Meeting"/>
				<updated>2010-05-20T14:27:22Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;s/Canova/Conova&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A meeting of the most active PostgreSQL developers and senior figures from PostgreSQL-developer-sponsoring companies is being planned for Wednesday 19th May, 2010 near the University of Ottawa, prior to pgCon 2010. In order to keep the numbers manageable, this meeting is '''by invitation only'''. Unfortunately it is quite possible that we've overlooked important code developers during the planning of the event - if you feel you fall into this category and would like to attend, please contact Dave Page (dpage@pgadmin.org).&lt;br /&gt;
&lt;br /&gt;
This is a PostgreSQL Community event. Room and lunch sponsored by EnterpriseDB. Other companies sponsored attendance for the their developers.&lt;br /&gt;
 &lt;br /&gt;
== Actions ==&lt;br /&gt;
&lt;br /&gt;
* Josh &amp;amp; Selena will '''track open items''' and make sure they get listed or tracked and resolved.&lt;br /&gt;
* Selena to '''get reviewers to do a review fest June 15'''&lt;br /&gt;
* '''Branch''' on July 1, CF July 15.&lt;br /&gt;
* '''Announce a plan''' for next development schedule.&lt;br /&gt;
* '''No more branching''' for alphas.&lt;br /&gt;
* Stephen's '''intern to develop PerformanceFarm application'''.  Will need help from Dunstan/Drake etc.&lt;br /&gt;
* Kaigai, Stephen, Smith, etc. to get together at pgCon and hash out some more security provider issues.&lt;br /&gt;
* Magnus to set up git environment emulator.&lt;br /&gt;
* Andrew to publish checklist of how to set up your Git&lt;br /&gt;
* '''Move to Git August 17-20''': Magnus, Haas, Dunstan.  Frost will be out.&lt;br /&gt;
* Koichi to '''extract patch from PostgresXC for snapshot cloning''' and submit.&lt;br /&gt;
* Koichi to '''come up with proposed patch design for XID feed'''&lt;br /&gt;
* Develop '''specification for commit sequence / LSN data'''&lt;br /&gt;
* '''[[DDL Triggers]] Wiki page to be updated''' with spec by Jan, Greg M, et al&lt;br /&gt;
* Dimitri to do '''patch (regarding extensions..)''' More detail?&lt;br /&gt;
* EDB '''to decide on opening code''' or not for SQL/MED&lt;br /&gt;
* '''Review Itagaki's git repo code''': Heikki, Peter SQL/MED&lt;br /&gt;
* '''Itagaki to keep working on API''' -- what about Peter? SQL/MED&lt;br /&gt;
* '''Document what the plan is to do a conversion upgrade''' (Greg Smith) -- pg_update&lt;br /&gt;
* '''Copy Zdenek's code''' (Greg Smith) related to pg_update&lt;br /&gt;
&lt;br /&gt;
== Time &amp;amp; Location ==&lt;br /&gt;
&lt;br /&gt;
The meeting will be from 9AM to 5PM, and will be in the O'Connor room at:&lt;br /&gt;
&lt;br /&gt;
 Arc The Hotel&lt;br /&gt;
 140  Slater Street&lt;br /&gt;
 Ottawa&lt;br /&gt;
 Ontario&lt;br /&gt;
 K1P 5H6&lt;br /&gt;
 &lt;br /&gt;
 [http://maps.google.ca/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=ARC+THE.HOTEL+|+140++Slater+Street,+Ottawa,+Ontario,+K1P+5H6&amp;amp;sll=49.891235,-97.15369&amp;amp;sspn=45.043582,78.486328&amp;amp;ie=UTF8&amp;amp;hq=ARC+THE.HOTEL+|&amp;amp;hnear=140+Slater+St,+Ottawa,+ON&amp;amp;z=16&amp;amp;iwloc=A Google Maps]&lt;br /&gt;
&lt;br /&gt;
Food and drink will be provided throughout the day.&lt;br /&gt;
&lt;br /&gt;
== Invitees ==&lt;br /&gt;
&lt;br /&gt;
The following people have RSVPed to the meeting:&lt;br /&gt;
&lt;br /&gt;
* Oleg Bartunov&lt;br /&gt;
* Josh Berkus&lt;br /&gt;
* Joe Conway&lt;br /&gt;
* Jeff Davis&lt;br /&gt;
* Selena Deckelmann&lt;br /&gt;
* Andrew Dunstan&lt;br /&gt;
* David Fetter&lt;br /&gt;
* Dimitri Fontaine&lt;br /&gt;
* Marc Fournier&lt;br /&gt;
* Stephen Frost&lt;br /&gt;
* Magnus Hagander&lt;br /&gt;
* Robert Haas&lt;br /&gt;
* Tatsuo Ishii&lt;br /&gt;
* Takahiro Itagaki&lt;br /&gt;
* KaiGai Kohei&lt;br /&gt;
* Marko Kreen&lt;br /&gt;
* Tom Lane&lt;br /&gt;
* Heikki Linnakangas&lt;br /&gt;
* Michael Meskes&lt;br /&gt;
* Bruce Momjian&lt;br /&gt;
* Dave Page&lt;br /&gt;
* Teodor Sigaev&lt;br /&gt;
* Greg Sabino Mullane&lt;br /&gt;
* Greg Smith&lt;br /&gt;
* Greg Stark&lt;br /&gt;
* Koichi Suzuki&lt;br /&gt;
* Joshua Tolley&lt;br /&gt;
* Robert Treat&lt;br /&gt;
* Jan Wieck&lt;br /&gt;
&lt;br /&gt;
== Agenda ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!Time&lt;br /&gt;
!Item&lt;br /&gt;
!Presenter&lt;br /&gt;
|- style=&amp;quot;font-style:italic;background-color:lightgray;&amp;quot;&lt;br /&gt;
|09:00&lt;br /&gt;
|Tea, coffee upon arrival	&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|09:15 - 09:25&lt;br /&gt;
|Welcome and introductions&lt;br /&gt;
|Dave Page&lt;br /&gt;
|-&lt;br /&gt;
|09:25 - 09:45&lt;br /&gt;
|Review of the 9.0 development process	&lt;br /&gt;
|Dave Page&lt;br /&gt;
|-&lt;br /&gt;
|09:45 - 10:35&lt;br /&gt;
|Development Priorities for 9.1: General discussion	&lt;br /&gt;
|Josh Berkus&lt;br /&gt;
|-&lt;br /&gt;
|10:35 - 10:45&lt;br /&gt;
|9.1 Development timeline&lt;br /&gt;
|Robert Treat&lt;br /&gt;
|- style=&amp;quot;font-style:italic;background-color:lightgray;&amp;quot;&lt;br /&gt;
|10:45 - 11:00&lt;br /&gt;
|Coffee break&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|11:00 - 11:15&lt;br /&gt;
|Performance QA/Performance Farm planning update&lt;br /&gt;
|Greg Smith&lt;br /&gt;
|-&lt;br /&gt;
|11:15 - 11:50&lt;br /&gt;
|Advanced access control features [[:Image:Pgcon2010-dev-security.pdf|(Slides)]]&lt;br /&gt;
* Steps to support [[ESP|external security providers]]&lt;br /&gt;
* [[RLS#Issues|Issues]] of row-level access control&lt;br /&gt;
|KaiGai Kohei&lt;br /&gt;
|-&lt;br /&gt;
|11:50 - 12:30&lt;br /&gt;
|CVS to GIT: The finale?&lt;br /&gt;
|Dave Page&lt;br /&gt;
|- style=&amp;quot;font-style:italic;background-color:lightgray;&amp;quot;&lt;br /&gt;
|12:30 - 13:30&lt;br /&gt;
|Lunch	&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|13:30 - 13:55&lt;br /&gt;
|[[ClusterFeatures#Export_snapshots_to_other_sessions|Snapshot Cloning]]&lt;br /&gt;
|Koichi Suzuki&lt;br /&gt;
|-&lt;br /&gt;
|13:55 - 14:20&lt;br /&gt;
|[[ClusterFeatures#XID_feed|XID feed for clones]]&lt;br /&gt;
|Koichi Suzuki&lt;br /&gt;
|-&lt;br /&gt;
|14:20 - 14:45&lt;br /&gt;
|[[ClusterFeatures#Modification_trigger_into_core_.2F_Generalized_Data_Queue|General Modification Queue]]&lt;br /&gt;
|Itagaki Takahiro, Jan Wieck, Marko Kreen&lt;br /&gt;
|-&lt;br /&gt;
|14:45 - 15:10&lt;br /&gt;
|[[ClusterFeatures#DDL_Triggers|DDL &amp;quot;triggers&amp;quot;]]&lt;br /&gt;
|Jan Wieck&lt;br /&gt;
|- style=&amp;quot;font-style:italic;background-color:lightgray;&amp;quot;&lt;br /&gt;
|15:10 - 15:25&lt;br /&gt;
|Tea break&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|15:25 - 15:55&lt;br /&gt;
|[[SQL/MED]] [[:Image:Pgcon2010-dev-sqlmed.pdf|(Slides from Heikki)]]&lt;br /&gt;
* Including: [[ClusterFeatures#Function_scan_push-down|function scan push-down]]&lt;br /&gt;
|Itagaki Takahiro&lt;br /&gt;
|-&lt;br /&gt;
|15:55 - 16:20&lt;br /&gt;
|Status report on Modules [[:Image:Pgcon2010-dev-extensions.pdf|(Slides)]]&lt;br /&gt;
|Dimitri Fontaine&lt;br /&gt;
|-&lt;br /&gt;
|16:20 - 16:45&lt;br /&gt;
|In-place upgrade with pg_migrator progress&lt;br /&gt;
|Bruce Momjian&lt;br /&gt;
|-&lt;br /&gt;
|16:45 - 17:00&lt;br /&gt;
|Any other business&lt;br /&gt;
|Dave Page&lt;br /&gt;
|- style=&amp;quot;font-style:italic;background-color:lightgray;&amp;quot;&lt;br /&gt;
|17:00&lt;br /&gt;
|Finish&lt;br /&gt;
|	&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Minutes ==&lt;br /&gt;
&lt;br /&gt;
= 2010 PostgreSQL Developer Meeting =&lt;br /&gt;
&lt;br /&gt;
Ottawa, Canada&lt;br /&gt;
&lt;br /&gt;
Present: Tatsuo Ishii, Andrew Dunstan, Bruce Momjian, David Fetter, Jeff Davis, Itagaki Takahiro, Koichi Suzuki, Josh Berkus, Dave Page, Dimitri Fontaine, Marko Kreen, Michael Meskes, Joe Conway, Josh Tolley, Greg Sabino-Mullaine, Selena Deckelman, Stephen Frost, Robert Treat, Robert Haas, Magnus Hagander, Kohei Kaigai, Heikki Linnakangas, Tom Lane, Jam Wieck, Oleg Bartunov, Teodor Sigaev, Marc Fournier, Greg Smith, Greg Stark, Peter Eisentraut (via Skype)&lt;br /&gt;
&lt;br /&gt;
== Review of The 9.0 Development Process ==&lt;br /&gt;
&lt;br /&gt;
How did the commitfest work?  Do we feel that the process worked in general, do we like Robert's CF application?  What other parts of the process should we improve?&lt;br /&gt;
&lt;br /&gt;
David Fetter commented that the writable CTE patch went through more than one CF without adequate feedback, and the patch got rejected.  Should we not allow things to be bumped, or not bumped twice?  Still listed as open on November Commitfest.  RH thinks feedback was provided but it might not have been very clear.  It ''was'' reviewed more than once.  RT: maybe we shouldn't be so quick to bump people in the last CF.  Writeable CTE wasn't bumped until Feb. 10.  Part of the issue is that it's a very complicated patch.&lt;br /&gt;
&lt;br /&gt;
JB feels that integration/testing needs to be more structured.  Still amorphous.  If we had more structure, maybe it would go faster.  RH we had a lot of open items, we closed them an released Beta1.  Agrees that we need more concrete critera.  BMomj: we end up with a pile of really hard problems which we don't know how to fix.  Even now can't fix max_standby_delay.  Needs to be a fire under someone.  Open items list is a big win, but doesn't show the scope of the problem.  Didn't have anything on open items list until this AM for Beta.  Need to reconstitute list.&lt;br /&gt;
&lt;br /&gt;
If stuff is on the open items list it stops release.  DF: maybe we should have ratings of complex/not?  Perhaps we need release manager to keep up on open items etc.?  Or Beta manager.  Not everyone knows what every open item is.  Someone should track the list and see status. Need list to know what to work on.  JB would like to put stuff on the open items list.  If there's a thread on hackers put it on the list.&lt;br /&gt;
&lt;br /&gt;
How do we get all the big patches in the first commitfest or second instead of last?  Assumes people are working while releasing.  Why didn't HS get into first commitfest.  Post-CF, prerelease is long and delays development, people take a vacation for 6 months.  Also the CF reviews were not very good for big patches.  CFs worked well for small/medium patches.  But for big patches not so great.  KNNGiST and WriteableCTE not so great.  HS at least didn't get into last commitfest.&lt;br /&gt;
&lt;br /&gt;
How much of a problem is this issue going to be for 9.1?  Do we have anything that large?  Synchronous Replication.  SQL/MED?&lt;br /&gt;
&lt;br /&gt;
Josh &amp;amp; Selena will track open items and make sure they get listed or tracked and resolved.&lt;br /&gt;
&lt;br /&gt;
== Priorities for 9.1 ==&lt;br /&gt;
&lt;br /&gt;
See [[PgCon_2010_Developer_Meeting#Development_Priorities_for_9.1|priority grid]] below.&lt;br /&gt;
&lt;br /&gt;
== Timeline for 9.1 ==&lt;br /&gt;
&lt;br /&gt;
Treat: Release in July, have an immediate commitfest of pending stuff. Will we release in July?  If we're late, do we want to drop a commitfest and have shorter cycle?  Maybe the development cycle should go, even if the release is delayed?  Lane doesn't think we have enough manpower for that.&lt;br /&gt;
&lt;br /&gt;
Issue is that people are waiting 6 months to resume development.  Are there enough reviewers, though?  Maybe we could have a reviewfest.  Haas thinks that we have manpower.  Berkus likes the idea of a reviewfest, new people.  Haas says that we could commit stuff or at least put it &amp;quot;pending commit&amp;quot;.  Smith says that pruning patches would be valuable.  What's the main bottleneck of people?  Maybe Kevin could run it.&lt;br /&gt;
&lt;br /&gt;
We would need to branch first.  Which would involve backpatching.   Branch on July 1, first CF on July 15?  Or 15 and August 1?  Tom Lane: if we're not close to releaseable by July 1, then it's not feasible.  Frost would like to have reviewfest in June.  We could ask for reviews right now.  RRRs need more direction.  Selena will help.&lt;br /&gt;
&lt;br /&gt;
In the future, do we want to start earlier?  We should get more people to help with getting to beta.  Get people on open items list.  Put it on the commitfest app?  Magnus: but that makes it closer to a bug tracker.  Haas: cycle of work is different for open items.  No, will use wiki instead.  Next year we'll have an open items app.&lt;br /&gt;
&lt;br /&gt;
Doing early branching will also help with bitrot.  And will help with people's work schedules.&lt;br /&gt;
&lt;br /&gt;
Plan is to start 9.1 development on July 15, and only delay if things blow up.&lt;br /&gt;
&lt;br /&gt;
Alpha releases unanimously good.  We might want to branch them differently.  Downloads weren't huge, 10s or maybe 100 per alpha.  But practice found issues with packaging, build scripts, etc.  Maybe we shouldn't create branches for them, though.  We should just tag it.  We just wanted it to say the right name.  This is probably fixed.  So, for 9.1 we'll have a patch for the tarball and not a branch.  Discussion of checkout/tag/branch detailed ensued.&lt;br /&gt;
&lt;br /&gt;
CFs need to have enough reviewers.  Need to recruit more?  Need to make it clear what's in it for reviewers.  Reviewers should be nominated for minor contributors.&lt;br /&gt;
&lt;br /&gt;
Actions:  &lt;br /&gt;
* Selena to get reviewers to start now.&lt;br /&gt;
* Branch on July 1, CF July 15.&lt;br /&gt;
* Announce as plan for schedule.&lt;br /&gt;
* No more branching for alphas.&lt;br /&gt;
&lt;br /&gt;
== Performance QA/Performance Farm ==&lt;br /&gt;
&lt;br /&gt;
Last year we took this as an issue at the meeting.  Holdup was pgBench needed overhaul; results were useless on Linux.  New pgBench should resolve those problems.  Got something in pgBench tools which tries to figure out number of threads.  Other thing which has been moving along well is benchfarm, and how should systems be set up to give reasonable performance.  Greenplum has nice utility called gperftest, people need to test hardware before running pgbench.  Nobody will let us benchmark high-end machines and talk about the results.  Smith has some new high-end machines to test performance results.&lt;br /&gt;
&lt;br /&gt;
Smith: we are ready to write a spec for a performancefarm client.  Need to build client for this.  Frost has an intern to work on Postgres stuff will be working on performance farm client.  Will be working for 8 weeks.&lt;br /&gt;
&lt;br /&gt;
Performancefarm also needs to run a battery of individual operations for performance regressions.  Also needs to run a quick hardware/OS test for comparability.  Need a general framework; maybe we'll eventually add DW test or TPCH.  &lt;br /&gt;
&lt;br /&gt;
Why do we keep the same dependancy restrictions as buildfarm?  It's easier to get clients that way.  If we can tell people that they can just add the PerformanceFarm to the buildfarm, it's easier.  Will go to assembled tool very soon.   Data collection will start with 9.0 because of old pgbench.   Biggest thing is to notice if someone's patch torpedoes performance.&lt;br /&gt;
&lt;br /&gt;
Propose that machines for the PerformanceFarm be named after plants.  ;-)&lt;br /&gt;
&lt;br /&gt;
What about replication performance?  Too big to take over.&lt;br /&gt;
&lt;br /&gt;
Actions: Stephen's intern to develop PerformanceFarm application.  Will need help from Dunstan/Drake etc.&lt;br /&gt;
&lt;br /&gt;
== Advanced Security Features ==&lt;br /&gt;
&lt;br /&gt;
KaiGai's Presentation &amp;lt;link?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We try to load something externally to make access control decisions.  Row-level access controls have a number of issues.  &lt;br /&gt;
&lt;br /&gt;
PostgreSQL currently has logic &amp;amp; access controls in the same place.  (1) rework external check using same flow.  (2) add label support.  (3) add SELinux support.  New method will have clear separation between Postgres and SELinux, possibly using a loadable module.  &lt;br /&gt;
&lt;br /&gt;
Rework of access controls needs to do all of the access control checks at once instead of one at a time with query in between.  Need to do one object at a time because otherwise it's too big.  That way patches are only 200-500 lines each.&lt;br /&gt;
&lt;br /&gt;
Finally, add security labels to objects.&lt;br /&gt;
&lt;br /&gt;
The concern with the rework was that moving all of the security checks into a separate area was that that area needed to have knowledge about everything.   Haas: need to provide a clean interface to security providers, but not by changing huge amounts of code.  Heikki: it's not that big, it's fairly mechanical.  &lt;br /&gt;
&lt;br /&gt;
Currently we check some basic things (like does the table exist) and later we check fine-grained permissions.  Completely isolating it not possible.  Locks for one thing.  Also it's difficult to have a clean API because the API needs to know about everything.  Kaigai says that generalized interface isn't necessary, Linux has had to add to the API with each new security provider.&lt;br /&gt;
&lt;br /&gt;
Why can't we put calls in the current aclcheck?  Too low-level, don't pass enough information to them.  We could pass more.  But if we have the OID, we can look up all of the class information.  Right now we have duplicate permissions checks all over the code.  And the checks we need to do are not necessarily the same checks which SE wants to do.&lt;br /&gt;
&lt;br /&gt;
Smith: what users want isn't necessarily what we have in the patch.  Maybe we should just build a subset of functionality, a lot of people don't care about DDL etc.  We could implement only SELECT security, it would make the patch more digestible.  All permissions checks for SELECT are all in one place.  Or DML only.&lt;br /&gt;
&lt;br /&gt;
Does the information provided supply enough?  It has to be because it's the first stage.  It's basically the information the user entered.  &lt;br /&gt;
&lt;br /&gt;
Is DML-only enough?  Will it leak?  Of course.  Anyway, it's useful simplication.  Smith says 95% of use cases are solved by that.  Table discussion of all of the ACL checks.  Kaigai says that checks are the same for DML and DDL, but others do not agree.&lt;br /&gt;
&lt;br /&gt;
Security Label discussion.  Access control decisions operated by Subject, Target, Action.  Label replaces Target.  Syntax introduced, ALTER ... SET WITH SECURITY LABEL, SECURITY LABEL TO label.  Simplified suggestion, just add seclabel[] text to catalogs.  But wastes space and hurts peformance.  &lt;br /&gt;
&lt;br /&gt;
Should SELinux be in core or be loadable module?  &lt;br /&gt;
&lt;br /&gt;
Actions: Kaigai, Stephen, Smith, etc. to get together at pgCon and hash out some more issues.&lt;br /&gt;
&lt;br /&gt;
== CVS to GIT ==&lt;br /&gt;
&lt;br /&gt;
Its probably clear that we should change to a new VCS, and it should be GIT. No disagreement. &lt;br /&gt;
&lt;br /&gt;
What are the gating factors to moving now?  Let's make a decision to do it, and when and we'll fix the issues.  Problem with buildfarm has been solved.  Buildfarm now runs git.  Building Git on any older platform is impossible; bad make files.  Getting all buildfarm members running Git wouldn't be possible, but we can run CVS mirror for older ones.&lt;br /&gt;
&lt;br /&gt;
We have a checklist on the wiki already for switching.&lt;br /&gt;
&lt;br /&gt;
Most buildfarm members will run either; it's a config item.  We'll track which ones are using the emulator.  &lt;br /&gt;
&lt;br /&gt;
Building older versions may have issues to build identically.  Magnus claims that it's been fixed.  How much do we care about old tags?  There are still a couple of bad files but they're minor.  Do we still have old issues with CVS?  Marc says they're fixed, shouldn't show up in Git history.&lt;br /&gt;
&lt;br /&gt;
Are commit e-mails an issue?  No.  But e-mails will look different.  Tom wants them to just work the same.  &lt;br /&gt;
&lt;br /&gt;
We don't need to solve technical issues here.  Just pick a date.  We'll know when we're doing it and that everything will suck for a month afterwards.  Will need to be a low-stress time for the project, between commitfests.  Tom isn't sure how to apply commits across multiple branches.  Discussion of Git details hashed out.&lt;br /&gt;
&lt;br /&gt;
Two issues: sheer space usage.  Second, management of commits.  But these are not serious problems.  Andrew has checklist.  Will need to test stuff and decide how to do specific stuff.  Suggestion on date: after 2nd commitfest.  No, halfway after first commitfest.  No, immediately after first commitfest ... August 20th or similar.&lt;br /&gt;
&lt;br /&gt;
We will have git super-master which synchs to git.postgresql.org.  Can do receive hooks.  Have we considered using github?  Github should not be canonical source, in case they go away.  Can't do postcommit hooks on Github.  People can just do both.  Forking Postgres repo puts you near their limit.  Put off Github questions.&lt;br /&gt;
&lt;br /&gt;
Issue: what about the name?  People will need to reclone, will be part of suckitude.  Rename old repo and create new repo.  Where will secret master repo be?  Maybe Conova.&lt;br /&gt;
&lt;br /&gt;
Mapping usernames onto e-mail addresses could be a pain.  Maybe we should standardized onto committer@postgresql.org.  Committers should pick names before conversion.&lt;br /&gt;
&lt;br /&gt;
Discussion about commit messages, merges, commits, etc. ensued.&lt;br /&gt;
&lt;br /&gt;
Action: &lt;br /&gt;
* Magnus to set up emulator.&lt;br /&gt;
* Andrew to publish checklist of how to set up your Git&lt;br /&gt;
* Move to Git August 17-20: Magnus, Haas, Dunstan.  Frost will be out.&lt;br /&gt;
&lt;br /&gt;
== Lunch ==&lt;br /&gt;
&lt;br /&gt;
== Clustering ==&lt;br /&gt;
&lt;br /&gt;
=== Snapshot Cloning ===&lt;br /&gt;
&lt;br /&gt;
Koichi: had meeting in Tokyo, and make a list of core APIs which clustering projects could use.  Snapshot cloning is one such, plus it's useful for parallel query and parallel pg_dump.  First use snapshot cloning to enforce consistent view of the database.  Has already implemented this for PostgresXC.  The same thing could be applicable for single PostgreSQL.  It is a very simple implementation, and should not produce resource conflicts.&lt;br /&gt;
&lt;br /&gt;
For parallel pg_restore, maybe snapshot cloning will not be sufficient.   Cloning the snapshot for read-only transactions is simple, not for write transactions.  &lt;br /&gt;
&lt;br /&gt;
Smith: Using this for parallel query also works for read-only cloning.&lt;br /&gt;
&lt;br /&gt;
Very useful for dumping partitioned tables, with one backend for each partition.  &lt;br /&gt;
&lt;br /&gt;
Added API to libpq.  But shouldn't this be a server-side command?  For cluster usage, it was useful for it to be in libpq.  RH: one idea is a function we could call, and the shared snapshot would use a &amp;quot;cookie&amp;quot;.  Joachim W. wrote a patch with publish/subscribe.  Needs to be all server-side.  &lt;br /&gt;
&lt;br /&gt;
Tom has suggestion for simpler implementation, without locks.  That is, you just need to have same snapshot start, not shared snapshot.  Snapshot would die once the original transaction was gone.  Koichi: this is not a problem.&lt;br /&gt;
&lt;br /&gt;
Tom: maybe we could just use a prepared transaction, which would keep the snapshot valid.  Proposing to begin with read-only implementation.&lt;br /&gt;
&lt;br /&gt;
Action: Koichi to extract patch from PostgresXC and submit.&lt;br /&gt;
&lt;br /&gt;
== XID Feed ==&lt;br /&gt;
&lt;br /&gt;
PostgresXC needs to have a transaction run on multiple servers in the same cluster.    The XID is needed so that you can have the same transactions.  Will also be useful for parallel write operation, but that's really complicated.  Parallel backend needs to be assigned same XID, but locks, resource conflicts.&lt;br /&gt;
&lt;br /&gt;
Heikki: let's start with parallel read queries.&lt;br /&gt;
&lt;br /&gt;
JB: parallel write on one server is a different feature than XID feed for clustering.&lt;br /&gt;
&lt;br /&gt;
Multiple backends share the same XID so they can share the same snapshot.  If you're doing a multimaster update across multiple servers so you can maintain serialization.  Stark explains multi-server deadlock situation.&lt;br /&gt;
&lt;br /&gt;
The XID is not the issue, it's the commit order.  But communicating the xids means that you don't need to communicate more data to the servers.  Just maintaining transaction IDs isn't enough, we need to maintain commit/abort info.  If you want a snapshot which is valid on both nodes, you'd have to lock the procarray on both.  You'd have to have a single global transaction manager controlling commits.&lt;br /&gt;
&lt;br /&gt;
What is the core feature here?  You might want to make a specific instance of Postgres the global transaction manager.  Or you might make one postgres a consumer of snapshots.  Heikki: you could interrogate each node about what transactions were running at the time of the snapshot.  Some discussion without agreement.&lt;br /&gt;
&lt;br /&gt;
Koichi explains how snapshots are distributed in PostgresXC, they receive them with XID.  There's no negotiation between nodes.  What stability would this affect with core Postgres?  Vacuum and analyze need their own GXID.  &lt;br /&gt;
&lt;br /&gt;
What is the feature: getting XID and Snapshot from PostgreSQL.  Is this useful for core Postgres?  Does it work for other cluster systems other than PostgresXC.  Would be useful for all synchronous multi-master replication.  Like Postgres-R.  Or any distributed databases.  Should be done as a &amp;quot;hook&amp;quot;.  Not really different from two-phase commit, but not testable without an external manager, which is the main problem.  How could you test it?&lt;br /&gt;
&lt;br /&gt;
What other things do you need?  What other hooks would we need in core to support GTM and other clustering functionality?  If we had SQL/MED working, you could export XIDs to remote tables.  But we don't have that yet.&lt;br /&gt;
&lt;br /&gt;
A hook will be fine.&lt;br /&gt;
&lt;br /&gt;
Action: Koichi to come up with proposed patch design&lt;br /&gt;
&lt;br /&gt;
=== General Modification Queue ===&lt;br /&gt;
&lt;br /&gt;
Marko: one use case is transactional que.  Have some sample imentations in pgQ and Slony.  Two different stragies: Slony/Londiste, and Josh wants to replicate data to external non-PostgreSQL tables.  Josh is mainly concerned about write overhead, but no way around WAL.&lt;br /&gt;
&lt;br /&gt;
What is not solved by current LISTEN/NOTIFY?  What this has is potential for really improving.  Both Slony and pgQ rely on being able to filter out blocks of events and serialized sequence of individual events.  Problem is eventID sequence number cannot be cached, that causes painful overhead.  Both systems come up with insert/update/delete statements which go by index scan.&lt;br /&gt;
&lt;br /&gt;
If we can support general functions where a trigger can hand in old and new tuples and the receiver can get something which allows it to pull new data.  Seems like commit order is the issue.  Why do you need a sequence which can't be cached?  If you knew what order they committed ... you wouldn't need a global counter.  Jan isn't sure this makes sense for core because of lack of version independance.&lt;br /&gt;
&lt;br /&gt;
If you had a stream of commit information, you'd just have to buffer it.  But that could work.  The real missing piece is a commit ordering stamp, which the database should supply for you.  This was a requirement of Postgres-R as well, they need to know what order to apply the writeset in.&lt;br /&gt;
&lt;br /&gt;
We could use the LSN of the commit record as that number.  In the CLOG, for a range of XIDs, we have some LSNs.  But it's not enough information.  It sounds like all that's really needed is to have a way to grab LSN numbers.  Maybe write it to a separate file.&lt;br /&gt;
&lt;br /&gt;
Commit-order table would need to be truncated.  The clients have to send message about being done with it.  Do we want to call gettimeofday while holding walinsertlock?  Tom: we already are, but it's not exact enough.  LSN plus approximate timestamp would give you order.&lt;br /&gt;
&lt;br /&gt;
Clients would need to look and say grab all transactions between one LSN and another.&lt;br /&gt;
&lt;br /&gt;
Action:&lt;br /&gt;
* Develop specification for commit sequence / LSN data&lt;br /&gt;
&lt;br /&gt;
=== DDL Triggers ===&lt;br /&gt;
&lt;br /&gt;
Jan: it's a feature we've been missing for at least a decade.  Jan starting to work on it, but DDL code is very messy.  It's in tcop_utility.c function process_utility.  The mess is that while the function gets a query string some calls don't put a real query string in there.  &lt;br /&gt;
&lt;br /&gt;
Purposes include enforcement of complex CREATE requirements.  Also replicating DDL to replicas.  Wouldn't you like it better if the data were passed to the trigger using some kind of structured data rather than a query string.  Take node structure of utility statement and create query string which can be passed, as well as passing node structure using nodetostring.&lt;br /&gt;
&lt;br /&gt;
We haven't exposed nodetostring because it's not a stable API.  But generally changes there indicate changes in features.  But if we could give the trigger an object name.  Maybe we could pass before-and-after snapshots.&lt;br /&gt;
&lt;br /&gt;
How do Oracle and other systems get this data?&lt;br /&gt;
&lt;br /&gt;
Also there's an issue that some utility statements call other utility statements.  &lt;br /&gt;
&lt;br /&gt;
Nodetostring exposure was also vetoed for other reasons.  Slony and other systems can take a tree instead.  Maybe we should already have a utility function.  We already theoretically have a hook, but it's not being used.  And also still a problem with recursive calls.&lt;br /&gt;
&lt;br /&gt;
pgAdmin wants a notification for changes.  Would need some notification with data about object changed.  But just object changed would be enough.  We could also build up a set of events for DDL changes over time based on the tree ... we can start with just objectype and objectID.  And type of modification: create, drop, alter.&lt;br /&gt;
&lt;br /&gt;
ProcessUtilityHook is there, but the problem is how it's exposed to the user.  Hooks aren't used consistently and you don't know who has set it in what modules.  Several people are already using it.  Ordering becomes a problem.  People don't want to use the hook.&lt;br /&gt;
&lt;br /&gt;
We also want a userspace implementation.  Like maybe a trigger.&lt;br /&gt;
&lt;br /&gt;
Action:&lt;br /&gt;
* Wiki page to be updated with spec by Jan et. all.&lt;br /&gt;
&lt;br /&gt;
== Status Report on Modules ==&lt;br /&gt;
&lt;br /&gt;
Slides from Dimitri&lt;br /&gt;
&lt;br /&gt;
Many issues and topics.  Talking today about dump/reload support.  If you dump and restore, you don't want to restore objects.  We want to support any source language.  We want to support custom GUCs and versions in extensions.  We also want upgrading factilities.&lt;br /&gt;
&lt;br /&gt;
We are not going to talk about schema.  We are not going to talk about souce level packaging, ACLs, PGAN or OS packaging and distribution.  Example of extensions/foo/control.  Should be in user/share.  Control file will have name, version, custom_variable_classes.&lt;br /&gt;
&lt;br /&gt;
Then you can just do install extension foo, drop extension foo.  pg_restore would call install extension foo and not its objects.&lt;br /&gt;
&lt;br /&gt;
Need dependancies on extensionID in pg_depends so we know what belongs to the extension.&lt;br /&gt;
&lt;br /&gt;
Used name = value because we already know how to parse them in control file.  pg_dump will be easy, we will know how to exclude based on dependancies.  uninstall.sql files will be replaced by this.  &lt;br /&gt;
&lt;br /&gt;
What do we do about user-modifiable tables which are associated with a module?  This is similar to how debian deals with config files.  Or we could allow install files have items which aren't tracked as part of the module, and pg_restore would need to know about that.&lt;br /&gt;
&lt;br /&gt;
Should extensions have different versions or different names per version?  The install script is just a sql file, you can add a DO script.  Debian handles this by checking if the configuration is the default and replacing it, or failing over to the user afterwards.  &lt;br /&gt;
&lt;br /&gt;
Need license information in the control file.&lt;br /&gt;
&lt;br /&gt;
We probably just need to punt configuration tables to version 2.&lt;br /&gt;
&lt;br /&gt;
Will this help pg_upgrade?  Maybe. Right now you have to migrate shared libs yourself.  Will fix some cases.&lt;br /&gt;
&lt;br /&gt;
Action:&lt;br /&gt;
* Dimitri to do patch&lt;br /&gt;
&lt;br /&gt;
== SQL/MED ==&lt;br /&gt;
&lt;br /&gt;
Slides by Heikki.&lt;br /&gt;
&lt;br /&gt;
Heikki: in EDBAS, we already have foriegn tables.  CREATE FOREIGN TABLES syntax.  EDB has libpq, Oracle and ODBC.  Shows slide with join plan; currently materialize locally.&lt;br /&gt;
&lt;br /&gt;
Have to decide what plans you can push to the remote database. Not all remote sources can handle all structures, including functions, joins etc.  Even between PostgreSQL ruleutils.c is different for each version.&lt;br /&gt;
&lt;br /&gt;
Proposed FDW planner API.  Pass parse tree, needs to say what it can take.  How do we not duplicate the entire planner in the API.  EnterpriseDB has been working on this but company has not committed to contributing it.&lt;br /&gt;
&lt;br /&gt;
Jan mentioned that at least a wrapper has to take a scan.  &lt;br /&gt;
&lt;br /&gt;
Itagaki:  didn't know EDB was also working on SQL/MED.  Code is probably completely different.  There's four issues: any features it should consider about.  Currently considering dbLink and COPY FROM.  Maybe there should be other features, like GDQ.  &lt;br /&gt;
&lt;br /&gt;
Josh: what about PL/proxy?  SQL/MED should support the functionality of PL/proxy. &lt;br /&gt;
&lt;br /&gt;
What is the best design to support access methods for tables?  Postgres AMs for indexes, we need AMs for FDWs. Update is a problem, may start with select and insert.&lt;br /&gt;
&lt;br /&gt;
How to push WHERE conditions to FDW?  Itagaki's WIP code uses internal tree, requires C code in FDW to parse.  Might be unstable for that reason.   External server might not be SQL server, so passing SQL isn't that useful.&lt;br /&gt;
&lt;br /&gt;
FDW vs. SRF ... can we merge these somehow?  Current implementation of functionscan is to materialize.  We didn't do value-per-call because it was difficult with PL/pgSQL.  So we just materialized it.&lt;br /&gt;
&lt;br /&gt;
Heikki suggested that we don't use the FDW API from the SQL committee because nobody uses it.    Supplies function for reaching into planner but can't imagine how it would work.  EnterpriseDB implements pipeline.&lt;br /&gt;
&lt;br /&gt;
Also, an issue is cost estimation.  How do we know how much it would cost.  Statistics on remote tables?  We could store them.  It would also be nice to have joins take place on the remote server, but that's version 2 or 3.  &lt;br /&gt;
&lt;br /&gt;
Also what about indexes on the remote server.  One implementation in Japan has CREATE FOREIGN INDEX.  Creating definitions locally of remote schema are very useful.  DB2 implemented this and had commands to define foreign objects.&lt;br /&gt;
&lt;br /&gt;
Maybe we don't need to be really smart about this in the first version.  But people are asking for this.  Pass whole query to remote server.  Wouldn't work for joins, but would work for union query.  Defining an index on a FDW doesn't make much sense since we don't know what the costs are like over there.  We should just have a function in the API.&lt;br /&gt;
&lt;br /&gt;
How would we recognize that we want to do the join on the remote server.  We just need costs from the FDW.  But we could also keep them in pg_stats.  FDW might be used to access complex database like Infobright or Bigtable.  &lt;br /&gt;
&lt;br /&gt;
Would EDB contribute a patch?  Or just the rights for Heikki to steal bits?  Patch from EDBAS would not work.  Does the EDB patch help Itatgaki?  EDB might get Itagaki access to the code.&lt;br /&gt;
&lt;br /&gt;
Action:&lt;br /&gt;
* EDB to decide on opening code or not&lt;br /&gt;
* Review Itagaki's git repo code: Heikki, Peter&lt;br /&gt;
* Itagaki to keep working on API -- what about Peter?&lt;br /&gt;
&lt;br /&gt;
== pg_migrator ==&lt;br /&gt;
&lt;br /&gt;
Bruce: Just fixed a but in pg_upgrade for XID wraparound.  Added docs.  Migrator tries to rebuild a plane in the air. Bruce feels like he has a swiss army knife with pg_upgrade.  Issue with FrozenXIDs in template0 fixed.  Still a work in progress, which is why it's in contrib, still a work in progress but bugs are fixable.&lt;br /&gt;
&lt;br /&gt;
Will still have issues with page format, binary format changes.  Haven't had those for a while, may not need them, and a dump &amp;amp; restore every 4-5 years is an improvement.  Bunches of people have used it to migrate.  The tool makes sure that it doesn't corrupt your data, it goes back if it hits an error.&lt;br /&gt;
&lt;br /&gt;
Stark: In the past we've had a chicken-and-egg issue if people wanted to make changes to the data format, we'd need a conversion function.  And there's no hooks in pg_migrator.  Could slow down the pace of adding features.  We should add the functionality to do the conversion now.&lt;br /&gt;
&lt;br /&gt;
pg_upgrade from EDB has hook for COPY mode for conversion.  And then what's the point of pg_migrator?  If you don't have to rebuild indexes.  But a lot of times you'd have to.  But to have it in place so that it's not a hurdle for a data change.  If we're going to do that we need to do it for 9.1 early in the cycle.&lt;br /&gt;
&lt;br /&gt;
Dump and reload is impossible for Smith's customers.  page checksum thing is a good example.  Read-on-conversion is a big performance hit.  Background process to convert all old data.  &lt;br /&gt;
&lt;br /&gt;
Also issue around internal representation of data type change.  We either have to convert it, or have versioned data types.&lt;br /&gt;
&lt;br /&gt;
Is binary data conversion really faster?  Read back one version, and convert while running.  Something which can read one version level back and can convert is the only viable way.  Would have a daemon to convert data.  What about split pages, bigger page headers.&lt;br /&gt;
&lt;br /&gt;
CRC would be a good test for this.  It's a small patch but has a lot of common upgrade issues.  And it would be only one patch so we could put it off for another version if we had to.  Would like to get this started for 9.1.  CRC requires dealing with the split pages issue.&lt;br /&gt;
 &lt;br /&gt;
Really tricky stuff includes changing indexing structure.  Would need concurrent rebuild for unique indexes and primary keys.  REINDEX concurrently was a deadlock concern.  &lt;br /&gt;
&lt;br /&gt;
What about writing?  Convert-on-read.  &lt;br /&gt;
&lt;br /&gt;
Action:&lt;br /&gt;
* Document what the plan is to do a conversion upgrade (Greg Smith)&lt;br /&gt;
* Copy Zdenek's code (Greg Smith)&lt;br /&gt;
&lt;br /&gt;
== Other Business ==&lt;br /&gt;
&lt;br /&gt;
Treat: Mammoth Replicator into Core?  Code has been BSD-licensed.  Has features which don't exist in Hot Standby.  Code is pretty big.  Alvaro would say that it's not in great shape to contribute at this point.&lt;br /&gt;
&lt;br /&gt;
Has log-based replication including per-table.  Has its own logs, and has binary vs. SQL replay.  Not trigger-based.  &lt;br /&gt;
&lt;br /&gt;
Real question is would we consider putting any replication solution into Core?  Not until we've finished digesting HS/SR.    Replication is one word for a dozen different solutions for 3 dozen problems.  We've accepted one which solves some problems.  Page things we should consider each case on its merits.&lt;br /&gt;
&lt;br /&gt;
Question is what parts of Mammoth make sense to be in core.  Bruce thinks that mammoth is so tied into the backend that we couldn't accept it.  It's too complicated.  It doesn't sound like Mammoth offers enough functionality to make it worth it.&lt;br /&gt;
&lt;br /&gt;
Does mammoth need to be in core?  It has grammar changes.  We now have better ideas of what replication requirements are, we may have more commonalities in core in the future.  Part of the reason have so many because we don't have one in Core.&lt;br /&gt;
&lt;br /&gt;
We'd consider more replication in core, but maybe not Mammoth.&lt;br /&gt;
&lt;br /&gt;
Action:&lt;br /&gt;
* None&lt;br /&gt;
&lt;br /&gt;
== Other Business ==&lt;br /&gt;
&lt;br /&gt;
Peter says we're almost compliant with SQL 2008.  Is it of PR value to comply with the remaining random stuff?  People don't think so.  &lt;br /&gt;
&lt;br /&gt;
What about Case Folding?  We probably don't want to fix that.  Wasn't on Peter's list, which is just features.  Case Folding would break a lot of stuff.  Thought Peter was already doing that with a couple of features per version.&lt;br /&gt;
&lt;br /&gt;
Compliance is only of moderate value.  Is there a point of implementing the features on Peter's list?&lt;br /&gt;
&lt;br /&gt;
Summer of Code: how is it going?&lt;br /&gt;
&lt;br /&gt;
Haas has concern.  His student is working on Materialized Views.  Has proposed a very basic implementation.  Might not be able to do even that.  We can fail people.&lt;br /&gt;
&lt;br /&gt;
Selena just updated the open items on the mailing list.  A lot of items were not closed on the mailing list.&lt;br /&gt;
&lt;br /&gt;
What about max_standby_delay?  Tom wants to go back to just a boolean.  What about Tom's original proposal?  Can't really do it.  Tom wants to remove time dependancy.  What are the issues with max_standby_delay?  Idle time on the master uses up time on the standby.  Plus NTP and keepalives and some other stuff.&lt;br /&gt;
&lt;br /&gt;
Major discussion on max_standby_delay ensued.&lt;br /&gt;
&lt;br /&gt;
== Development Priorities for 9.1 ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!Feature&lt;br /&gt;
!Developers&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|MERGE/UPSERT/REPLACE&lt;br /&gt;
|GSoC with Greg Smith/Simon&lt;br /&gt;
|Issues with predicate locking&lt;br /&gt;
|-&lt;br /&gt;
|Synchronous replication&lt;br /&gt;
|Fujii/Zoltan/Simon&lt;br /&gt;
|Review by Heikki&lt;br /&gt;
|-&lt;br /&gt;
|Improve Hot Standby/Streaming Rep usability&lt;br /&gt;
|Simon/Fujii/Greg Smith&lt;br /&gt;
|Review by Josh Berkus&lt;br /&gt;
|-&lt;br /&gt;
|Snapshot cloning API&lt;br /&gt;
|Koichi&lt;br /&gt;
|Sample app is parallel pg_dump&lt;br /&gt;
|-&lt;br /&gt;
|Locale/encoding &lt;br /&gt;
|&lt;br /&gt;
|per column/per operator collation&lt;br /&gt;
|-&lt;br /&gt;
|User exposed predicate locking&lt;br /&gt;
|Simon&lt;br /&gt;
|Interaction with serialization&lt;br /&gt;
|-&lt;br /&gt;
|Serializable&lt;br /&gt;
|Kevin Grittner&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|pg_upgrade in core&lt;br /&gt;
|Bruce&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|External security provider&lt;br /&gt;
|KaiGai&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Row-level security&lt;br /&gt;
|KaiGai&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Writeable CTEs&lt;br /&gt;
|Marko Tiikkaja &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SQL/MED&lt;br /&gt;
|Itagaki&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Generalized inner-indexscan plans&lt;br /&gt;
|Tom Lane&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Re(?)plan parameterized plans with actual parameter values&lt;br /&gt;
|Tom Lane&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|COPY as a FROM clause&lt;br /&gt;
|Andrew Dunstan&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Pipelining/value per call for SRFs&lt;br /&gt;
|Joe Conway&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Partitioning implementation&lt;br /&gt;
|Itagaki&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Index only scans&lt;br /&gt;
|Heikki&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Global temp/unlogged tables&lt;br /&gt;
|Robert Haas&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Inner join removal&lt;br /&gt;
|Robert Haas&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Extensions&lt;br /&gt;
|Dimitri&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Range types&lt;br /&gt;
|Jeff Davis&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Materialized views&lt;br /&gt;
|GSoC+Robert Haas&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|JSON data type&lt;br /&gt;
|GSoC&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|DDL Triggers&lt;br /&gt;
|Jan&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Leaky view security&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|KNNGist&lt;br /&gt;
|Teodor&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Performance farm&lt;br /&gt;
|Greg Smith&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Git&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|PGAN&lt;br /&gt;
|David Wheeler&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:PostgreSQL Events]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Performance_QA_Testing</id>
		<title>Performance QA Testing</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Performance_QA_Testing"/>
				<updated>2010-03-13T18:24:21Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;/* Datasets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page centralizes the efforts on performances QA testing: available hardware, available tools, continuous benchmarking effort...&lt;br /&gt;
&lt;br /&gt;
The PostgreSQL Performance lab is being created to allow community members of the Open Source database [http://www.postgresql.org/ PostgreSQL] to have enterprise class hardware to test on.&lt;br /&gt;
&lt;br /&gt;
The testing that will occur includes industry standard workloads such as OLTP, DSS and BI. Furthermore we will also use the hardware for other practical and customer oriented testing to improve scalability (processor utilization, i/o, load balancing, etc.) and managing large data sets (loading, backups, restores, replication, etc).&lt;br /&gt;
&lt;br /&gt;
=== Donations ===&lt;br /&gt;
&lt;br /&gt;
For donation inquiries, please contact [mailto:josh@postgresql.org Josh Berkus &amp;lt;josh @t postgresql.org&amp;gt;] and [mailto:jdrake@postgresql.org Joshua Drake &amp;lt;jdrake @t postgresql.org&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
=== Mailing List ===&lt;br /&gt;
&lt;br /&gt;
There is a [http://lists.pgfoundry.org/mailman/listinfo/perflab-general mailing list] available to discuss administrative aspects of community equipment.  Please continue to use the -hackers and -performance mailing lists for performance and technical discussions.&lt;br /&gt;
&lt;br /&gt;
== QA platforms ==&lt;br /&gt;
&lt;br /&gt;
* [[QA Platform hosted at Command Prompt]] - Portland, Oregon, USA&lt;br /&gt;
* [[QA Platform hosted at Open Wide (France)]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* Former OSDL work: [http://osdldbt.sourceforge.net/ Database Test Suite] and [http://crucible.svn.sourceforge.net/viewvc/crucible/ Web interface]&lt;br /&gt;
* [http://www.westnet.com/~gsmith/content/postgresql/pgbench-tools.htm pgbench-tools from Greg Smith].  See [[Regression Testing with pgbench]].&lt;br /&gt;
* [http://bristlecone.continuent.org/HomePage Bristlecone from Continuent]&lt;br /&gt;
* [http://tsung.erlang-projects.org/ Tsung load injector] allows to define sessions (containing queries and thinktime, etc) and replay them with very high concurrency setup. Can use many loading nodes at a time, multi OS support (written in [http://www.erlang.org/ erlang], extensible in this language)&lt;br /&gt;
* [http://dim.tapoueh.org/temp/tsung-plotter/ Tsung Ploter] plots several tsung runs onto the same graphs set, for easy comparing. Uses python and matplotlib.&lt;br /&gt;
* Tsung DBT2 Implementation (tsung module in erlang), WIP, to get published asap.&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
&lt;br /&gt;
* look into [http://sysbench.sourceforge.net/ sysbench] - it has some issues with locking on postgresql but at least read-only it seems to work fine&lt;br /&gt;
&lt;br /&gt;
* collecting all the various small samples and testcases posted over the last few years on -performance, -hackers &amp;amp; -bugs and put them into a test set&lt;br /&gt;
&lt;br /&gt;
* consider doing tests using pgbench -M (simple|extended|prepared) to catch regressions in one of those modes&lt;br /&gt;
&lt;br /&gt;
* resurrect Jan Wiecks tpc-w implementation available on [http://pgfoundry.org/projects/tpc-w-php/ pgfoundry]&lt;br /&gt;
&lt;br /&gt;
* add full text search benchmarking by using [http://www.sigaev.ru/cvsweb/cvsweb.cgi/ftsbench/ ftsbench] from teodor&lt;br /&gt;
&lt;br /&gt;
* XML benchmarking ?&lt;br /&gt;
&lt;br /&gt;
* investigate [http://advogato.org/person/nconway/diary.html?start=21 QuickCheck] and http://advogato.org/person/nconway/diary/23.html&lt;br /&gt;
&lt;br /&gt;
* Implement the [http://www.cs.umb.edu/~poneil/StarSchemaB.PDF Star Schema Benchmark].&lt;br /&gt;
&lt;br /&gt;
== Datasets ==&lt;br /&gt;
&lt;br /&gt;
Some public datasets that could be used to get realistic data for various kind of benchmarks:&lt;br /&gt;
&lt;br /&gt;
* [http://www.freebase.com/docs/data_dumps Freebase] - Various wiki style data on places/people/things - ~600MB compressed&lt;br /&gt;
* [http://www.imdb.com/interfaces#plain IMDB] - the IMDB database - see also http://code.google.com/p/imbi/&lt;br /&gt;
* [http://www.data.gov/ ] - US federal government data collection see also [http://www.sunlightlabs.com/ sunlightlabs]&lt;br /&gt;
* [http://wiki.dbpedia.org/Downloads DBpedia] - wikipedia data export project&lt;br /&gt;
* [http://linux.dell.com/dvdstore/ Dell DVDstore] - Dells DVD Store context data&lt;br /&gt;
* [http://www.eoddata.com/ eoddata] - historic stock market data (requires registration - licence?)&lt;br /&gt;
* [http://www.transtats.bts.gov/Tables.asp?DB_ID=120&amp;amp;DB_Name=Airline%20On-Time%20Performance%20Data&amp;amp;DB_Short_Name=On-Time RITA] - Airline On-Time Performance Data&lt;br /&gt;
* [http://wiki.openstreetmap.org/wiki/Planet.osm Openstreetmap] - Openstreetmap source data&lt;br /&gt;
&lt;br /&gt;
== Information ==&lt;br /&gt;
* [http://wiki.postgresql.org/wiki/Performance_Optimization In depth performance articles on PostgreSQL]&lt;br /&gt;
* [http://wiki.postgresql.org/wiki/HP_ProLiant_DL380_G5_Tuning_Guide DL380 Tuning Guide]&lt;br /&gt;
* [http://www.vimeo.com/channels/postgres Videos on Performance and other topics]&lt;br /&gt;
* [http://www.commandprompt.com/blogs/joshua_drake/2008/04/is_that_performance_i_smell_ext2_vs_ext3_on_50_spindles_testing_for_postgresql/ Performance measurements between load and filesystems (Linux)]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Todo</id>
		<title>Todo</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Todo"/>
				<updated>2010-02-25T06:55:18Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;add outbound interface binding to TODO&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;margin: 1ex 1em; float: right;&amp;quot;&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This list contains '''all known PostgreSQL bugs and feature requests'''. If you would like to work on an item, please read the [[Developer FAQ]] first. There is also a [[Development_information|development information page]].&lt;br /&gt;
&lt;br /&gt;
* {{TodoPending}} - marks ordinary, incomplete items&lt;br /&gt;
* {{TodoEasy}} - marks items that are easier to implement&lt;br /&gt;
* {{TodoDone}} - marks changes that are done, and will appear in the next major release&lt;br /&gt;
&lt;br /&gt;
For help on editing this list, please see [[Talk:Todo]]. &amp;lt;b&amp;gt;Please do not add items here without discussion on the mailing list.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 1ex 4em;&amp;quot;&amp;gt;&lt;br /&gt;
== Administration ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow administrators to cancel multi-statement idle transactions&lt;br /&gt;
|This allows locks to be released, but it is complex to report the cancellation back to the client.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg01340.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-12/msg00441.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Check for unreferenced table files created by transactions that were in-progress when the server terminated abruptly&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-06/msg00096.php &amp;lt;nowiki&amp;gt;Removing unreferenced files&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Set proper permissions on non-system schemas during db creation&lt;br /&gt;
|Currently all schemas are owned by the super-user because they are copied from the template1 database.  However, since all objects are inherited from the template database, it is not clear that setting schemas to the db owner is correct.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow log_min_messages to be specified on a per-module basis&lt;br /&gt;
|This would allow administrators to see more detailed information from specific sections of the backend, e.g. checkpoints, autovacuum, etc. Another idea is to allow separate configuration files for each module, or allow arbitrary SET commands to be passed to them. See also [[Logging Brainstorm]].}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Simplify ability to create partitioned tables&lt;br /&gt;
|This would allow creation of partitioned tables without requiring creation of triggers or rules for INSERT/UPDATE/DELETE, and constraints for rapid partition selection.  Options could include range and hash partition selection. See also [[Table partitioning]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow auto-selection of partitioned tables for min/max() operations&lt;br /&gt;
|There was a patch on -hackers from July 2009, but it has not been merged: http://archives.postgresql.org/pgsql-hackers/2009-07/msg01115.php}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow more complex user/database default GUC settings&lt;br /&gt;
|Currently ALTER USER and ALTER DATABASE support per-user and per-database defaults.  Consider adding per-user-and-database defaults so things like search_path can be defaulted for a specific user connecting to a specific database.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-09/msg02345.php &amp;lt;nowiki&amp;gt;Re: Per-database search_path&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/message-id/20090811221921.GK16362@alvh.no-ip.org&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow custom variables to appear in pg_settings()&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00850.php &amp;lt;nowiki&amp;gt;Re: count(*) performance improvement ideas&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow custom variable classes that can restrict who can set the values&lt;br /&gt;
|The common cases (POSTMASTER, SIGHUP, and SUSET) are already handled to some extent as of 8.4.  Should we mark this DONE?&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-11/msg00911.php &amp;lt;nowiki&amp;gt;custom variable classes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement the SQL standard mechanism whereby REVOKE ROLE revokes only the privilege granted by the invoking role, and not those granted by other roles&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-05/msg00010.php &amp;lt;nowiki&amp;gt;Re: Grantor name gets lost when grantor role dropped&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve server security options&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01875.php &amp;lt;nowiki&amp;gt;Re: [0/4] Proposal of SE-PostgreSQL patches&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00000.php &amp;lt;nowiki&amp;gt;Re: [0/4] Proposal of SE-PostgreSQL patches&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent query cancel packets from being replayed by an attacker, especially when using SSL&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-08/msg00345.php &amp;lt;nowiki&amp;gt;Replay attack of query cancel&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide a way to query the log collector subprocess to determine what the currently active log file is&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2008-11/msg00418.php &amp;lt;nowiki&amp;gt;Current log files when rotating?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow the client to authenticate the server in a Unix-domain socket connection, e.g., using SO_PEERCRED&lt;br /&gt;
* http://archives.postgresql.org/message-id/20090401173756.GB21229@svana.org&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow the client to set an application_name to appear in pg_stat_activity&lt;br /&gt;
* http://archives.postgresql.org/message-id/407d949e0907161237r76ebd92av6836c6563d8a230e@mail.gmail.com&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow server-side enforcement of password policies&lt;br /&gt;
|Password checks might include password complexity or non-reuse of passwords.  This facility will require the client to send password creation/changes to the server in plain-text, not MD5.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-09/msg01766.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-10/msg00025.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow custom daemons to be automatically stopped/started along postmaster&lt;br /&gt;
|This allows easier administration of daemons like user job schedulers or replication-related daemons.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-02/msg01701.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Configuration files ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow pg_hba.conf to specify host names along with IP addresses&lt;br /&gt;
|Host name lookup could occur when the postmaster reads the pg_hba.conf file, or when the backend starts.  Another solution would be to reverse lookup the connection IP and check that hostname against the host names in pg_hba.conf. We could also then check that the host name maps to the IP address. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00569.php &amp;lt;nowiki&amp;gt;TODO Item: Allow pg_hba.conf to specify host names along with IP addresses&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow postgresql.conf file values to be changed via an SQL API, perhaps using SET GLOBAL}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow the server to be stopped/restarted via an SQL API}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider normalizing fractions in postgresql.conf, perhaps using '%'&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-06/msg00550.php &amp;lt;nowiki&amp;gt;Fractions in GUC variables&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow Kerberos to disable stripping of realms so we can check the username@realm against multiple realms&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00009.php &amp;lt;nowiki&amp;gt;krb_match_realm patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add functions to check correctness of configuration files before they are loaded &amp;quot;live&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve LDAP authentication configuration options&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01745.php &amp;lt;nowiki&amp;gt;Proposed Patch - LDAPS support for servers on port 636 w/o TLS&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add external tool to auto-tune some postgresql.conf parameters&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00000.php &amp;lt;nowiki&amp;gt;Re: Overhauling GUCS&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-11/msg00033.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add 'hostgss' pg_hba.conf option to allow GSS link-level encryption&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-07/msg01454.php &amp;lt;nowiki&amp;gt;Re: Plans for 8.4&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Process pg_hba.conf keywords as case-insensitive&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-09/msg00432.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Tablespaces ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow a database in tablespace t1 with tables created in tablespace t2 to be used as a template for a new database created with default tablespace t2&lt;br /&gt;
|Currently all objects in the default database tablespace must have default tablespace specifications. This is because new databases are created by copying directories. If you mix default tablespace tables and tablespace-specified tables in the same directory, creating a new database from such a mixed directory would create a new database with tables that had incorrect explicit tablespaces.  To fix this would require modifying pg_class in the newly copied database, which we don't currently do.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow reporting of which objects are in which tablespaces&lt;br /&gt;
|This item is difficult because a tablespace can contain objects from multiple databases. There is a server-side function that returns the databases which use a specific tablespace, so this requires a tool that will call that function and connect to each database to find the objects in each database for that tablespace.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow WAL replay of CREATE TABLESPACE to work when the directory structure on the recovery computer is different from the original}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow per-tablespace quotas}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow per-tablespace random_page_cost&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-10/msg01128.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-10/msg01486.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Statistics Collector ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow statistics last vacuum/analyze execution times to be displayed without requiring track_counts to be enabled&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-docs/2007-04/msg00028.php &amp;lt;nowiki&amp;gt;row-level stats and last analyze time&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Clear table counters on TRUNCATE&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg00169.php &amp;lt;nowiki&amp;gt;Small TRUNCATE glitch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Allow the clearing of cluster-level statistics&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-03/msg00917.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Point-In-Time Recovery (PITR) ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow a warm standby system to also allow read-only statements&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg00050.php &amp;lt;nowiki&amp;gt;Updated propsoal for read-only queries on PITR slaves (SoC 2007)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Create dump tool for write-ahead logs for use in determining transaction id for point-in-time recovery&lt;br /&gt;
|This is useful for checking PITR recovery.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow recovery.conf to support the same syntax as postgresql.conf, including quoting&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00497.php &amp;lt;nowiki&amp;gt;recovery.conf parsing problems&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow archive_mode to be changed without server restart?&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg01655.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider avoiding WAL switching via archive_timeout if there has been no database activity&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-01/msg01469.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-02/msg00395.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== SSL ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow SSL authentication/encryption over unix domain sockets&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00924.php &amp;lt;nowiki&amp;gt;Re: Spoofing as the postmaster&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow SSL key file permission checks to be optionally disabled when sharing SSL keys with other applications&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-12/msg00069.php &amp;lt;nowiki&amp;gt;BUG #3809: SSL &amp;amp;quot;unsafe&amp;amp;quot; private key permissions bug&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow SSL CRL files to be re-read during configuration file reload, rather than requiring a server restart&lt;br /&gt;
|Unlike SSL CRT files, CRL (Certificate Revocation List) files are updated frequently&lt;br /&gt;
* http://archives.postgresql.org/pgsql-general/2008-12/msg00832.php&lt;br /&gt;
Alternatively or additionally supporting OCSP (online certificate security protocol) would provide real-time revocation discovery without reloading&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Allow automatic selection of SSL client certificates from a certificate store&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-05/msg00406.php &amp;lt;nowiki&amp;gt;Allow multiple certificates or keys in the postgresql.crt/.key files&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Data Types ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change NUMERIC to enforce the maximum precision}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce storage space for small NUMERICs&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-02/msg01331.php &amp;lt;nowiki&amp;gt;Saving space for common kinds of numeric values&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-02/msg00505.php &amp;lt;nowiki&amp;gt;Numeric patch to add special-case representations for &amp;amp;lt; 8 bytes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-06/msg00715.php &amp;lt;nowiki&amp;gt;Re: Reducing NUMERIC size for 8.3&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix data types where equality comparison isn't intuitive, e.g. box}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for public SYNONYMs&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-03/msg00519.php &amp;lt;nowiki&amp;gt;Proposal for SYNONYMS&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for SQL-standard GENERATED/IDENTITY columns&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-07/msg00543.php &amp;lt;nowiki&amp;gt;Re: Three weeks left until feature freeze&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-08/msg00038.php &amp;lt;nowiki&amp;gt;GENERATED ... AS IDENTITY, Was: Re: Feature Freeze&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-05/msg00344.php &amp;lt;nowiki&amp;gt;Behavior of GENERATED columns per SQL2003&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-05/msg00076.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] Behavior of GENERATED columns per SQL2003&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00604.php &amp;lt;nowiki&amp;gt;IDENTITY/GENERATED patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider placing all sequences in a single table, or create a system view&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00008.php &amp;lt;nowiki&amp;gt;Re: newbie: renaming sequences task&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider a special data type for regular expressions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg01067.php &amp;lt;nowiki&amp;gt;Why is there a tsquery data type?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce BIT data type overhead using short varlena headers&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-12/msg00273.php &amp;lt;nowiki&amp;gt;storage size of &amp;amp;quot;bit&amp;amp;quot; data type..&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow adding/renaming/removing enumerated values to an existing enumerated data type&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01718.php &amp;lt;nowiki&amp;gt;Re: [COMMITTERS] pgsql: Update:  &amp;amp;lt; * Allow adding enumerated	values to an existing&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support scoped IPv6 addresses in inet type&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-05/msg00111.php &amp;lt;nowiki&amp;gt;strange problem with ip6&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add JSON (JavaScript Object Notation) data type&lt;br /&gt;
|This would behave similar to the XML data type, which is stored as text, but allows element lookup and conversion functions.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-12/msg01494.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-01/msg00001.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Considering improving performance of computing CHAR() value lengths&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-06/msg00900.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-02/msg01787.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Domains ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix CREATE CAST on DOMAINs&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-05/msg00072.php &amp;lt;nowiki&amp;gt;bug? non working casts for domain&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-09/msg01681.php &amp;lt;nowiki&amp;gt;TODO: Fix CREATE CAST on DOMAINs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow domains to be cast&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2003-06/msg01206.php &amp;lt;nowiki&amp;gt;Domain casting still doesn't work right&amp;lt;/nowiki&amp;gt;] &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00289.php &amp;lt;nowiki&amp;gt;domain casting?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make domains work better with polymorphic functions&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4887.1228700773@sss.pgh.pa.us Polymorphic types vs. domains]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/15535.1238774571@sss.pgh.pa.us some difficulties with fixing it]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Dates and Times ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow infinite intervals just like infinite timestamps}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow TIMESTAMP WITH TIME ZONE to store the original timezone information, either zone name or offset from UTC&lt;br /&gt;
|If the TIMESTAMP value is stored with a time zone name, interval computations should adjust based on the time zone rules. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-10/msg00705.php &amp;lt;nowiki&amp;gt;timestamp with time zone a la sql99&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix SELECT '0.01 years'::interval, '0.01 months'::interval}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have timestamp subtraction not call justify_hours()?&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-sql/2006-10/msg00059.php &amp;lt;nowiki&amp;gt;timestamp subtraction (was Re: formatting intervals with to_char)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve timestamptz subtraction to be DST-aware&lt;br /&gt;
|Currently subtracting one date from another that crosses a daylight savings time adjustment can return '1 day 1 hour', but adding that back to the first date returns a time one hour in the future.  This is caused by the adjustment of '25 hours' to '1 day 1 hour', and '1 day' is the same time the next day, even if daylight savings adjustments are involved.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix interval display to support values exceeding 2^31 hours}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add overflow checking to timestamp and interval arithmetic}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Revise the src/timezone/tznames abbreviation files:&lt;br /&gt;
* to add missing abbreviations&lt;br /&gt;
* to find abbreviations that can be safely promoted to the Default list&lt;br /&gt;
* {{messageLink|7867.1219793881@sss.pgh.pa.us|BUG #4377: casting result of timeofday() to timestamp fails in some timezones}}}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Arrays ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for arrays of domains&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-05/msg00114.php &amp;lt;nowiki&amp;gt;Re: updated WIP: arrays of composites&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow single-byte header storage for array elements}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add function to detect if an array is empty&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-11/msg00475.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve handling of empty arrays&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg01033.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve handling of NULLs in arrays&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2008-11/msg00009.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Binary Data ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve vacuum of large objects, like contrib/vacuumlo?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add security checks for large objects}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Auto-delete large objects when referencing row is deleted&lt;br /&gt;
|contrib/lo offers this functionality.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow read/write into TOAST values like large objects&lt;br /&gt;
|This requires the TOAST column to be stored EXTERNAL.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add API for 64-bit large object access&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-09/msg00781.php &amp;lt;nowiki&amp;gt;64-bit API for large objects&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== MONEY Data Type ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add locale-aware MONEY type, and support multiple currencies&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2005-08/msg01432.php &amp;lt;nowiki&amp;gt;A real currency type&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg01181.php &amp;lt;nowiki&amp;gt;Money type todos?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|MONEY dumps in a locale-specific format making it difficult to restore to a system with a different locale}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow MONEY to be easily cast to/from other numeric data types}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Text Search ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow dictionaries to change the token that is passed on to later dictionaries&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-11/msg00081.php &amp;lt;nowiki&amp;gt;a tsearch2 (8.2.4) dictionary that only filters out stopwords&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider a function-based API for '@@' searches&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00511.php &amp;lt;nowiki&amp;gt;Simplifying Text Search&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve text search error messages&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg00966.php &amp;lt;nowiki&amp;gt;Poorly designed tsearch NOTICEs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg01146.php &amp;lt;nowiki&amp;gt;Re: Poorly designed tsearch NOTICEs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider changing error to warning for strings larger than one megabyte&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2008-02/msg00190.php &amp;lt;nowiki&amp;gt;BUG #3975: tsearch2 index should not bomb out of 1Mb limit&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-03/msg00062.php &amp;lt;nowiki&amp;gt;Re: [BUGS] BUG #3975: tsearch2 index should not bomb out of 1Mb limit&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|tsearch and tsdicts regression tests fail in Turkish locale on glibc&lt;br /&gt;
* [http://archives.postgresql.org/message-id/49749645.5070801@gmx.net tsearch with Turkish locale]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== XML ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow xml arrays to be cast to other data types&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-09/msg00981.php &amp;lt;nowiki&amp;gt;proposal casting from XML[] to int[], numeric[], text[]&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg00231.php &amp;lt;nowiki&amp;gt;Re: proposal casting from XML[] to int[], numeric[], text[]&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00471.php &amp;lt;nowiki&amp;gt;Re: proposal casting from XML[] to int[], numeric[], text[]&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add XML Schema validation and xmlvalidate function (SQL:2008)}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add xmlvalidatedtd variant to support validating against a DTD?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Relax-NG validation; libxml2 supports this already}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make it work reliably for non-UTF8 server encoding (xpath()) in particular is known to not work)&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2009-01/msg00135.php &lt;br /&gt;
* http://archives.postgresql.org/message-id/4110.1238973350@sss.pgh.pa.us}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Extra functions from SQL:2006: XMLDOCUMENT, XMLCAST, XMLTEXT}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Inline ORDER BY for XMLAGG. Example: &amp;quot;... XMLAGG(XMLELEMENT(...) ORDER BY col1) ...&amp;quot; (should be made to work with all aggregate functions)}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|XMLNAMESPACES support in XMLELEMENT and elsewhere}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|XSLT support; already available in contrib/xml2, but needs API fixes and adaptation to xml type.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|XML Canonical: Convert XML documents to canonical form to compare them. libxml2 has support for this.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Pretty-printing XML: Parse a document and serialize it back in some indented form. libxml2 might support this.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|XMLQUERY (from SQL/XML standard)}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|In some cases shredding could be better option (if there is no need in keeping XML docs entirely; if we have already developed tools that understand only relational data; etc) -- it would be a separate module that implements annotated schema decomposition technique, similar to DB2 and SQL Server functionality.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Nested or repeated xpath() apparently mess up namespaces [http://archives.postgresql.org/pgsql-bugs/2008-03/msg00097.php] [http://archives.postgresql.org/pgsql-bugs/2008-03/msg00144.php] [http://archives.postgresql.org/pgsql-general/2008-03/msg00295.php] [http://archives.postgresql.org/pgsql-bugs/2008-07/msg00054.php] [http://archives.postgresql.org/message-id/004f01c90e91$138e9d10$3aabd730$@anstett@iaas.uni-stuttgart.de]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|XPath: Adding the &amp;lt;x&amp;gt; at the root causes problems [http://archives.postgresql.org/pgsql-bugs/2008-05/msg00184.php] [http://archives.postgresql.org/pgsql-bugs/2008-07/msg00054.php] [http://archives.postgresql.org/pgsql-general/2008-07/msg00613.php]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|xpath_table needs to be implemented/implementable to get rid of contrib/xml2 [http://archives.postgresql.org/pgsql-general/2008-05/msg00823.php]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|better handling of XPath data types [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00616.php] [http://archives.postgresql.org/message-id/004a01c90e90$4b986d90$e2c948b0$@anstett@iaas.uni-stuttgart.de]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|xpath_exists() is needed. It checks, whether or not the path specified exists in the XML value. (W/o this function we need to use weird &amp;quot;array_dims(xpath(...)) IS NOT NULL&amp;quot; syntax.)}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow INET subnet tests using non-constants to be indexed}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow to_date() and to_timestamp() to accept localized month names}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add missing parameter handling in to_char()&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-12/msg00948.php &amp;lt;nowiki&amp;gt;Re: to_char and i18n&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Throw an error from to_char() instead of printing a string of &amp;quot;#&amp;quot; when a number doesn't fit in the desired output format.&lt;br /&gt;
* discussed in [http://archives.postgresql.org/message-id/37ed240d0907290836w42187222n18664dfcbcb445b1@mail.gmail.com &amp;quot;to_char, support for EEEE format&amp;quot;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add functions to get/set bit values&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-01/msg00498.php &amp;lt;nowiki&amp;gt;implemented missing bitSetBit() and bitGetBit()&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-02/msg00478.php &amp;lt;nowiki&amp;gt;Re: implemented missing bitSetBit() and bitGetBit()&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow to_char() on interval values to accumulate the highest unit requested&lt;br /&gt;
|2= Some special format flag would be required to request such accumulation.  Such functionality could also be added to EXTRACT. Prevent accumulation that crosses the month/day boundary because of the uneven number of days in a month.&lt;br /&gt;
* to_char(INTERVAL '1 hour 5 minutes', 'MI') =&amp;amp;gt; 65&lt;br /&gt;
* to_char(INTERVAL '43 hours 20 minutes', 'MI' ) =&amp;amp;gt; 2600&lt;br /&gt;
* to_char(INTERVAL '43 hours 20 minutes', 'WK:DD:HR:MI') =&amp;amp;gt; 0:1:19:20&lt;br /&gt;
* to_char(INTERVAL '3 years 5 months','MM') =&amp;amp;gt; 41}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow SQL-language functions to reference parameters by parameter name&lt;br /&gt;
|Currently SQL-language functions can only refer to dollar parameters, e.g. $1}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add SPI_gettypmod() to return the typemod for a TupleDesc}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Enforce typmod for function inputs, function results and parameters for spi_prepare'd statements called from PLs&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-01/msg01403.php &amp;lt;nowiki&amp;gt;Re: BUG #2917: spi_prepare doesn't accept typename aliases&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-11/msg01160.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow holdable cursors in SPI}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Tighten function permission checks&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00568.php &amp;lt;nowiki&amp;gt;Re: Security leak with trigger functions?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix IS OF so it matches the ISO specification, and add documentation&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2003-08/msg00060.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] IS OF&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-02/msg00060.php &amp;lt;nowiki&amp;gt;ToDo: add documentation for operator IS OF&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add missing operators for geometric data types&lt;br /&gt;
|Some geometric types do not have the full suite of geometric operators, e.g. box @&amp;amp;gt; point&lt;br /&gt;
* {{messageLink|4B0A8F0F.3020308@sigaev.ru|point_ops for GiST}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement Boyer-Moore searching in LIKE queries&lt;br /&gt;
* {{messageLink|27645.1220635769@sss.pgh.pa.us|TODO item: Implement Boyer-Moore searching (First time hacker)}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent malicious functions from being executed with the permissions of unsuspecting users&lt;br /&gt;
|Index functions are safe, so VACUUM and ANALYZE are safe too.  Triggers, CHECK and DEFAULT expressions, and rules are still vulnerable. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00268.php &amp;lt;nowiki&amp;gt;Some notes about the index-functions security vulnerability&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce memory usage of aggregates in set returning functions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2008-01/msg00031.php &amp;lt;nowiki&amp;gt;Re: Performance of aggregates over set-returning functions&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix /contrib/ltree operator&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-11/msg00044.php &amp;lt;nowiki&amp;gt;BUG #3720: wrong results at using ltree&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Fix inconsistent precedence of =, &amp;amp;gt;, and &amp;amp;lt; compared to &amp;amp;lt;&amp;amp;gt;, &amp;amp;gt;=, and &amp;amp;lt;=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-12/msg00145.php &amp;lt;nowiki&amp;gt;BUG #3822: Nonstandard precedence for comparison operators&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix regular expression bug when using complex back-references&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-10/msg00000.php &amp;lt;nowiki&amp;gt;BUG #3645: regular expression back references seem broken&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have /contrib/dblink reuse unnamed connections&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg00895.php &amp;lt;nowiki&amp;gt;dblink un-named connection doesn't get re-used&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow calling of a procedure outside a SELECT that can control the transaction state&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg01375.php &amp;lt;nowiki&amp;gt;Proposal: real procedures again (8.4)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add has_sequence_privilege()&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-09/msg00032.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve formatting of pg_get_viewdef() output&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-01/msg01648.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-08/msg01885.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add printf()-like functionality&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-09/msg00367.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix to_number() handling for values not matching the format string&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-09/msg01447.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add function to dump pg_depend information cleanly&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-09/msg00226.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Multi-Language Support ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add NCHAR (as distinguished from ordinary varchar),}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow more fine-grained collation selection; add CREATE COLLATION.&lt;br /&gt;
|Right now the collation is fixed at database creation time.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-03/msg00932.php &amp;lt;nowiki&amp;gt;Re: Patch for collation using ICU&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-08/msg00039.php &amp;lt;nowiki&amp;gt;FW: Win32 unicode vs ICU&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-08/msg00309.php &amp;lt;nowiki&amp;gt;Re: FW: Win32 unicode vs ICU&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-09/msg00110.php &amp;lt;nowiki&amp;gt;Proof of concept COLLATE support with patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-09/msg00020.php &amp;lt;nowiki&amp;gt;For review: Initial support for COLLATE&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-12/msg01121.php &amp;lt;nowiki&amp;gt;Proposed COLLATE implementation&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-01/msg00767.php &amp;lt;nowiki&amp;gt;TODO item: locale per database patch (new iteration)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-03/msg00233.php &amp;lt;nowiki&amp;gt;Re: FW: Win32 unicode vs ICU&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-09/msg00662.php &amp;lt;nowiki&amp;gt;Re: Fixed length data types issue&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-07/msg00557.php&lt;br /&gt;
* [[Todo:Collate]]&lt;br /&gt;
* [[Todo:ICU]]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-08/msg01362.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-09/msg00012.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg00868.php&lt;br /&gt;
* [http://www.unicode.org/unicode/reports/tr10/ Unicode collation algorithm]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a LOCALE option to CREATE DATABASE, as a shorthand&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-04/msg00119.php &amp;lt;nowiki&amp;gt; Re: 8.4 open items list&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support multiple simultaneous character sets, per SQL:2008}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve UTF8 combined character handling?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add octet_length_server() and octet_length_client()}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make octet_length_client() the same as octet_length()?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix problems with wrong runtime encoding conversion for NLS message files}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add URL to more complete multi-byte regression tests&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-07/msg00272.php &amp;lt;nowiki&amp;gt;Multi-byte and client side character encoding tests for copy command..&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix contrib/fuzzystrmatch to work with multibyte encodings&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-04/msg00047.php &amp;lt;nowiki&amp;gt; soundex function returns UTF-16 characters&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Set client encoding based on the client operating system encoding&lt;br /&gt;
|Currently client_encoding is set in postgresql.conf, which defaults to the server encoding. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-08/msg01696.php &amp;lt;nowiki&amp;gt;Re: [GENERAL] invalid byte sequence ?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change memory allocation for multi-byte functions so memory is allocated inside conversion functions&lt;br /&gt;
|Currently we preallocate memory based on worst-case usage.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ability to use case-insensitive regular expressions on multi-byte characters&lt;br /&gt;
|ILIKE already works with multi-byte characters&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg00433.php&lt;br /&gt;
* {{MessageLink|20091201210024.B1393753FB7@cvs.postgresql.org|A partial solution for UTF-8}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve encoding of connection startup messages sent to the client&lt;br /&gt;
|Currently some authentication error messages are sent in the server encoding&lt;br /&gt;
* http://archives.postgresql.org/pgsql-general/2008-12/msg00801.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-general/2009-01/msg00005.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have pg_stat_activity display query strings in the correct client encoding&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-01/msg00131.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|More sensible support for Unicode combining characters, normal forms&lt;br /&gt;
* http://archives.postgresql.org/message-id/200904141532.44618.peter_e@gmx.net&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Views / Rules ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Automatically create rules on views so they are updateable, per SQL:2008&lt;br /&gt;
|We can only auto-create rules for simple views.  For more complex cases users will still have to write rules manually.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-03/msg00586.php &amp;lt;nowiki&amp;gt;Proposal for updatable views&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-08/msg00255.php &amp;lt;nowiki&amp;gt;Updatable views&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-01/msg01746.php&lt;br /&gt;
* http://wiki.postgresql.org/wiki/Updatable_views&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add the functionality for WITH CHECK OPTION clause of CREATE VIEW}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow VIEW/RULE recompilation when the underlying tables change&lt;br /&gt;
|This is both difficult and controversial.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-12/msg01723.php Re: About &amp;quot;Allow VIEW/RULE recompilation when the underlying tables change&amp;quot;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-12/msg01724.php Re: About &amp;quot;Allow VIEW/RULE recompilation when the underlying tables change&amp;quot;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make it possible to use RETURNING together with conditional DO INSTEAD rules, such as for partitioning setups&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-09/msg00577.php &amp;lt;nowiki&amp;gt;RETURNING and DO INSTEAD ... Intentional or not?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add the ability to automatically create materialized views&lt;br /&gt;
|Right now materialized views require the user to create triggers on the main table to keep the summary table current.  SQL syntax should be able to manager the triggers and summary table automatically.  A more sophisticated implementation would automatically retrieve from the summary table when the main table is referenced, if possible.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve ability to modify views via ALTER TABLE&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00691.php &amp;lt;nowiki&amp;gt;Re: idea: storing view source in system catalogs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-07/msg01410.php &amp;lt;nowiki&amp;gt;modifying views&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-08/msg00300.php &amp;lt;nowiki&amp;gt;Re: patch: Add columns via CREATE OR REPLACE VIEW&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent low-cost functions from seeing unauthorized view rows&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-10/msg01346.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== SQL Commands ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add CORRESPONDING BY to UNION/INTERSECT/EXCEPT}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ROLLUP, CUBE, GROUPING SETS options to GROUP BY&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg00838.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-05/msg00466.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Allow SET CONSTRAINTS to be qualified by schema/table name}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Fix TRUNCATE ... RESTART IDENTITY so its effect on sequences is rolled back on transaction abort&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00550.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] TRUNCATE TABLE with IDENTITY&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow PREPARE of cursors}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow finer control over the caching of prepared query plans&lt;br /&gt;
|Currently anonymous (un-named) queries prepared via the libpq API are replanned every time bind parameters are supplied --- allow SQL PREPARE to do the same.  Also, allow control over replanning prepared queries either manually or automatically when statistics for execute parameters differ dramatically from those used during planning.&lt;br /&gt;
* http://archives.postgresql.org/message-id/201002151911.o1FJBYh22763@momjian.us&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve logging of prepared transactions recovered during startup&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-11/msg00092.php &amp;lt;nowiki&amp;gt;&amp;amp;quot;recovering prepared transaction&amp;amp;quot; after server restart message&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow prepared transactions with temporary tables created and dropped in the same transaction, and when an ON COMMIT DELETE ROWS temporary  table is accessed&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00047.php &amp;lt;nowiki&amp;gt;Re: &amp;amp;quot;could not open relation 1663/16384/16584: No such file or directory&amp;amp;quot; in a specific combination of transactions with temp tables&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/492543D5.9050904@enterprisedb.com A suggestion on how to implement this]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a GUC variable to warn about non-standard SQL usage in queries}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add SQL-standard MERGE/REPLACE/UPSERT command&lt;br /&gt;
|MERGE is typically used to merge two tables.  REPLACE or UPSERT command does UPDATE, or on failure, INSERT. This is similar to UPDATE, then for unmatched rows, INSERT.  Whether concurrent access allows modifications which could cause row loss is implementation independent. To implement this cleanly requires that the table have a unique index so duplicate checking can be easily performed.  It is possible to do it without a unique index if we require the user to LOCK the table before the MERGE.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-11/msg00501.php &amp;lt;nowiki&amp;gt;someone working to add merge?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-11/msg00536.php &amp;lt;nowiki&amp;gt;MERGE vs REPLACE&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01157.php &amp;lt;nowiki&amp;gt;MERGE SQL Statement&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01475.php &amp;lt;nowiki&amp;gt;MERGE Specification&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01890.php &amp;lt;nowiki&amp;gt;Internal design of MERGE, with Rules&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add NOVICE output level for helpful messages like automatic sequence/index creation}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add GUC to issue notice about statements that use unjoined tables}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow EXPLAIN to identify tables that were skipped because of constraint_exclusion}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow EXPLAIN output to be more easily processed by scripts, perhaps XML&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-05/msg00857.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Enable standard_conforming_strings by default in 8.6?&lt;br /&gt;
|When this is done, backslash-quote should be prohibited in non-E&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt; strings because of possible confusion over how such strings treat backslashes.  Basically, &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt; is always safe for a literal single quote, while \' might or might not be based on the backslash handling rules.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Simplify dropping roles that have objects in several databases}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow the count returned by SELECT, etc to be represented as an int64 to allow a higher range of values}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for WITH RECURSIVE ... CYCLE&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg00291.php}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add DEFAULT .. AS OWNER so permission checks are done as the table owner&lt;br /&gt;
|This would be useful for SERIAL nextval() calls and CHECK constraints.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow DISTINCT to work in multiple-argument aggregate calls}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add column to pg_stat_activity that shows the progress of long-running commands like CREATE INDEX and VACUUM&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-04/msg00203.php &amp;lt;nowiki&amp;gt;EXPLAIN progress info&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow INSERT/UPDATE/DELETE ... RETURNING inside a SELECT 'FROM' clause or target list&lt;br /&gt;
|Actually it would be saner to allow this in WITH&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2006-09/msg00803.php &amp;lt;nowiki&amp;gt;8.2: select from an INSERT returning?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-10/msg00693.php &amp;lt;nowiki&amp;gt;Re: SQL functions, INSERT/UPDATE/DELETE RETURNING, and triggers&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00124.php &amp;lt;nowiki&amp;gt;cannot use result of (insert..returning)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00979.php &amp;lt;nowiki&amp;gt;insert ... delete ... returning ... ?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2009-06/msg00357.php Using results from DELETE ... RETURNING]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow INSERT/UPDATE/DELETE ... RETURNING in common table expressions&lt;br /&gt;
*  http://archives.postgresql.org/pgsql-hackers/2009-10/msg00472.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add comments on system tables/columns using the information in catalogs.sgml&lt;br /&gt;
|Ideally the information would be pulled from the SGML file automatically.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent the specification of conflicting transaction read/write options&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-01/msg00684.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support LATERAL subqueries&lt;br /&gt;
|Lateral subqueries can reference columns of tables defined outside the subquery at the same level, i.e. ''laterally''.&lt;br /&gt;
For example, a LATERAL subquery in a FROM clause could reference tables defined in the same FROM clause.&lt;br /&gt;
Currently only the columns of tables defined ''above'' subqueries are recognized.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-09/msg00292.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-10/msg00991.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Forbid COMMENT on columns of an index&lt;br /&gt;
|Postgres currently allows comments to be placed on the columns of an index, but pg_dump doesn't handle them and the column names themselves are implementation-dependent.&lt;br /&gt;
* http://archives.postgresql.org/message-id/27676.1237906577@sss.pgh.pa.us&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for functional dependencies&lt;br /&gt;
|This would allow omitting GROUP BY columns when grouping by the primary key.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CREATE ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow CREATE TABLE AS to determine column lengths for complex expressions like SELECT col1 || col2}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have WITH CONSTRAINTS also create constraint indexes&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-04/msg00149.php &amp;lt;nowiki&amp;gt;Re: CREATE TABLE LIKE INCLUDING INDEXES support&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Move NOT NULL constraint information to pg_constraint&lt;br /&gt;
|Currently NOT NULL constraints are stored in pg_attribute without any designation of their origins, e.g. primary keys.  One manifest problem is that dropping a PRIMARY KEY constraint does not remove the NOT NULL constraint designation.  Another issue is that we should probably force NOT NULL to be propagated from parent tables to children, just as CHECK constraints are.  (But then does dropping PRIMARY KEY affect children?)&lt;br /&gt;
* http://archives.postgresql.org/message-id/19768.1238680878@sss.pgh.pa.us&lt;br /&gt;
* http://archives.postgresql.org/message-id/200909181005.n8IA5Ris061239@wwwmaster.postgresql.org&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent concurrent CREATE TABLE from sometimes returning a cryptic error message&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-10/msg00169.php &amp;lt;nowiki&amp;gt;BUG #3692: Conflicting create table statements throw unexpected error&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add CREATE SCHEMA ... LIKE that copies a schema}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add CREATE TABLE LIKE ... INCLUDING COMMENTS}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Have CREATE TABLE LIKE copy column storage parameters&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-07/msg01417.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-08/msg00423.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-09/msg00576.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-09/msg00824.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|CREATE OR REPLACE FUNCTION might leave dependent objects depending on the function in inconsistent state&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2008-08/msg00985.php indexes on functions and create or replace function]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow GLOBAL temporary tables to exist as empty by default in all sessions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00006.php &amp;lt;nowiki&amp;gt;what is difference between LOCAL and GLOBAL TEMP TABLES in PostgreSQL&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-04/msg01329.php&lt;br /&gt;
* http://archives.postgresql.org//pgsql-hackers/2009-05/msg00016.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add OR REPLACE to CREATE LANGUAGE&lt;br /&gt;
* http://archives.postgresql.org/pgsql-patches/2008-05/msg00057.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow the creation of &amp;quot;distinct&amp;quot; types&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg01647.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== UPDATE ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Allow UPDATE tab SET ROW (col, ...) = (SELECT...)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-07/msg01308.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] extension for sql update&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg00865.php &amp;lt;nowiki&amp;gt;UPDATE using sub selects&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-04/msg00315.php &amp;lt;nowiki&amp;gt;UPDATE using sub selects&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-03/msg00237.php &amp;lt;nowiki&amp;gt;Re: UPDATE using sub selects&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Research self-referential UPDATEs that see inconsistent row versions in read-committed mode&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-05/msg00507.php &amp;lt;nowiki&amp;gt;Concurrently updating an updatable view&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-06/msg00016.php &amp;lt;nowiki&amp;gt;Re: Do we need a TODO? (was Re: Concurrently updating anupdatable view)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve performance of EvalPlanQual mechanism that rechecks already-updated rows&lt;br /&gt;
|This is related to the previous item, which questions whether it even has the right semantics&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2008-09/msg00045.php &amp;lt;nowiki&amp;gt;BUG #4401: concurrent updates to a table blocks one update indefinitely&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-07/msg00302.php &amp;lt;nowiki&amp;gt;BUG #4945: Parallel update(s) gone wild&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== ALTER ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have ALTER TABLE RENAME rename SERIAL sequence names&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00008.php &amp;lt;nowiki&amp;gt;Re: newbie: renaming sequences task&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Allow ALTER TABLE ... ALTER CONSTRAINT ... RENAME&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-02/msg00168.php &amp;lt;nowiki&amp;gt;ALTER CONSTRAINT RENAME patch reverted&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ALTER TABLE RENAME CONSTRAINT}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have ALTER SEQUENCE RENAME rename the sequence name stored in the sequence table&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-09/msg00092.php &amp;lt;nowiki&amp;gt;BUG #3619: Renaming sequence does not update its 'sequence_name' field&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-10/msg00007.php &amp;lt;nowiki&amp;gt;Re: BUG #3619: Renaming sequence does not update its 'sequence_name' field&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00008.php &amp;lt;nowiki&amp;gt;Re: newbie: renaming sequences task&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ALTER DOMAIN to modify the underlying data type}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Allow ALTER TABLE to change constraint deferrability and actions}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add missing object types for ALTER ... SET SCHEMA}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow ALTER TABLESPACE to move to different directories}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow moving system tables to other tablespaces, where possible&lt;br /&gt;
|Currently non-global system tables must be in the default database tablespace. Global system tables can never be moved.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have ALTER INDEX update the name of a constraint using that index}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow column display reordering by recording a display, storage, and permanent id for every column?&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00782.php &amp;lt;nowiki&amp;gt;Re: column ordering, was Re: [PATCHES] Enums patch v2&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-11/msg01029.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow an existing index to be marked as a table's primary key&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg00500.php &amp;lt;nowiki&amp;gt;Setting a pre-existing index as a primary key&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow ALTER TYPE on composite types to perform operations similar to ALTER TABLE&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg00245.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Don't require table rewrite on ALTER TABLE ... ALTER COLUMN TYPE, when the old and new data types are binary compatible&lt;br /&gt;
* http://archives.postgresql.org/message-id/200903040137.n241bAUV035002@wwwmaster.postgresql.org&lt;br /&gt;
* http://archives.postgresql.org/pgsql-patches/2006-10/msg00154.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== CLUSTER ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Automatically maintain clustering on a table&lt;br /&gt;
|This might require some background daemon to maintain clustering during periods of low usage. It might also require tables to be only partially filled for easier reorganization.  Another idea would be to create a merged heap/index data file so an index lookup would automatically access the heap data too.  A third idea would be to store heap rows in hashed groups, perhaps using a user-supplied hash function.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2004-08/msg00350.php &amp;lt;nowiki&amp;gt;Equivalent praxis to CLUSTERED INDEX?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00155.php &amp;lt;nowiki&amp;gt;Re: Grouped Index Tuples&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://community.enterprisedb.com/git/&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2009-10/msg00346.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Add default clustering to system tables&lt;br /&gt;
|To do this, determine the ideal cluster index for each system table and set the cluster setting during initdb.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve CLUSTER performance by sorting to reduce random I/O&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-08/msg01371.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Make CLUSTER VERBOSE more verbose.&lt;br /&gt;
|It is also used by new VACUUM FULL VERBOSE.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== COPY ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY to report error lines and continue&lt;br /&gt;
|This requires the use of a savepoint before each COPY line is processed, with ROLLBACK on COPY failure. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00572.php &amp;lt;nowiki&amp;gt;Re: VLDB Features&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY on a newly-created table to skip WAL logging&lt;br /&gt;
|On crash recovery, the table involved in the COPY would be removed or have its heap and index files truncated.  One issue is that no other backend should be able to add to the table at the same time, which is something that is currently allowed.  This currently is done if the table is created inside the same transaction block as the COPY because no other backends can see the table.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY FROM to create index entries in bulk&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00811.php &amp;lt;nowiki&amp;gt;Batch update of indexes on data loading&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY in CSV mode to control whether a quoted zero-length string is treated as NULL&lt;br /&gt;
|Currently this is always treated as a zero-length string, which generates an error when loading into an integer column &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00905.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] allow CSV quote in NULL&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve COPY performance&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00954.php &amp;lt;nowiki&amp;gt;Re: 8.3 / 8.2.6 restore comparison&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY to report errors sooner&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01169.php &amp;lt;nowiki&amp;gt;Timely reporting of COPY errors&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Improve bytea COPY format&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-05/msg00192.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY to handle other number formats eg. the German notation. Best would be something like WITH DECIMAL ','.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== GRANT/REVOKE ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow GRANT/REVOKE permissions to be applied to all schema objects with one command&lt;br /&gt;
|The proposed syntax is: GRANT SELECT ON ALL TABLES IN public TO phpuser; GRANT SELECT ON NEW TABLES IN public TO phpuser;&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-06/msg01014.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow GRANT/REVOKE permissions to be inherited by objects based on schema permissions&lt;br /&gt;
* http://wiki.postgresql.org/wiki/DefaultACL&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow SERIAL sequences to inherit permissions from the base table?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow dropping of a role that has connection rights&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-05/msg00736.php&lt;br /&gt;
}}&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== DECLARE CURSOR ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent DROP TABLE from dropping a table referenced by its own open cursor?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide some guarantees about the behavior of cursors that invoke volatile functions&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20997.1244563664@sss.pgh.pa.us Re: Cursor with hold emits the same row more than once across commits in 8.3.7]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== INSERT ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow INSERT/UPDATE of the system-generated oid value for a row}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|In rules, allow VALUES() to contain a mixture of 'old' and 'new' references}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== SHOW/SET ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add SET PERFORMANCE_TIPS option to suggest INDEX, VACUUM, VACUUM ANALYZE, and CLUSTER}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Rationalize the discrepancy between settings that use values in bytes and SHOW that returns the object count&lt;br /&gt;
* http://archives.postgresql.org/pgsql-docs/2008-07/msg00007.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== LISTEN/NOTIFY ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow LISTEN/NOTIFY to store info in memory rather than tables&lt;br /&gt;
|Currently LISTEN/NOTIFY information is stored in pg_listener.  Storing such information in memory would improve performance.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add optional textual message to NOTIFY&lt;br /&gt;
|This would allow an informational message to be added to the notify message, perhaps indicating the row modified or other custom information.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow NOTIFY in rules involving conditionals}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Window Functions ===&lt;br /&gt;
See {{messageLink|357.1230492361@sss.pgh.pa.us|TODO items for window functions}}.&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support creation of user-defined window functions.&lt;br /&gt;
|We have the ability to create new window functions written in C.  Is it&lt;br /&gt;
worth the effort to create an API that would let them be written in PL/pgsql, etc?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement full support for window framing clauses.&lt;br /&gt;
|The cases we support now are basically those where no row ever exits the frame as the current row advances.  To do better requires some rethinking of the window aggregate support.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Look at tuplestore performance issues.&lt;br /&gt;
|The tuplestore_in_memory() thing is just a band-aid, we ought to try to solve it properly.  tuplestore_advance seems like a weak spot as well.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg00152.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem|Do we really need so much duplicated code between Agg and WindowAgg?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Teach planner to evaluate multiple windows in the optimal order.&lt;br /&gt;
|Currently windows are always evaluated in the query-specified order.&lt;br /&gt;
* http://archives.postgresql.org/message-id/3CDAD71E9D70417290FCF66F0178D1E1@amd64&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Integrity Constraints ==&lt;br /&gt;
=== Keys ===&lt;br /&gt;
&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow DEFERRABLE UNIQUE constraints&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;This would allow UPDATE tab SET col = col + 1 to work if col has a unique index.  Currently, uniqueness checks are done while the command is being executed, rather than at the end of the statement or transaction.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* http://people.planetpostgresql.org/greg/index.php?/archives/46-Updating-unique-columns.html&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-09/msg01458.php &amp;lt;nowiki&amp;gt;Re: Unique index: update error&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve deferrable unique constraints for cases with many conflicts&lt;br /&gt;
|The current implementation fires a trigger for each potentially conflicting row.  This might not scale well for an update that changes many key values at once.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Referential Integrity ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add MATCH PARTIAL referential integrity}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change foreign key constraint for array -&amp;amp;gt; element to mean element in array?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix problem when cascading referential triggers make changes on cascaded tables, seeing the tables in an intermediate state&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-09/msg00174.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] Work-in-progress referential action trigger timing&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Optimize referential integrity checks&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2005-10/msg00458.php &amp;lt;nowiki&amp;gt;Re: Effects of cascading references in foreign keys&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-04/msg00744.php &amp;lt;nowiki&amp;gt;Can't ri_KeysEqual() consider two nulls as equal?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Server-Side Languages ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for polymorphic arguments and return types to languages other than PL/PgSQL}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add capability to create and call PROCEDURES}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for OUT and INOUT parameters to languages other than PL/PgSQL}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add more fine-grained specification of functions taking arbitrary data types&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-09/msg00367.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== PL/pgSQL ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow function parameters to be passed by name, get_employee_salary(12345 AS emp_id, 2001 AS tax_year)&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-08/msg00559.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg00880.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow handling of %TYPE arrays, e.g. tab.col%TYPE[]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Allow listing of record column names, and access to record columns via variables, e.g. columns := r.(*), tval2 := r.(colname)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-07/msg00458.php &amp;lt;nowiki&amp;gt;Re: PL/PGSQL: Dynamic Record Introspection&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-05/msg00302.php &amp;lt;nowiki&amp;gt;Re: PL/PGSQL: Dynamic Record Introspection&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-06/msg00031.php &amp;lt;nowiki&amp;gt;Re: PL/PGSQL: Dynamic Record Introspection&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for SCROLL cursors}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for WITH HOLD cursors}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow row and record variables to be set to NULL constants, and allow NULL tests on such variables&lt;br /&gt;
|Because a row is not scalar, do not allow assignment from NULL-valued scalars.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-10/msg00070.php &amp;lt;nowiki&amp;gt;NULL and plpgsql rows&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Review handling of MOVE and FETCH&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-04/msg00527.php &amp;lt;nowiki&amp;gt;Re: actualised forgotten Magnus's patch for plpgsql MOVE	statement&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Improve logic of determining if an identifier is a variable or a column name&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00436.php &amp;lt;nowiki&amp;gt;Re: plpgsql and qualified variable names&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* * http://archives.postgresql.org/message-id/603c8f070903061741l1f11ba59q783745cc3cb79dba@mail.gmail.com&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider keeping separate cached copies when search_path changes&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg01009.php &amp;lt;nowiki&amp;gt;pl/pgsql Plan Invalidation and search_path&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Improve PL/pgSQL's ability to cope with rowtypes containing dropped columns&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2008-09/msg00004.php &amp;lt;nowiki&amp;gt;Bug in RETURN QUERY&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve handling of NULL row values vs. NULL rows&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-09/msg01758.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== PL/Perl ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow data to be passed in native language formats, rather than only text&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-05/msg00289.php &amp;lt;nowiki&amp;gt;plperl vs. bytea&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow regex operations in plperl using UTF8 characters in non-UTF8 encoded databases.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== PL/Python ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add table function support}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add tracebacks&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-02/msg00288.php &amp;lt;nowiki&amp;gt;Re: plpython tracebacks&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add support for Python 3&lt;br /&gt;
* [http://archives.postgresql.org/message-id/3544.1238817272@sss.pgh.pa.us &amp;lt;nowiki&amp;gt;Re: Python 3.0 does not work with PL/Python&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-07/msg01519.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Develop a trusted variant of PL/Python.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow arrays as function arguments and return values.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Create a new restricted execution class that will allow passing function arguments in as locals.  Passing them as globals means functions cannot be called recursively.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Functions cache the input and output functions for their arguments, so the following will make PostgreSQL unhappy:&lt;br /&gt;
&lt;br /&gt;
 create table users (first_name text, last_name text);&lt;br /&gt;
 create function user_name(user) returns text as 'mycode' language plpython;&lt;br /&gt;
 select user_name(user) from users;&lt;br /&gt;
 alter table add column user_id integer;&lt;br /&gt;
 select user_name(user) from users;&lt;br /&gt;
&lt;br /&gt;
You have to drop and create the function(s) each time its arguments&lt;br /&gt;
are modified (not nice), or don't cache the input and output functions&lt;br /&gt;
(slower?), or check if the structure of the argument has been&lt;br /&gt;
altered (is this possible, easy, quick?) and recreate cache.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Better documentation}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a DB-API compliant interface on top of the SPI interface.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|check encoding validity of values passed back to Postgres in function returns, trigger tuple changes, or SPI calls.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== PL/Tcl ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add table function support}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|check encoding validity of values passed back to Postgres in function returns, trigger tuple changes, or SPI calls.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Clients ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a function like pg_get_indexdef() that report more detailed index information&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-12/msg00166.php &amp;lt;nowiki&amp;gt;BUG #3829: Wrong index reporting from pgAdmin III (v1.8.0 rev 6766-6767)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== pg_ctl ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow pg_ctl to work properly with configuration files located outside the PGDATA directory&lt;br /&gt;
|pg_ctl can not read the pid file because it isn't located in the config directory but in the PGDATA directory.  The solution is to allow pg_ctl to read and understand postgresql.conf to find the data_directory value.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2009-10/msg00024.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have the postmaster write a random number to a file on startup that pg_ctl checks against the contents of a pg_ping response on its initial connection (without login)&lt;br /&gt;
|This will protect against connecting to an old instance of the postmaster in a different or deleted subdirectory.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2009-10/msg00110.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2009-10/msg00156.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Modify pg_ctl behavior and exit codes to make it easier to write an LSB conforming init script&lt;br /&gt;
|It may be desirable to condition some of the changes on a command-line switch, to avoid breaking existing scripts.  A Linux shell (sh) script is referenced which has been tested and seems to provide a high degree of conformance in multiple environments.  Study of this script might suggest areas where pg_ctl could be modified to make writing an LSB conforming script easier; however, some aspects of that script would be unnecessary with other suggested changes to pg_ctl, and discussion on the lists did not reach consensus on support for all aspects of this script.  Further discussion of particular changes is needed before beginning any work.&lt;br /&gt;
* [[Lsb_conforming_init_script|LSB conforming init script]]&lt;br /&gt;
These threads should be studied for other ideas on improvements:&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-08/msg01390.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-08/msg01843.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-09/msg00008.php&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== psql ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have psql \ds show all sequences and their settings&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-07/msg00916.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg00401.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have \d on a sequence indicate if the sequences is owned by a table}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Move psql backslash database information into the backend, use mnemonic commands?&lt;br /&gt;
|This would allow non-psql clients to pull the same information out of the database as psql. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-01/msg00191.php &amp;lt;nowiki&amp;gt;Re: psql \d option list overloaded&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make psql's \d commands more consistent in its handling of schemas&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-11/msg00014.php &amp;lt;nowiki&amp;gt;Re: psql and schemas&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consistently display privilege information for all objects in psql}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add auto-expanded mode so expanded output is used if the row length is wider than the screen width.&lt;br /&gt;
|Consider using auto-expanded mode for backslash commands like \df+.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent tab completion of SET TRANSACTION from querying the database and therefore preventing the transaction isolation level from being set.&lt;br /&gt;
|Currently SET &amp;amp;lt;tab&amp;amp;gt; causes a database lookup to check all supported session variables.  This query causes problems because setting the transaction isolation level must be the first statement of a transaction.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a \set variable to control whether \s displays line numbers&lt;br /&gt;
|Another option is to add \# which lists line numbers, and allows command execution.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00255.php &amp;lt;nowiki&amp;gt;Re: psql possible TODO&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent escape string warnings when object names have backslashes&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00227.php &amp;lt;nowiki&amp;gt;Psql command-line completion bug&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have \d show child tables that inherit from the specified parent}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Include the symbolic SQLSTATE name in verbose error reports&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-09/msg00438.php &amp;lt;nowiki&amp;gt;Re: Checking is TSearch2 query is valid&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add prompt escape to display the client and server versions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-05/msg00310.php &amp;lt;nowiki&amp;gt;WIP patch for TODO Item: Add prompt escape to display the client and server versions&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add option to wrap column values at whitespace boundaries, rather than chopping them at a fixed width.&lt;br /&gt;
|Currently, &amp;amp;quot;wrapped&amp;amp;quot; format chops values into fixed widths.  Perhaps the word wrapping could use the same algorithm documented in the W3C specification. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00404.php &amp;lt;nowiki&amp;gt;Re: psql wrapped format default for backslash-d commands&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://www.w3.org/TR/CSS21/tables.html#auto-table-layout}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add &amp;amp;quot;auto&amp;amp;quot; expanded mode that outputs in expanded format if &amp;amp;quot;wrapped&amp;amp;quot; mode can't wrap the output to the screen width&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00417.php &amp;lt;nowiki&amp;gt;Re: psql wrapped format default for backslash-d commands&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support the ReST table output format&lt;br /&gt;
|Details about the ReST format:  http://docutils.sourceforge.net/rst.html#reference-documentation&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-08/msg01007.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-01/msg00518.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-01/msg00609.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add option to print advice for people familiar with other databases&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-01/msg01845.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider showing TOAST and index sizes in \dt+&lt;br /&gt;
* http://archives.postgresql.org/pgsql-general/2010-01/msg00912.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow \dd to show constraint comments&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-09/msg00436.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-general/2009-09/msg00199.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ability to edit views with \ev&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-09/msg00023.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== pg_dump / pg_restore ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add dumping of comments on composite type columns&lt;br /&gt;
* {{MessageLink|20090723225940.E35D975331E@cvs.postgresql.org|Teach pg_dump to dump comments attached to the columns of a composite type.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Add full object name to the tag field.  eg. for operators we need '=(integer, integer)', instead of just '='.&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasyDone&lt;br /&gt;
| Add comments to output indicating version of pg_dump and of the database server&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add pg_dumpall custom format dumps?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Avoid using platform-dependent locale names in pg_dumpall output&lt;br /&gt;
|Using native locale names puts roadblocks in the way of porting a dump to another platform.  One possible solution is to get&lt;br /&gt;
CREATE DATABASE to accept some agreed-on set of locale names and fix them up to meet the platform's requirements.&lt;br /&gt;
* http://archives.postgresql.org/message-id/21396.1241716688@sss.pgh.pa.us&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow selection of individual object(s) of all types, not just tables}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|In a selective dump, allow dumping of an object and all its dependencies}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add options like pg_restore -l and -L to pg_dump}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for multiple pg_restore -t options, like pg_dump&lt;br /&gt;
|pg_restore's -t switch is less useful than pg_dump's in quite a few ways: no multiple switches, no pattern matching, no ability to pick up indexes and other dependent items for a selected table.  It should be made to handle this switch just like pg_dump does.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Stop dumping CASCADE on DROP TYPE commands in clean mode}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow pg_dump --clean to drop roles that own objects or have privileges&lt;br /&gt;
|tgl says: if this is about pg_dumpall, it's done as of 8.4.  If it's really about pg_dump, what does it mean?  pg_dump has no business dropping roles.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change pg_dump so that a comment on the dumped database is applied to the loaded database, even if the database has a different name.  This will require new backend syntax, perhaps COMMENT ON CURRENT DATABASE.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Remove unnecessary function pointer abstractions in pg_dump source code}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow pg_dump to utilize multiple CPUs and I/O channels by dumping multiple objects simultaneously&lt;br /&gt;
|The difficulty with this is getting multiple dump processes to produce a single dump output file.  It also would require several sessions to share the same snapshot. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00205.php &amp;lt;nowiki&amp;gt;pg_dump additional options for performance&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow pg_restore to load different parts of the COPY data for a single table simultaneously}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Remove support for dumping from pre-7.3 servers&lt;br /&gt;
|In 7.3 and later, we can get accurate dependency information from the server.  pg_dump still contains a lot of crufty code&lt;br /&gt;
to try to deal with the lack of dependency info in older servers, but the usefulness of maintaining that code grows small.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow pre/data/post files when schema and data are dumped separately, for performance reasons&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00205.php &amp;lt;nowiki&amp;gt;pg_dump additional options for performance&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-patches/2008-07/msg00185.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have pg_dump -C emit ALTER DATABASE ... SET commands after database creation&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg01031.php &amp;lt;nowiki&amp;gt;ALTER DATABASE vs pg_dump&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow parallel restore of tar dumps&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-02/msg01154.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== ecpg ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Docs&lt;br /&gt;
|Document differences between ecpg and the SQL standard and information about the Informix-compatibility module.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Solve cardinality &amp;amp;gt; 1 for input descriptors / variables?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a semantic check level, e.g. check if a table really exists}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|fix handling of DB attributes that are arrays}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Implement SQLDA&lt;br /&gt;
|{{MessageLink|20100105163823.7C70B753FB7@cvs.postgresql.org|add sqlda support to ecpg in both native and compatibility mode}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix nested C comments}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|sqlwarn[6] should be 'W' if the PRECISION or SCALE value specified}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make SET CONNECTION thread-aware, non-standard?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow multidimensional arrays}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement COPY FROM STDIN}} &lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide a way to specify size of a bytea parameter&lt;br /&gt;
* [http://archives.postgresql.org/message-id/200906192131.n5JLVoMo044178@wwwmaster.postgresql.org &amp;lt;nowiki&amp;gt;BUG #4866: ECPG and BYTEA&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== libpq ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add PQescapeIdentifierConn()}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent PQfnumber() from lowercasing unquoted column names&lt;br /&gt;
|PQfnumber() should never have been doing lowercasing, but historically it has so we need a way to prevent it}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow statement results to be automatically batched to the client&lt;br /&gt;
|Currently all statement results are transferred to the libpq client before libpq makes the results available to the application.  This feature would allow the application to make use of the first result rows while the rest are transferred, or held on the server waiting for them to be requested by libpq. One complexity is that a statement like SELECT 1/col could error out mid-way through the result set.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider disallowing multiple queries in PQexec() as an additional barrier to SQL injection attacks&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-01/msg00184.php &amp;lt;nowiki&amp;gt;Re: InitPostgres and flatfiles question&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add PQexecf() that allows complex parameter substitution&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg01803.php &amp;lt;nowiki&amp;gt;Last minute mini-proposal (I know, know) for PQexecf()&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add SQLSTATE and severity to errors generated within libpq itself&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-interfaces/2007-11/msg00015.php &amp;lt;nowiki&amp;gt;v8.1: Error severity on libpq PGconn*&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add code to detect client encoding and locale from the operating system environment&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-06/msg01040.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add keepalive support to libpq&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-02/msg00611.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for interface/ipaddress binding to libpq&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2010-02/msg01811.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Triggers ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve storage of deferred trigger queue&lt;br /&gt;
|Right now all deferred trigger information is stored in backend memory.  This could exhaust memory for very large trigger queues. This item involves dumping large queues into files, or doing some kind of join to process all the triggers, some bulk operation, or a bitmap. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00876.php &amp;lt;nowiki&amp;gt;Re: BUG #4204: COPY to table with FK has memory leak&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-10/msg00464.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow triggers to be disabled in only the current session.&lt;br /&gt;
|This is currently possible by starting a multi-statement transaction, modifying the system tables, performing the desired SQL, restoring the system tables, and committing the transaction.  ALTER TABLE ... TRIGGER requires a table lock so it is not ideal for this usage.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|With disabled triggers, allow pg_dump to use ALTER TABLE ADD FOREIGN KEY&lt;br /&gt;
|If the dump is known to be valid, allow foreign keys to be added without revalidating the data.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow statement-level triggers to access modified rows}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|When statement-level triggers are defined on a parent table, have them fire only on the parent table, and fire child table triggers only where appropriate&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-11/msg01883.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Support triggers on columns&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-07/msg00107.php &amp;lt;nowiki&amp;gt;Column-level triggers&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow AFTER triggers on system tables&lt;br /&gt;
|System tables are modified in many places in the backend without going through the executor and therefore not causing triggers to fire. To complete this item, the functions that modify system tables will have to fire triggers.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Tighten trigger permission checks&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00564.php &amp;lt;nowiki&amp;gt;Security leak with trigger functions?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow BEFORE INSERT triggers on views&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-02/msg01466.php &amp;lt;nowiki&amp;gt;Re: Why can't I put a BEFORE EACH ROW trigger on a view?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add database and transaction-level triggers&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00451.php &amp;lt;nowiki&amp;gt;Proposal for db level triggers&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00620.php &amp;lt;nowiki&amp;gt;triggers on prepare, commit, rollback... ?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce locking requirements for creating a trigger&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00635.php &amp;lt;nowiki&amp;gt;Re: Change lock requirements for adding a trigger&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Inheritance ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow inherited tables to inherit indexes, UNIQUE constraints, and primary/foreign keys}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Honor UNIQUE INDEX on base column in INSERTs/UPDATEs on inherited table, e.g.  INSERT INTO inherit_table (unique_index_col) VALUES (dup) should fail&lt;br /&gt;
|The main difficulty with this item is the problem of creating an index that can span multiple tables.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Determine whether ALTER TABLE / SET SCHEMA should work on inheritance hierarchies (and thus support ONLY).  If yes, implement it.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|ALTER TABLE variants sometimes support recursion and sometimes not, but this is poorly/not documented, and the ONLY marker would then be silently ignored. Clarify the documentation, and reject ONLY if it is not supported.}}&lt;br /&gt;
&lt;br /&gt;
== Indexes ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add UNIQUE capability to non-btree indexes}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent index uniqueness checks when UPDATE does not modify the column&lt;br /&gt;
|Uniqueness (index) checks are done when updating a column even if the column is not modified by the UPDATE.&lt;br /&gt;
However, HOT already short-circuits this in common cases, so more work might not be helpful.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow the creation of on-disk bitmap indexes which can be quickly combined with other bitmap indexes&lt;br /&gt;
|Such indexes could be more compact if there are only a few distinct values. Such indexes can also be compressed.  Keeping such indexes updated can be costly.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-07/msg00512.php &amp;lt;nowiki&amp;gt;Re: Bitmap index AM&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg01107.php &amp;lt;nowiki&amp;gt;Bitmap index thoughts&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg00265.php &amp;lt;nowiki&amp;gt;Stream bitmaps&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg01214.php &amp;lt;nowiki&amp;gt;Re: Bitmapscan changes - Requesting further feedback&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-05/msg00013.php &amp;lt;nowiki&amp;gt;Updated bitmap index patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00741.php &amp;lt;nowiki&amp;gt;Reviewing new index types (was Re: [PATCHES] Updated bitmap indexpatch)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg01023.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow accurate statistics to be collected on indexes with more than one column or expression indexes, perhaps using per-index statistics&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2006-10/msg00222.php &amp;lt;nowiki&amp;gt;Re: Simple join optimized badly?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg01131.php &amp;lt;nowiki&amp;gt;Stats for multi-column indexes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-10/msg00741.php &amp;lt;nowiki&amp;gt;Cross-column statistics revisited&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-06/msg01431.php &amp;lt;nowiki&amp;gt;Multi-Dimensional Histograms&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider having a larger statistics target for indexed columns and expression indexes. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider smaller indexes that record a range of values per heap page, rather than having one index entry for every heap row&lt;br /&gt;
|This is useful if the heap is clustered by the indexed values. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00341.php &amp;lt;nowiki&amp;gt;Grouped Index Tuples&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-02/msg01264.php &amp;lt;nowiki&amp;gt;Grouped Index Tuples&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg00465.php &amp;lt;nowiki&amp;gt;Grouped Index Tuples / Clustered Indexes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-03/msg00163.php &amp;lt;nowiki&amp;gt;Bitmapscan changes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00014.php &amp;lt;nowiki&amp;gt;Re: GIT patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00487.php &amp;lt;nowiki&amp;gt;Re: Index Tuple Compression Approach?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01589.php &amp;lt;nowiki&amp;gt;Re: Index AM change proposals, redux&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add REINDEX CONCURRENTLY, like CREATE INDEX CONCURRENTLY&lt;br /&gt;
|This is difficult because you must upgrade to an exclusive table lock to replace the existing index file.  CREATE INDEX CONCURRENTLY does not have this complication.  This would allow index compaction without downtime. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2007-08/msg00289.php &amp;lt;nowiki&amp;gt;Re: When/if to Reindex&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow multiple indexes to be created concurrently, ideally via a single heap scan&lt;br /&gt;
|pg_restore allows parallel index builds, but it is done via subprocesses, and there is no SQL interface for this.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider sorting entries before inserting into btree index&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2008-01/msg01010.php &amp;lt;nowiki&amp;gt;Re: ATTN: Clodaldo was Performance problem. Could it be related to 8.3-beta4?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow index scans to return matching index keys, not just the matching heap locations&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01657.php &amp;lt;nowiki&amp;gt;Re: Is this TODO item done?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-08/msg01477.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow creation of an index that can do comparisons to test if a value is between two column values&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-05/msg00757.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider using &amp;quot;effective_io_concurrency&amp;quot; for index scans&lt;br /&gt;
* Currently only bitmap scans use this, which might be fine because most multi-row index scans use bitmap scans.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GIST ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add more GIST index support for geometric data types}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow GIST indexes to create certain complex index types, like digital trees (see Aoki)}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix performance issues in contrib/seg and contrib/cube GiST support&lt;br /&gt;
* [http://archives.postgresql.org/message-id/alpine.DEB.2.00.0904161633160.4053@aragorn.flymine.org GiST index performance]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/alpine.DEB.2.00.0904221704470.22330@aragorn.flymine.org draft patch]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== GIN ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support empty indexed values (such as zero-element arrays) properly&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-04/msg00237.php contrib/intarray vs empty arrays]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-05/msg00118.php BUG #4806: Bug with GiST index and empty integer array]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Behave correctly for cases where some elements of an indexed value are NULL}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support queries that require a full scan&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2009-05/msg00402.php Issue report]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-06/msg01132.php Older issue report]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-01/msg01581.php Original discussion of issue and proposed resolution]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Hash ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Pack hash index buckets onto disk pages more efficiently&lt;br /&gt;
|Currently only one hash bucket can be stored on a page. Ideally several hash buckets could be stored on a single page and greater granularity used for the hash algorithm.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-06/msg00168.php &amp;lt;nowiki&amp;gt;Why hash indexes suck&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
However, the binary searching within a hash page probably renders this issue moot.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-committers/2008-09/msg00154.php &amp;lt;nowiki&amp;gt;pgsql: Change hash indexes to store only the hash code rather than the&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add hash WAL logging for crash recovery}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow multi-column hash indexes}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Catalogs ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Improve performance of information_schema views&lt;br /&gt;
* [http://archives.postgresql.org/message-id/29921.1230246746%40sss.pgh.pa.us table_privileges is way too slow]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Improve information_schema's entries for precision and scale&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-05/msg01485.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sorting ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider whether duplicate keys should be sorted by block/offset&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00558.php &amp;lt;nowiki&amp;gt;Remove hacks for old bad qsort() implementations?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider being smarter about memory and external files used during sorts&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg01101.php &amp;lt;nowiki&amp;gt;Sorting Improvements for 8.4&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00045.php &amp;lt;nowiki&amp;gt;Re: Sorting Improvements for 8.4&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider detoasting keys before sorting}}&lt;br /&gt;
&lt;br /&gt;
== Fsync ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Determine optimal fdatasync/fsync, O_SYNC/O_DSYNC options&lt;br /&gt;
|Ideally this requires a separate test program that can be run at initdb time or optionally later.  Consider O_SYNC when O_DIRECT exists.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add program to test if fsync has a delay compared to non-fsync}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider sorting writes during checkpoint&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-06/msg00541.php &amp;lt;nowiki&amp;gt;Sorted writes in checkpoint&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-patches/2008-07/msg00050.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Cache Usage ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Speed up COUNT(*)&lt;br /&gt;
|We could use a fixed row count and a +/- count to follow MVCC visibility rules, or a single cached value could be used and invalidated if anyone modifies the table.  Another idea is to get a count directly from a unique index, but for this to be faster than a sequential scan it must avoid access to the heap to obtain tuple visibility information.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide a way to calculate an &amp;amp;quot;estimated COUNT(*)&amp;amp;quot;&lt;br /&gt;
|Perhaps by using the optimizer's cardinality estimates or random sampling.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-11/msg00943.php &amp;lt;nowiki&amp;gt;Re: Improving count(*)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow data to be pulled directly from indexes&lt;br /&gt;
|Currently indexes do not have enough tuple visibility information to allow data to be pulled from the index without also accessing the heap.  One way to allow this is to set a bit on index tuples to indicate if a tuple is currently visible to all transactions when the first valid heap lookup happens.  This bit would have to be cleared when a heap tuple is expired.&lt;br /&gt;
Another idea is to maintain a bitmap of heap pages where all rows are visible to all backends, and allow index lookups to reference that bitmap to avoid heap lookups, perhaps the same bitmap we might add someday to determine which heap pages need vacuuming.  Frequently accessed bitmaps would have to be stored in shared memory.  One 8k page of bitmaps could track 512MB of heap pages.&lt;br /&gt;
A third idea would be for a heap scan to check if all rows are visible and if so set a per-table flag which can be checked by index scans.  Any change to the table would have to clear the flag.  To detect changes during the heap scan a counter could be set at the start and checked at the end --- if it is the same, the table has not been modified --- any table change would increment the counter.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-10/msg00166.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] Including Snapshot Info with Indexes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-01/msg00049.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] Including Snapshot Info with Indexes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg01094.php &amp;lt;nowiki&amp;gt;TODO item: Allow data to be pulled directly from indexes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-09/msg00003.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider automatic caching of statements at various levels:&lt;br /&gt;
* Parsed query tree&lt;br /&gt;
* Query execute plan&lt;br /&gt;
* Query results &lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg00823.php &amp;lt;nowiki&amp;gt;Cached Query Plans (was: global prepared statements)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider increasing internal areas (NUM_CLOG_BUFFERS) when shared buffers is increased&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-10/msg01419.php &amp;lt;nowiki&amp;gt;Re: slru.c race condition (was Re: TRAP: FailedAssertion(&amp;amp;quot;!((itemid)-&amp;amp;gt;lp_flags &amp;amp;amp; 0x01)&amp;amp;quot;,)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00030.php &amp;lt;nowiki&amp;gt;clog_buffers to 64 in 8.3?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2007-08/msg00024.php &amp;lt;nowiki&amp;gt;CLOG Patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider decreasing the amount of memory used by PrivateRefCount&lt;br /&gt;
|&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-11/msg00797.php &amp;lt;nowiki&amp;gt;PrivateRefCount (for 8.3)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-01/msg00752.php &amp;lt;nowiki&amp;gt;Re: PrivateRefCount (for 8.3)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider allowing higher priority queries to have referenced buffer cache pages stay in memory longer&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00562.php &amp;lt;nowiki&amp;gt;Re: How to keep a table in memory?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Vacuum ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Improve VACUUM FULL's speed when major data movement is needed&lt;br /&gt;
|For large table adjustments during VACUUM FULL, it would be faster to cluster or reindex rather than update the indexes piecemeal as it does now.  Also, this behavior tends to bloat the indexes.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg00024.php &amp;lt;nowiki&amp;gt;Revitalising VACUUM FULL for 8.3&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2007-05/msg00296.php &amp;lt;nowiki&amp;gt;Re: [doc patch] a slight VACUUM / VACUUM FULL doc improvement proposal&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00307.php &amp;lt;nowiki&amp;gt;Re: Unexpected VACUUM FULL failure&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00656.php A note about VACUUM syntax]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-09/msg01045.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Clean up VACUUM FULL's klugy transaction management&lt;br /&gt;
|VACUUM FULL marks its transaction committed before it's really done, which means a PANIC if it fails after that point.  This needs to be&lt;br /&gt;
split into two transactions.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Auto-fill the free space map by scanning the buffer cache or by checking pages written by the background writer&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-02/msg01125.php &amp;lt;nowiki&amp;gt;Dead Space Map&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-03/msg00011.php &amp;lt;nowiki&amp;gt;Re: Automatic free space map filling&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve tracking of total relation tuple counts now that vacuum doesn't always scan the whole heap&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-06/msg00531.php Partial vacuum versus pg_class.reltuples]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Bias FSM towards returning free space near the beginning of the heap file, in hopes that empty pages at the end can be truncated by VACUUM}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make FSM return free space based on table clustering, to assist in maintaining clustering?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider a more compact data representation for dead tuple locations within VACUUM&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-05/msg00143.php &amp;lt;nowiki&amp;gt;Re: Have vacuum emit a warning when it runs out of maintenance_work_mem&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide more information in order to improve user-side estimates of dead space bloat in relations&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2009-05/msg01039.php &amp;lt;nowiki&amp;gt;Re: Bloated Table&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Auto-vacuum ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Issue log message to suggest VACUUM FULL if a table is nearly empty?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent long-lived temporary tables from causing frozen-xid advancement starvation&lt;br /&gt;
|The problem is that autovacuum cannot vacuum them to set frozen xids; only the session that created them can do that. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-06/msg01645.php &amp;lt;nowiki&amp;gt;Re: AutoVacuum Behaviour Question&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent autovacuum from running if an old transaction is still running from the last vacuum&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00899.php &amp;lt;nowiki&amp;gt;Re: Autovacuum and OldestXmin&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have free space allocation bias away from using trailing table pages&lt;br /&gt;
|This improves the chances of truncating the table during vacuum&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-09/msg01124.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Locking ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix priority ordering of read and write light-weight locks&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-11/msg00893.php &amp;lt;nowiki&amp;gt;lwlocks and starvation&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-11/msg00905.php &amp;lt;nowiki&amp;gt;Re: lwlocks and starvation&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix problem when multiple subtransactions of the same outer transaction hold different types of locks, and one subtransaction aborts&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-11/msg01011.php &amp;lt;nowiki&amp;gt;FOR SHARE vs FOR UPDATE locks&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00001.php &amp;lt;nowiki&amp;gt;Re: FOR SHARE vs FOR UPDATE locks&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-02/msg00435.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] [pgsql-patches] Phantom Command IDs, updated patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-05/msg00773.php &amp;lt;nowiki&amp;gt;Re: savepoints and upgrading locks&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow UPDATEs on only non-referential integrity columns not to conflict with referential integrity locks&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-02/msg00073.php &amp;lt;nowiki&amp;gt;Referential Integrity and SHARE locks&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add idle_in_transaction_timeout GUC so locks are not held for long periods of time}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve deadlock detection when a page cleaning lock conflicts with a shared buffer that is pinned&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2008-01/msg00138.php &amp;lt;nowiki&amp;gt;BUG #3883: Autovacuum deadlock with truncate?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00873.php &amp;lt;nowiki&amp;gt;Thoughts about bug #3883&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-committers/2008-01/msg00365.php &amp;lt;nowiki&amp;gt;Re: pgsql: Add checks to TRUNCATE, CLUSTER, and REINDEX to prevent&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Detect deadlocks involving LockBufferForCleanup()&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00873.php &amp;lt;nowiki&amp;gt;Thoughts about bug #3883&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider a lock timeout parameter&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-05/msg00485.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider improving serialized transaction behavior to avoid anomalies&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-05/msg00217.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-05/msg01136.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-06/msg00035.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Startup Time Improvements ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Experiment with multi-threaded backend for backend creation&lt;br /&gt;
|This would prevent the overhead associated with process creation. Most operating systems have trivial process creation time compared to database startup overhead, but a few operating systems (Win32, Solaris) might benefit from threading.  Also explore the idea of a single session using multiple threads to execute a statement faster.}}&lt;br /&gt;
&lt;br /&gt;
== Write-Ahead Log ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Eliminate need to write full pages to WAL before page modification&lt;br /&gt;
|Currently, to protect against partial disk page writes, we write full page images to WAL before they are modified so we can correct any partial page writes during recovery.  These pages can also be eliminated from point-in-time archive files. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2002-06/msg00655.php &amp;lt;nowiki&amp;gt;Re: Index Scans become Seq Scans after VACUUM ANALYSE&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|When full page writes are off, write CRC to WAL and check file system blocks on recovery&lt;br /&gt;
|If CRC check fails during recovery, remember the page in case a later CRC for that page properly matches.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Write full pages during file system write and not when the page is modified in the buffer cache&lt;br /&gt;
|This allows most full page writes to happen in the background writer.  It might cause problems for applying WAL on recovery into a partially-written page, but later the full page will be replaced from WAL.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow WAL traffic to be streamed to another server for stand-by replication}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce WAL traffic so only modified values are written rather than entire rows&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg01589.php &amp;lt;nowiki&amp;gt;Reduction in WAL for UPDATEs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow WAL information to recover corrupted pg_controldata&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-06/msg00025.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] pg_resetxlog -r flag&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Find a way to reduce rotational delay when repeatedly writing last WAL page&lt;br /&gt;
|Currently fsync of WAL requires the disk platter to perform a full rotation to fsync again. One idea is to write the WAL to different offsets that might reduce the rotational delay. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2002-11/msg00483.php &amp;lt;nowiki&amp;gt;500 tpsQL + WAL log implementation&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow WAL logging to be turned off for a table, but the table might be dropped or truncated during crash recovery&lt;br /&gt;
|Allow tables to bypass WAL writes and just fsync() dirty pages on commit.  This should be implemented using ALTER TABLE, e.g. &amp;lt;nowiki&amp;gt;ALTER TABLE PERSISTENCE [ DROP | TRUNCATE | DEFAULT ]&amp;lt;/nowiki&amp;gt;.  Tables using non-default logging should not use referential integrity with default-logging tables.  A table without dirty buffers during a crash could perhaps avoid the drop/truncate. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-12/msg01016.php &amp;lt;nowiki&amp;gt;Re: [Bizgres-general] WAL bypass for INSERT, UPDATE and&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow WAL logging to be turned off for a table, but the table would avoid being truncated/dropped&lt;br /&gt;
|To do this, only a single writer can modify the table, and writes must happen only on new pages so the new pages can be removed during crash recovery.  Readers can continue accessing the table.  Such tables probably cannot have indexes.  One complexity is the handling of indexes on TOAST tables. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-12/msg01016.php &amp;lt;nowiki&amp;gt;Re: [Bizgres-general] WAL bypass for INSERT, UPDATE and&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Speed WAL recovery by allowing more than one page to be prefetched&lt;br /&gt;
|This should be done utilizing the same infrastructure used for prefetching in general to avoid introducing complex error-prone code in WAL replay. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-12/msg00683.php &amp;lt;nowiki&amp;gt;Slow PITR restore&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00497.php &amp;lt;nowiki&amp;gt;Re: [GENERAL] Slow PITR restore&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg01279.php &amp;lt;nowiki&amp;gt;Read-ahead and parallelism in redo recovery&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve WAL concurrency by increasing lock granularity&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00556.php &amp;lt;nowiki&amp;gt;Reworking WAL locking&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Be more aggressive about creating WAL files&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg01325.php &amp;lt;nowiki&amp;gt;Re: PANIC caused by open_sync on Linux&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-07/msg01075.php &amp;lt;nowiki&amp;gt;PreallocXlogFiles&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-04/msg00556.php &amp;lt;nowiki&amp;gt;WAL/PITR additional items&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have resource managers report the duration of their status changes&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg01468.php &amp;lt;nowiki&amp;gt;Recovery of Multi-stage WAL actions&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Move pgfoundry's xlogdump to /contrib and have it rely more closely on the WAL backend code&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00035.php &amp;lt;nowiki&amp;gt;xlogdump&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Close deleted WAL files held open in *nix by long-lived read-only backends&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-11/msg01754.php &amp;lt;nowiki&amp;gt;Deleted WAL files held open by backends in Linux&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-12/msg00060.php &amp;lt;nowiki&amp;gt;Re: Deleted WAL files held open by backends in Linux&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Optimizer / Executor ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve selectivity functions for geometric operators}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Precompile SQL functions to avoid overhead}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Create utility to compute accurate random_page_cost value}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider increasing the default values of from_collapse_limit, join_collapse_limit, and/or geqo_threshold&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4136ffa0905210551u22eeb31bn5655dbe7c9a3aed5@mail.gmail.com from_collapse_limit vs. geqo_threshold]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve ability to display optimizer analysis using OPTIMIZER_DEBUG}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have EXPLAIN ANALYZE issue NOTICE messages when the estimated and actual row counts differ by a specified percentage}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Log statements where the optimizer row estimates were dramatically different from the number of rows actually found?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve how ANALYZE computes in-doubt tuples&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00771.php &amp;lt;nowiki&amp;gt;VACUUM/ANALYZE counting of in-doubt tuples&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider compressed annealing to search for query plans&lt;br /&gt;
|This might replace GEQO.&lt;br /&gt;
* http://archives.postgresql.org/message-id/15658.1241278636%40sss.pgh.pa.us&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider using a hash for joining to a large IN (VALUES ...) list&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-05/msg00450.php &amp;lt;nowiki&amp;gt;Planning large IN lists&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow single batch hash joins to preserve outer pathkeys&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-09/msg00806.php Re: Potential Join Performance Issue]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-04/msg00153.php a few crazy ideas about hash joins]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|&amp;quot;lazy&amp;quot; hash tables - look up only the tuples that are actually requested&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-04/msg00153.php a few crazy ideas about hash joins]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Avoid building the same hash table more than once during the same query&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-04/msg00153.php a few crazy ideas about hash joins]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Avoid hashing for distinct and then re-hashing for hash join&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4136ffa0902191346g62081081v8607f0b92c206f0a@mail.gmail.com Re: Fixing Grittner's planner issues]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-04/msg00153.php a few crazy ideas about hash joins]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow hashing to be used on arrays, if the element type is hashable&lt;br /&gt;
* http://archives.postgresql.org/message-id/11087.1244905821@sss.pgh.pa.us&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve use of expression indexes for ORDER BY &lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-08/msg01553.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Background Writer ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider having the background writer update the transaction status hint bits before writing out the page&lt;br /&gt;
|Implementing this requires the background writer to have access to system catalogs and the transaction status log.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider adding buffers the background writer finds reusable to the free list &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-04/msg00781.php &amp;lt;nowiki&amp;gt;Background LRU Writer/free list&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Automatically tune bgwriter_delay based on activity rather then using a fixed interval&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-04/msg00781.php &amp;lt;nowiki&amp;gt;Background LRU Writer/free list&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider whether increasing BM_MAX_USAGE_COUNT improves performance&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-06/msg01007.php &amp;lt;nowiki&amp;gt;Bgwriter LRU cleaning: we've been going at this all wrong&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Test to see if calling PreallocXlogFiles() from the background writer will help with WAL segment creation latency&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-06/msg00340.php &amp;lt;nowiki&amp;gt;Re: Load Distributed Checkpoints, final patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Concurrent Use of Resources ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Do async I/O for faster random read-ahead of data&lt;br /&gt;
|Async I/O allows multiple I/O requests to be sent to the disk with results coming back asynchronously.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-10/msg00820.php &amp;lt;nowiki&amp;gt;Asynchronous I/O Support&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2007-09/msg00255.php &amp;lt;nowiki&amp;gt;Re: random_page_costs - are defaults of 4.0 realistic for SCSI RAID 1&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00027.php &amp;lt;nowiki&amp;gt;There's random access and then there's random access&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-01/msg00170.php &amp;lt;nowiki&amp;gt;Bitmap index scan preread using posix_fadvise (Was: There's random access and then there's random access)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
The above patch is already applied as of 8.4, but it still remains to figure out how to handle plain indexscans effectively.&lt;br /&gt;
* [http://archives.postgresql.org//pgsql-hackers/2009-01/msg00806.php Problems with the patch submitted for posix_fadvise in index scans]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Experiment with multi-threaded backend for better I/O utilization&lt;br /&gt;
|This would allow a single query to make use of multiple I/O channels simultaneously.  One idea is to create a background reader that can pre-fetch sequential and index scan pages needed by other backends. This could be expanded to allow concurrent reads from multiple devices in a partitioned table.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Experiment with multi-threaded backend for better CPU utilization&lt;br /&gt;
|This would allow several CPUs to be used for a single query, such as for sorting or query execution.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg00945.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|SMP scalability improvements&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00439.php &amp;lt;nowiki&amp;gt;Straightforward changes for increased SMP scalability&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-09/msg00206.php &amp;lt;nowiki&amp;gt;Re: Reducing Transaction Start/End Contention&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00361.php &amp;lt;nowiki&amp;gt;Re: Reducing Transaction Start/End Contention&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== TOAST ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow user configuration of TOAST thresholds&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-02/msg00213.php &amp;lt;nowiki&amp;gt;Re: Proposed adjustments in MaxTupleSize and toastthresholds&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00082.php &amp;lt;nowiki&amp;gt;pg_lzcompress strategy parameters&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce unnecessary cases of deTOASTing&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-09/msg00895.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] Eliminate more detoast copies for packed varlenas&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce costs of repeat de-TOASTing of values&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg01096.php &amp;lt;nowiki&amp;gt;WIP patch: reducing overhead for repeat de-TOASTing&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Performance ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Use mmap() rather than SYSV shared memory or to write WAL files?&lt;br /&gt;
|This would remove the requirement for SYSV SHM but would introduce portability issues. Anonymous mmap (or mmap to /dev/zero) is required to prevent I/O overhead.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider mmap()'ing files into a backend?&lt;br /&gt;
|Doing I/O to large tables would consume a lot of address space or require frequent mapping/unmapping.  Extending the file also causes mapping problems that might require mapping only individual pages, leading to thousands of mappings.  Another problem is that there is no way to _prevent_ I/O to disk from the dirty shared buffers so changes could hit disk before WAL is written.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a script to ask system configuration questions and tune postgresql.conf}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider ways of storing rows more compactly on disk:&lt;br /&gt;
* Reduce the row header size?&lt;br /&gt;
* Consider reducing on-disk varlena length from four bytes to two because a heap row cannot be more than 64k in length}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider transaction start/end performance improvements&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00948.php &amp;lt;nowiki&amp;gt;Reducing Transaction Start/End Contention&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00361.php &amp;lt;nowiki&amp;gt;Re: Reducing Transaction Start/End Contention&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow configuration of backend priorities via the operating system&lt;br /&gt;
|Though backend priorities make priority inversion during lock waits possible, research shows that this is not a huge problem.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-02/msg00493.php &amp;lt;nowiki&amp;gt;Priorities for users or queries?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider increasing the minimum allowed number of shared buffers&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2008-02/msg00157.php &amp;lt;nowiki&amp;gt;Re: [PATCH] Don't bail with legitimate -N/-B options&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider if CommandCounterIncrement() can avoid its AcceptInvalidationMessages() call&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-committers/2007-11/msg00585.php &amp;lt;nowiki&amp;gt;pgsql: Avoid incrementing the CommandCounter when&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider Cartesian joins when both relations are needed to form an indexscan qualification for a third relation&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2007-12/msg00090.php &amp;lt;nowiki&amp;gt;Re: TB-sized databases&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider not storing a NULL bitmap on disk if all the NULLs are trailing&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00624.php &amp;lt;nowiki&amp;gt;Proposal for Null Bitmap Optimization(for Trailing NULLs)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-12/msg00109.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] Proposal for Null Bitmap Optimization(for TrailingNULLs)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Sort large UPDATE/DELETEs so it is done in heap order&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg01119.php &amp;lt;nowiki&amp;gt;Possible future performance improvement: sort updates/deletes by ctid&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow one transaction to see tuples using the snapshot of another transaction&lt;br /&gt;
|This would assist multiple backends in working together. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00400.php &amp;lt;nowiki&amp;gt;Transaction Snapshot Cloning&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider decreasing the I/O caused by updating tuple hint bits&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00847.php &amp;lt;nowiki&amp;gt;Hint Bits and Write I/O&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-07/msg00199.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] Hint Bits and Write I/O&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Other ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Deal with encoding issues for filenames in the server filesystem&lt;br /&gt;
* {{MessageLink|20090413184335.39BE.52131E4D@oss.ntt.co.jp|a proposed patch here}}&lt;br /&gt;
* {{MessageLink|8484.1244655656@sss.pgh.pa.us|some issues about it here}}&lt;br /&gt;
* {{MessageLink|20100107103740.97A5.52131E4D@oss.ntt.co.jp|Windows-specific patch here}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Deal with encoding issues in the output of localeconv()&lt;br /&gt;
* [http://archives.postgresql.org/message-id/40c6d9160904210658y590377cfw6dbbecb53d2b8be0@mail.gmail.com bug report]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/49EF8DA0.90008@tpf.co.jp draft patch]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/21710.1243620986@sss.pgh.pa.us review of patch]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide schema name and other fields available from SQL GET DIAGNOSTICS in error reports&lt;br /&gt;
* [http://archives.postgresql.org/message-id/dcc563d10810211907n3c59a920ia9eb7cd2a6d5ea58@mail.gmail.com &amp;lt;nowiki&amp;gt;How to get schema name which violates fk constraint&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-11/msg00846.php&lt;br /&gt;
* {{MessageLink|3191.1263306359@sss.pgh.pa.us|Re: NOT NULL violation and error-message}}&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-08/msg00213.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add use of 'const' for variables in source tree}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Move some things from contrib into main tree}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Remove warnings created by -Wcast-align}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Move platform-specific ps status display info from ps_status.c to ports}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add optional CRC checksum to heap and index pages&lt;br /&gt;
|One difficulty is how to prevent hint bit changes from affecting the computed CRC checksum.&lt;br /&gt;
* http://archives.postgresql.org/message-id/19934.1226601952%40sss.pgh.pa.us&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg00002.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg01028.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-11/msg00524.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg01101.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-12/msg00011.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve documentation to build only interfaces}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow cross-compiling by generating the zic database on the target system}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve NLS maintenance of libpgport messages linked onto applications}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve the module installation experience (/contrib, etc)&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg00132.php &amp;lt;nowiki&amp;gt;modules&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* {{messageLink|ca33c0a30807231640n6fb4035dod8121a18aa1fa29c@mail.gmail.com|Re: PostgreSQL extensions packaging}}&lt;br /&gt;
* {{messageLink|ca33c0a30804061349s41b4d8fcsa9c579454b27ecd2@mail.gmail.com|Database owner installable modules patch}}&lt;br /&gt;
* http://archives.postgresql.org//pgsql-hackers/2009-03/msg00855.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-05/msg00912.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Use UTF8 encoding for NLS messages so all server encodings can read them properly}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Update Bonjour to work with newer cross-platform SDK&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-09/msg02238.php &amp;lt;nowiki&amp;gt;Darwin stuff is getting deprecated&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-10/msg00048.php &amp;lt;nowiki&amp;gt;Use dns_sd.h for Bonjour&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow creation of universal binaries for Darwin&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-07/msg00884.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider GnuTLS if OpenSSL license becomes a problem&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-05/msg00040.php &amp;lt;nowiki&amp;gt;[PATCH] Add support for GnuTLS&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg01213.php &amp;lt;nowiki&amp;gt;TODO: GNU TLS&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider making NAMEDATALEN more configurable in future releases}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Research use of signals and sleep wake ups&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00003.php &amp;lt;nowiki&amp;gt;Restartable signals 'n all that&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add automated check for invalid C++ source code constructs&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-07/msg00056.php &amp;lt;nowiki&amp;gt;Re: SPI-header-files safe for C++-compiler&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow C++ code to more easily access backend code&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg00302.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider simplifying how memory context resets handle child contexts&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-08/msg00067.php &amp;lt;nowiki&amp;gt;Re: Memory leak in nodeAgg&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Create three versions of libpgport to simplify client code&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg00154.php &amp;lt;nowiki&amp;gt;8.4 TODO item: make src/port support libpq and ecpg directly&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve detection of shared memory segments being used by others by checking the SysV shared memory field 'nattch'&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00656.php &amp;lt;nowiki&amp;gt;postgresql in FreeBSD jails: proposal&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00673.php &amp;lt;nowiki&amp;gt;Re: postgresql in FreeBSD jails: proposal&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement the non-threaded Avahi service discovery protocol&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00939.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] Avahi support for Postgresql&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-02/msg00097.php &amp;lt;nowiki&amp;gt;Re: Avahi support for Postgresql&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg01211.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] Avahi support for Postgresql&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-04/msg00001.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] Avahi support for Postgresql&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix system views like pg_stat_all_tables to use set-returning functions, rather than views of per-column functions}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow table and index WITH options to be specified via hooks, for use with plugins like GiST index methods&lt;br /&gt;
* {{MessageLink|20090105171428.77B29754A17@cvs.postgresql.org|Change the reloptions machinery to use a table-based parser}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce data row alignment requirements on some 64-bit systems&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg00369.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for returning multiple result sets?&lt;br /&gt;
* http://archives.postgresql.org/pgsql-general/2008-10/msg00454.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Restructure TOAST internal storage format for greater flexibility&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-11/msg00049.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow setting of system oids during object creation, for use by pg_migrator&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-08/msg00401.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Documentation ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Convert single quotes to apostrophes in the PDF documentation&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-docs/2007-12/msg00059.php &amp;lt;nowiki&amp;gt;SGML docs and pdf single-quotes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide a manpage for postgresql.conf&lt;br /&gt;
* {{messageLink|20080819194311.GH4428@alvh.no-ip.org|A smaller default postgresql.conf}}&lt;br /&gt;
* {{messageLink|200808211910.37524.peter_e@gmx.net|A smaller default postgresql.conf}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change the manpage-generating toolchain to use the new XML-based docbook2x tools&lt;br /&gt;
* {{messageLink|200808211910.37524.peter_e@gmx.net|A smaller default postgresql.conf}}}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider changing documentation format from SGML to XML&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-docs/2006-12/msg00152.php &amp;lt;nowiki&amp;gt;Re: Authoring Tools WAS: Switching to XML&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Remove configure.in check for link failure when cause is found}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Remove readdir() errno patch when runtime/mingwex/dirent.c rev 1.4 is released}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow psql to use readline once non-US code pages work with backslashes}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix problem with shared memory on the Win32 Terminal Server}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Diagnose problem where shared memory can sometimes not be attached by postmaster children&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-08/msg01377.php &amp;lt;nowiki&amp;gt;FATAL: could not reattach to shared memory (Win32)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/13271.1241561721@sss.pgh.pa.us &amp;lt;nowiki&amp;gt;Re: &amp;quot;could not reattach to shared memory&amp;quot; captured in buildfarm&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve signal handling&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-06/msg00027.php &amp;lt;nowiki&amp;gt;Simplify Win32 Signaling code&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Convert MSVC build system to remove most batch files&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00961.php &amp;lt;nowiki&amp;gt;MSVC build system&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support pgxs when using MSVC}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix MSVC NLS support, like for to_char()&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00485.php &amp;lt;nowiki&amp;gt;NLS on MSVC  strikes back!&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-02/msg00038.php &amp;lt;nowiki&amp;gt;Fix for 8.3 MSVC locale (Was  [HACKERS] NLS on MSVC strikes back!)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Find a correct rint() substitute on Windows&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00808.php &amp;lt;nowiki&amp;gt;Minor bug in src/port/rint.c&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Reduce compiler warnings on 64-bit Windows&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-07/msg00437.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-07/msg00440.php }}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix global namespace issues when using multiple terminal server sessions&lt;br /&gt;
* [http://archives.postgresql.org/message-id/48F3BFCC.8030107@dunslane.net problems with Windows global namespace]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change from the current autoconf/gmake build system to cmake&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg01869.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve consistency of path separator usage&lt;br /&gt;
* http://archives.postgresql.org/message-id/49C0BDC5.4010002@hagander.net&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow compilation using MSVC 2008&lt;br /&gt;
* http://archives.postgresql.org/pgsql-general/2009-08/msg01172.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Wire Protocol Changes ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow dynamic character set handling}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add decoded type, length, precision}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Use compression?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Update clients to use data types, typmod, schema.table.column names of result sets using new statement protocol}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Exotic Features ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add pre-parsing phase that converts non-ISO syntax to supported syntax&lt;br /&gt;
|This could allow SQL written for other databases to run without modification.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow plug-in modules to emulate features from other databases}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add features of Oracle-style packages&lt;br /&gt;
|A package would be a schema with session-local variables, public/private functions, and initialization functions.  It is also possible to implement these capabilities in any schema and not use a separate &amp;amp;quot;packages&amp;amp;quot; syntax at all.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-08/msg00384.php &amp;lt;nowiki&amp;gt;proposal for PL packages for 8.3.&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider allowing control of upper/lower case folding of unquoted identifiers&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-04/msg00818.php &amp;lt;nowiki&amp;gt;Bringing PostgreSQL torwards the standard regarding case folding&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-10/msg01527.php &amp;lt;nowiki&amp;gt;Re: [SQL] Case Preservation disregarding case sensitivity?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00849.php &amp;lt;nowiki&amp;gt;TODO Item: Consider allowing control of upper/lower case folding of unquoted,  identifiers&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-07/msg00415.php &amp;lt;nowiki&amp;gt;Identifier case folding notes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-07/msg00415.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add autonomous transactions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00893.php &amp;lt;nowiki&amp;gt;autonomous transactions&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Give query progress indication&lt;br /&gt;
* [[Query progress indication]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Rethinking our type system&lt;br /&gt;
* [[Rethinking datatypes]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features We Do ''Not'' Want ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|All backends running as threads in a single process (not wanted)&lt;br /&gt;
|This eliminates the process protection we get from the current setup. Thread creation is usually the same overhead as process creation on modern systems, so it seems unwise to use a pure threaded model, and MySQL and DB2 have demonstrated that threads introduce as many issues as they solve.  Threading specific operations such as I/O, seq scans, and connection management has been discussed and will probably be implemented to enable specific performance features.  Moving to a threaded engine would also require halting all other work on PostgreSQL for one to two years.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Optimizer hints (not wanted)&lt;br /&gt;
|Optimizer hints are used to work around problems in the optimizer and introduce upgrade and maintenance issues.  We would rather have the problems reported and fixed.  We have discussed a more sophisticated system of per-class cost adjustment instead, but a specification remains to be developed.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-08/msg00506.php &amp;lt;nowiki&amp;gt;Re: An Idea for planner hints&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-10/msg00517.php &amp;lt;nowiki&amp;gt;Index Tuning Features&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-10/msg00663.php &amp;lt;nowiki&amp;gt;Re: [PERFORM] Hints proposal&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Embedded server (not wanted)&lt;br /&gt;
|While PostgreSQL clients runs fine in limited-resource environments, the server requires multiple processes and a stable pool of resources to run reliably and efficiently. Stripping down the PostgreSQL server to run in the same process address space as the client application would add too much complexity and failure cases. Besides, there are several very mature embedded SQL databases already available.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Obfuscated function source code (not wanted)&lt;br /&gt;
|Obfuscating function source code has minimal protective benefits because anyone with super-user access can find a way to view the code. At the same time, it would greatly complicate backups and other administrative tasks. To prevent non-super-users from viewing function source code, remove SELECT permission on pg_proc.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-general/2008-09/msg00668.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Todo]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/GSoC_2010</id>
		<title>GSoC 2010</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/GSoC_2010"/>
				<updated>2010-02-25T06:50:07Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;/* Past Success */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Key Info ==&lt;br /&gt;
* March 8th - 12th, Mentoring Application Due&lt;br /&gt;
* March 29th - April 9th, Student Applications Due&lt;br /&gt;
&lt;br /&gt;
* [http://socghop.appspot.com/ GSOC 2010 Home page ]&lt;br /&gt;
* [http://socghop.appspot.com/document/show/gsoc_program/google/gsoc2010/faqs GSOC 2010 FAQ]&lt;br /&gt;
* [http://www.postgresql.org/developer/summerofcode Postgres GSOC Page, Needs Updating!]&lt;br /&gt;
&lt;br /&gt;
== Stuff to do: ==&lt;br /&gt;
&lt;br /&gt;
== FInd Admins ==&lt;br /&gt;
* Robert Treat     - Past mentor 2x and co-admin&lt;br /&gt;
* Selena Deckelmann - Co-admin, Mentor Summit attendee.&lt;br /&gt;
&lt;br /&gt;
== Find Mentors ==&lt;br /&gt;
* Dave Page - Former mentor - pgAdmin, Windows, Packaging, Infrastructure &lt;br /&gt;
* Robert Haas - CommitFest Manager&lt;br /&gt;
* Gerd Koenig&lt;br /&gt;
&lt;br /&gt;
== Past Success ==&lt;br /&gt;
* Florian - read-only on snapshots, no advancement of xid on select statements&lt;br /&gt;
* Ivan - Full-Text Support in phpPgAdmin&lt;br /&gt;
* Mickael Deloison - pgScript engine for pgAdmin&lt;br /&gt;
* Luis Alberto Ochoa Paz - Graphical query builder for pgAdmin&lt;br /&gt;
more?&lt;br /&gt;
&lt;br /&gt;
== GOALS: ==&lt;br /&gt;
* usable code&lt;br /&gt;
** useful/novel ideas&lt;br /&gt;
** research projects&lt;br /&gt;
&lt;br /&gt;
* longer term contributors&lt;br /&gt;
&lt;br /&gt;
== TODOs: ==&lt;br /&gt;
&lt;br /&gt;
* Kick-off Meeting for Community Members&lt;br /&gt;
* Update GSOC page &lt;br /&gt;
* Advertising?&lt;br /&gt;
* Blog that we're participating and seeking students&lt;br /&gt;
* Round of private emails to people who have participated in the past: Heikki, Simon, Mark,&lt;br /&gt;
** request interest, and then follow up in asking about possible topics for students&lt;br /&gt;
* Mentor recruitment and then email to -hackers&lt;br /&gt;
** do this much later when we have some proposals in?&lt;br /&gt;
&lt;br /&gt;
* Recruitment -- no organized group effort?&lt;br /&gt;
** -announce, -general, -hackers&lt;br /&gt;
** user group lists&lt;br /&gt;
** phppgadmin/pgadmin&lt;br /&gt;
** berkeley&lt;br /&gt;
** Univ. of Maryland -- contact them?&lt;br /&gt;
&lt;br /&gt;
* Identify the commitfest that the code will be submitted to&lt;br /&gt;
&lt;br /&gt;
== Expectations ==&lt;br /&gt;
&lt;br /&gt;
* Stuff to keep students together:&lt;br /&gt;
** Regular blogging from students&lt;br /&gt;
** weekly group IRC checkin? -- two checkin times maybe?&lt;br /&gt;
&lt;br /&gt;
* Have students communicate on -hackers where appropriate (didn't really work?)&lt;br /&gt;
** Or other relevant -devel lists&lt;br /&gt;
&lt;br /&gt;
* Mailing list&lt;br /&gt;
** pgsql-students (?)  vs. -hackers (?)  maybe up to mentor?&lt;br /&gt;
** mentors mailing list -admin mailing list, berkus said?&lt;br /&gt;
** students mailing list via gsoc&lt;br /&gt;
&lt;br /&gt;
[[Category:Google Summer of Code]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Jabber</id>
		<title>Jabber</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Jabber"/>
				<updated>2010-02-25T06:49:00Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;there is no such thing as proxy.eu.postgresql.org&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Jabber Server ==&lt;br /&gt;
&lt;br /&gt;
If you have an account on the community jabber server with Pidgin, make sure to use:&lt;br /&gt;
&lt;br /&gt;
* Advanced&lt;br /&gt;
** Require SSL/TLS checked&lt;br /&gt;
** Force old (port 5223) SSL checked&lt;br /&gt;
** Allow plaintext auth over unencrypted screens unchecked&lt;br /&gt;
** Connection port: 5223&lt;br /&gt;
** Connect Server: jabber.postgresql.org&lt;br /&gt;
** File transfer proxies: &amp;lt;not needed&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Category:PostgreSQL_9.0</id>
		<title>Category:PostgreSQL 9.0</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Category:PostgreSQL_9.0"/>
				<updated>2010-02-21T18:02:11Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;9.0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All things related to PostgreSQL 9.0&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/85AlphaFeatures</id>
		<title>85AlphaFeatures</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/85AlphaFeatures"/>
				<updated>2010-02-21T17:57:36Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of features, for publication for each alpha release.&lt;br /&gt;
&lt;br /&gt;
== Alpha1 ==&lt;br /&gt;
&lt;br /&gt;
=== SQL ===&lt;br /&gt;
&lt;br /&gt;
* DROP COLUMN and DROP CONSTRAINT now support an IF EXISTS clause so that you can avoid errors when running repeatable scripts.&lt;br /&gt;
* UNIQUE constraints can now be DEFERRABLE&lt;br /&gt;
&lt;br /&gt;
=== Performance ===&lt;br /&gt;
&lt;br /&gt;
* GEQO generic algorithm query plans, for very complex queries, can be made repeatable by setting a geqo_seed.  This will help with debugging bad plans generated by GEQO.&lt;br /&gt;
&lt;br /&gt;
=== Stored Procedures / Functions ===&lt;br /&gt;
&lt;br /&gt;
=== Administration and Monitoring ===&lt;br /&gt;
&lt;br /&gt;
* You may now display the SQLSTATE error code as part of the log_line_prefix in your log by using the %e switch.&lt;br /&gt;
&lt;br /&gt;
=== Tools ===&lt;br /&gt;
&lt;br /&gt;
* pg_standby no longer links to a specific libpq version, preventing unnecessary incompatibility issues.&lt;br /&gt;
* pgbench is now multi-threaded, allowing it to use multiple CPU's for its client connections.&lt;br /&gt;
&lt;br /&gt;
=== psql ===&lt;br /&gt;
&lt;br /&gt;
* The \d+ describe table shortcut now shows the child tables which inherit from the specified table.&lt;br /&gt;
* The \di index describe command now shows the index method.&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
* We have change the names of some internal functions to remove conflicts with C++ reserved words.  This will make it easier to plug-in C++ code to the PostgreSQL codebase.&lt;br /&gt;
&lt;br /&gt;
[[Category:PostgreSQL 9.0]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/DefaultACL</id>
		<title>DefaultACL</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/DefaultACL"/>
				<updated>2010-02-21T17:56:54Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;8.5-&amp;gt;9.0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This project has been mostly completed in PostgreSQL 9.0.&lt;br /&gt;
See also:&lt;br /&gt;
* [http://developer.postgresql.org/pgdocs/postgres/sql-grant.html GRANT] / [http://developer.postgresql.org/pgdocs/postgres/sql-revoke.html REVOKE] IN SCHEMA&lt;br /&gt;
* [http://developer.postgresql.org/pgdocs/postgres/sql-alterdefaultprivileges.html ALTER DEFAULT PRIVILEGES] &lt;br /&gt;
* [http://developer.postgresql.org/pgdocs/postgres/catalog-pg-default-acl.html pg_default_acl]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
On the TODO we have:&lt;br /&gt;
&lt;br /&gt;
Allow GRANT/REVOKE permissions to be inherited by objects based on schema permissions&lt;br /&gt;
&lt;br /&gt;
This is a proposal for implementation of default ACLs/permissions for newly created objects.&lt;br /&gt;
This will only be at object creation time (there is a separate TODO item for doing grant/revoke&lt;br /&gt;
on multiple objects at once using globbing or similar; if I make a proposal on that it'll be&lt;br /&gt;
another wiki page).&lt;br /&gt;
&lt;br /&gt;
== Why to Do This ==&lt;br /&gt;
&lt;br /&gt;
Managing permissions for a large complex database is very labor-intensive.  DBAs are forced to use GUI tools or ad-hoc scripts which are awkward and or error-prone.  As a result, many DBAs avoid creating and maintaining proper role setups at all and run insecure databases.  We get requests for better permissions management for new databases at least 5 times a week on IRC.&lt;br /&gt;
&lt;br /&gt;
Allowing DBAs to set up default permissions for new objects would greatly simplify the task of implementing a database role setup.  It's also a baby step towards having more sophisticated role-based management tools.&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Folks currently involved in design and implementation:&lt;br /&gt;
&lt;br /&gt;
  Stephen Frost - Project lead, developed catalog changes patch&lt;br /&gt;
  Emilie Giustozzi - Working on grammar changes&lt;br /&gt;
  Josh Berkus - Consulting on design &amp;amp; grammar, helping with the wiki&lt;br /&gt;
  Petr Jelinek - Initial gram.y patch, most of coding&lt;br /&gt;
  Simon Riggs - usability review&lt;br /&gt;
&lt;br /&gt;
== Catalog ==&lt;br /&gt;
&lt;br /&gt;
New pg_catalog table: [ [[Media:Nspdefacl_catalog.patch.gz|patch]] ] [ [[Media:Nspdefacl_catalog.uni.patch.gz|Unified patch]] ]&lt;br /&gt;
&lt;br /&gt;
  pg_namespace_default_acl (names can be changed to protect the innocent)&lt;br /&gt;
    defaclnamespace - OID of the schema&lt;br /&gt;
    defaclgrantobjtype - Grantable object kind, char(1) similar to relkind but for all&lt;br /&gt;
               types of grantable objects; this is already defined in an enum&lt;br /&gt;
               in parsenodes.h: GrantObjectType or some such&lt;br /&gt;
               'r' - table&lt;br /&gt;
               'v' - view&lt;br /&gt;
               'f' - function&lt;br /&gt;
               'S' - sequence&lt;br /&gt;
               'C' - column&lt;br /&gt;
                   -- Probably can't support this, to be honest.  It would imply knowing&lt;br /&gt;
                      that all tables created have the column(s) referenced, and would cause&lt;br /&gt;
                      errors most likely if the column wasn't there, which isn't good. &lt;br /&gt;
               'l' - language&lt;br /&gt;
               'W' - foreign-data wrapper&lt;br /&gt;
               'F' - foreign server&lt;br /&gt;
    defacllist[] - array of acls that the object should have on creation&lt;br /&gt;
                   this is NOT a mask, it's exactly what the object will get, in&lt;br /&gt;
                   other words, the default PG perms are ignored if this is&lt;br /&gt;
                   a def_acl in here for that schema/obj_kind&lt;br /&gt;
                   This will look like a regular list of perms, eg:&lt;br /&gt;
                   {role1=arwd/sfrost,role2=r/sfrost}&lt;br /&gt;
    Full row examples:&lt;br /&gt;
    2200, 'r', '{role1=arwd/sfrost,role2=r/sfrost}'&lt;br /&gt;
    2200, 'v', '{role1=r/sfrost,role2=r/sfrost}'&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
Current (as of 2009-07-14) wip patch: [ [[Media:Defaultacls.diff.gz]] ]&lt;br /&gt;
&lt;br /&gt;
Current syntax is implemented based on Josh's ideas with few minor adjustments.&lt;br /&gt;
&lt;br /&gt;
Simple syntax:&lt;br /&gt;
&lt;br /&gt;
  ALTER SCHEMA blah SET DEFAULT PRIVILEGES ON TABLE SELECT TO public;&lt;br /&gt;
  ALTER SCHEMA blah SET DEFAULT PRIVILEGES ON TABLE SELECT TO webuser,admin AND UPDATE to admin AND INSERT to admin AND DELETE to admin;&lt;br /&gt;
  ALTER SCHEMA blah ADD DEFAULT PRIVILEGES ON TABLE INSERT TO webuser;&lt;br /&gt;
  ALTER SCHEMA blab DROP DEFAULT PRIVILEGES ON TABLE DELETE FROM admin;&lt;br /&gt;
&lt;br /&gt;
Multiple privileges to multiple users:&lt;br /&gt;
&lt;br /&gt;
  ALTER SCHEMA blah SET DEFAULT PRIVILEGES ON TABLE SELECT to webuser,admin AND UPDATE,INSERT,DELETE to admin;&lt;br /&gt;
&lt;br /&gt;
And most complex syntax with multiple different privileges on different objects to multiple users:&lt;br /&gt;
&lt;br /&gt;
  ALTER SCHEMA blah SET DEFAULT PRIVILEGES &lt;br /&gt;
      ON TABLE SELECT TO webuser,admin AND UPDATE,INSERT,DELETE TO admin&lt;br /&gt;
      ON VIEW  SELECT TO webuser,admin;&lt;br /&gt;
&lt;br /&gt;
== Syntax suggestions ==&lt;br /&gt;
&lt;br /&gt;
New syntax added to ALTER SCHEMA to support this&lt;br /&gt;
Note:&lt;br /&gt;
Not using grant/revoke terms (or those commands for that matter)&lt;br /&gt;
because it implies something is actually going to happen for existing&lt;br /&gt;
objects, which isn't true.  This is only for new objects which are&lt;br /&gt;
being created&lt;br /&gt;
All of this is subject to acceptance by gram.y, of course.&lt;br /&gt;
&lt;br /&gt;
Suggestion #1:&lt;br /&gt;
&lt;br /&gt;
  ALTER SCHEMA blah SET DEFAULT ACL TABLE select to role1,role2&lt;br /&gt;
                                    TABLE insert to role2&lt;br /&gt;
                                    VIEW select to role1;&lt;br /&gt;
Suggestion #2:  Probably better&lt;br /&gt;
  Force types to be done seperately and reorder things:&lt;br /&gt;
      ALTER SCHEMA blah SET DEFAULT TABLE ACL select to role1,role2&lt;br /&gt;
                                          ACL insert to role2;&lt;br /&gt;
      ALTER SCHEMA blah SET DEFAULT VIEW  ACL select to role1;&lt;br /&gt;
  Also allow using all for either side (priv list or role list):&lt;br /&gt;
      ALTER SCHEMA blah DROP DEFAULT VIEW  ACL all from role1;&lt;br /&gt;
      ALTER SCHEMA blah DROP DEFAULT TABLE ACL select from all;&lt;br /&gt;
      ALTER SCHEMA blah ADD  DEFAULT TABLE ACL all TO role1;&lt;br /&gt;
  All for 'ADD' implies public, below mean the same&lt;br /&gt;
      ALTER SCHEMA blah ADD DEFAULT TABLE ACL SELECT TO all;&lt;br /&gt;
      ALTER SCHEMA blah ADD DEFAULT TABLE ACL SELECT TO public;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suggestion #3:&lt;br /&gt;
&lt;br /&gt;
(Josh Berkus) I'd prefer a syntax which is more natural language, provided we can get gram.y to support it.  Also, I think &amp;quot;ACL&amp;quot; as a keyword is confusing, compared to &amp;quot;permissions&amp;quot; which is both clearer and less likely to be the name of a user DB object.&lt;br /&gt;
&lt;br /&gt;
  ALTER SCHEMA blah SET DEFAULT PERMISSIONS ON TABLE SELECT TO public;&lt;br /&gt;
  ALTER SCHEMA blah SET DEFAULT PERMISSIONS ON TABLE SELECT TO webuser,admin AND UPDATE to admin AND INSERT to admin AND DELETE to admin;&lt;br /&gt;
  ALTER SCHEMA blah ADD DEFAULT PERMISSIONS ON TABLE INSERT TO webuser;&lt;br /&gt;
  ALTER SCHEMA blab DROP DEFAULT PERMISSIONS ON TABLE DELETE FROM admin;&lt;br /&gt;
&lt;br /&gt;
Punctuation could vary according to what gram.y will tolerate.  If it's happy with the below, this would be even better:&lt;br /&gt;
&lt;br /&gt;
  ALTER SCHEMA blah SET DEFAULT PERMISSIONS ON TABLE SELECT to webuser,admin AND UPDATE,INSERT,DELETE to admin;&lt;br /&gt;
&lt;br /&gt;
We might also be able to do:&lt;br /&gt;
&lt;br /&gt;
  ALTER SCHEMA blah SET DEFAULT PERMISSIONS &lt;br /&gt;
          ON TABLE SELECT TO webuser,admin AND UPDATE,INSERT,DELETE TO admin&lt;br /&gt;
      AND ON VIEW  SELECT TO webuser,admin;&lt;br /&gt;
&lt;br /&gt;
Suggestion #4:&lt;br /&gt;
&lt;br /&gt;
(What we're really going to do)&lt;br /&gt;
Basically, Josh's suggestion is where we're headed at the moment.  Emilie Giustozzi is working on the gram.y changes to implement it.&lt;br /&gt;
As she correctly pointed out, we will be using PRIVILEGES instead of PERMISSIONS, as PRIVILEGES is already either a key or semi-key word&lt;br /&gt;
in PG.&lt;br /&gt;
&lt;br /&gt;
Suggestion #5:&lt;br /&gt;
&lt;br /&gt;
(gsmet) I find the &amp;quot;ON TABLE SELECT&amp;quot; part of the proposed syntaxes confusing.&lt;br /&gt;
&lt;br /&gt;
I would prefer a syntax which mimics the GRANT syntax:&lt;br /&gt;
&lt;br /&gt;
  ALTER SCHEMA blah SET DEFAULT PRIVILEGES GRANT SELECT ON TABLE TO webuser;&lt;br /&gt;
  ALTER SCHEMA blah SET DEFAULT PRIVILEGES GRANT UPDATE, INSERT ON TABLE TO admin, superadmin;&lt;br /&gt;
&lt;br /&gt;
Or without the GRANT keyword:&lt;br /&gt;
&lt;br /&gt;
  ALTER SCHEMA blah SET DEFAULT PRIVILEGES SELECT ON TABLE TO webuser;&lt;br /&gt;
  ALTER SCHEMA blah SET DEFAULT PRIVILEGES UPDATE, INSERT ON TABLE TO admin, superadmin;&lt;br /&gt;
&lt;br /&gt;
Simon says: we should use PRIVILEGE rather than plural if we do this&lt;br /&gt;
&lt;br /&gt;
Suggestion #6&lt;br /&gt;
&lt;br /&gt;
If we have an ALTER SCHEMA command for this, then users will need to issue both a GRANT to change existing tables and an ALTER SCHEMA to change new tables. It seems more natural to seek a single command that will change the privilege for new and existing tables. &lt;br /&gt;
&lt;br /&gt;
So, I suggest&lt;br /&gt;
&lt;br /&gt;
GRANT .... ON SCHEMA ..... [WITH DEFAULT OPTION];&lt;br /&gt;
&lt;br /&gt;
So we set existing tables with a GRANT and we set existing *and* new tables with a GRANT  ON ALL ... WITH DEFAULT OPTION.&lt;br /&gt;
That is easier to use since it is a single command, few extra syntax to learn and easier docs/more centralised. It also extends GRANT in a similar way to the extensions suggested for GRANT ALL.&lt;br /&gt;
&lt;br /&gt;
The same concept can then be easily extended to other object types, if need be.&lt;br /&gt;
&lt;br /&gt;
We also need the ability to set the default back to &amp;quot;no default&amp;quot; when required.&lt;br /&gt;
&lt;br /&gt;
REVOKE DEFAULT OPTION FOR ..... ON SCHEMA ....&lt;br /&gt;
&lt;br /&gt;
PJMODOS says:@Simon I remember Tom saying GRANT should not affect any future privileges, that was the whole reason why we used ALTER SCHEMA. Also your way does not allow us to grant only on new objects without affecting existing ones.&lt;br /&gt;
&lt;br /&gt;
== Additional Ideas ==&lt;br /&gt;
&lt;br /&gt;
Suggestion #3:&lt;br /&gt;
Maybe also support syntax to implement the default ACL for an&lt;br /&gt;
object, this would wholesale replace the existing perms, eg:&lt;br /&gt;
&lt;br /&gt;
      ALTER TABLE blah SET DEFAULT ACL;&lt;br /&gt;
  Alternatively, for the arguments above, perhaps have GRANT syntax&lt;br /&gt;
  support this general capability, eg:&lt;br /&gt;
      GRANT DEFAULT ON TABLE blah;&lt;br /&gt;
&lt;br /&gt;
Also support ADD/DROP default acl to allow adding to and deleting from the&lt;br /&gt;
def_acls[] list so you don't always have to specify the entire list.  If&lt;br /&gt;
'set' is used, then everything will be replaced by whatever is provided.&lt;br /&gt;
&lt;br /&gt;
Possible syntax for ownership&lt;br /&gt;
    This will probably be implemented separately as there is some&lt;br /&gt;
    concern about security.  Intent is to implement this as&lt;br /&gt;
    essentially a 'ALTER TABLE blah OWNER TO role1;' as the user&lt;br /&gt;
    creating the table, so they will need the same perms they&lt;br /&gt;
    need to do that to begin with.  This is just a convenience&lt;br /&gt;
    mechanism, not a change in what people are allowed to do.&lt;br /&gt;
    Should mean that you need to be a member of the role you're&lt;br /&gt;
    changing the ownership to, and that role need CREATE rights&lt;br /&gt;
    on the schema.&lt;br /&gt;
        ALTER SCHEMA blah ADD DEFAULT TABLE OWNER role1;&lt;br /&gt;
&lt;br /&gt;
Suggestion #4:&lt;br /&gt;
    Support defaults attached to the creating user rather than the &lt;br /&gt;
    schema that the object is created in. For instance:&lt;br /&gt;
        ALTER USER webuser_admin SET DEFAULT PRIVILEGES SELECT ON TABLE TO webuser_read_only;&lt;br /&gt;
    would mean that all tables created by webuser_admin would &lt;br /&gt;
    grant privileges for SELECT to webuser_read_only.&lt;br /&gt;
&lt;br /&gt;
== Privilege ==&lt;br /&gt;
&lt;br /&gt;
Setting the default privilege for a Schema may require a separate privilege also. This will allow DBAs to grant the ability for users to create tables yet prevent them from changing the underlying administrative structure.&lt;br /&gt;
&lt;br /&gt;
We would need to define a default owner for new objects. This would then be equivalent to running REASSIGN OWNED BY current_role TO default_role; immediately after a table is created.&lt;br /&gt;
&lt;br /&gt;
[[Category:PostgreSQL 9.0]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PostgreSQL_9.0_Open_Items</id>
		<title>PostgreSQL 9.0 Open Items</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PostgreSQL_9.0_Open_Items"/>
				<updated>2010-02-21T17:55:07Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bugs ==&lt;br /&gt;
* {{messageLink|603c8f071001041055j4a8fca2egbe438da50f0e0599@mail.gmail.com|&amp;lt;nowiki&amp;gt;missing need_initialization = false in reloptions code&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-12/msg00267.php COPY staments with paths containing non-ASCII characters under WinXP]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-12/msg00145.php BUG #5245: Full Server Certificate Chain Not Sent to client]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-10/msg00039.php incorrect exit code from psql with single transaction + violation of deferred FK constraint]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-09/msg01297.php Standalone backends run StartupXLOG in an incorrect environment]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4253.1260163602@sss.pgh.pa.us Duplicative display of exclusion constraints in psql \d]&lt;br /&gt;
&lt;br /&gt;
== Planned Further work ==&lt;br /&gt;
&lt;br /&gt;
* [[Hot Standby TODO]] contains various items that need to be addressed for Hot Standby&lt;br /&gt;
* [http://wiki.postgresql.org/wiki/Streaming_Replication#v9.0 Streaming Replication TODO for v9.0] contains various items that need to be addressed.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-11/msg00531.php Improve behavior of SUSET GUC variables added by loadable modules?]&lt;br /&gt;
&lt;br /&gt;
== Security Issues ==&lt;br /&gt;
&lt;br /&gt;
* {{messageLink|28907.1258157302@sss.pgh.pa.us|ALTER ROLE/DATABASE RESET ALL versus security}}&lt;br /&gt;
&lt;br /&gt;
== At BETA time ==&lt;br /&gt;
* Send out summary of new features/changes to other projects e.g. send COPY changes to ETL vendors&lt;br /&gt;
&lt;br /&gt;
= Resolved Issues =&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-12/msg01926.php Hot Standby needs to fully support VACUUM FULL]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-12/msg00078.php BUG #5236: Aparent bug in ecpg]&lt;br /&gt;
** rhaas says: [http://archives.postgresql.org/pgsql-bugs/2010-01/msg00077.php fixed by mmeskes]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-01/msg00643.php AbortOutOfAnyTransaction within ProcessInterrupts is *utterly* unsafe]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-01/msg01645.php Archive recovery broken on EXEC_BACKEND (win32)]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20090811111446.GA25965@depesz.com Poor handling of error cases for deferrable unique constraints]&lt;br /&gt;
* Replace ALTER TABLE ... SET STATISTICS DISTINCT with a general attribute-options facility&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-12/msg00274.php pg_listener entries deleted under heavy NOTIFY load only on Windows]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/23761.1265596434@sss.pgh.pa.us B-tree dead page removal not safe with read-only transactions]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20702.1265306533@sss.pgh.pa.us Bogus handling of relcache init files during HS replay]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-12/msg01716.php Large object ownership and permissions are dumped incorrectly]&lt;br /&gt;
&lt;br /&gt;
[[Category:PostgreSQL 9.0]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Development_information</id>
		<title>Development information</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Development_information"/>
				<updated>2010-02-21T17:53:08Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;point to the 9.0 page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
This area includes developer-targeted documentation regarding aspects of PostgreSQL development.  Please visit the [http://www.postgresql.org/developer developer area] of the PostgreSQL website for more general information about the development of PostgreSQL.  You can find most developers in [irc://irc.freenode.net/postgresql #postgresql on freenode]. A list of IRC nick names with their respective real world names can be found [[IRC2RWNames | here]].&lt;br /&gt;
&lt;br /&gt;
==PostgreSQL 9.0 - Active Development==&lt;br /&gt;
&lt;br /&gt;
* [http://commitfest.postgresql.org/action/commitfest_view/open Open CommitFest] - new patch submissions here&lt;br /&gt;
* [[Todo|Todo list]]&lt;br /&gt;
* [[Todo:Contents|Unofficial Todo Detail]]&lt;br /&gt;
* [[RRReviewers|Round-robin Patch Review]]&lt;br /&gt;
* [[Running a CommitFest]]&lt;br /&gt;
* [[Development projects]] - links to individual projects&lt;br /&gt;
* [[85AlphaFeatures|Alpha Release Feature List]]&lt;br /&gt;
* [[HowToBetaTest|HOWTO Alpha and Beta Test PostgreSQL]]&lt;br /&gt;
* [[PostgreSQL 9.0 Open Items]]&lt;br /&gt;
&lt;br /&gt;
==PostgreSQL 8.4 - Maintenance==&lt;br /&gt;
* [https://commitfest.postgresql.org/ CommitFest]&lt;br /&gt;
* [[PostgreSQL 8.4 Development Plan]]&lt;br /&gt;
* [[Todo:WishlistFor84|Wishlist for 8.4]]&lt;br /&gt;
* [[Waiting for 8.4]] - commentary on commits&lt;br /&gt;
* [[PostgreSQL 8.4 Open Items]]&lt;br /&gt;
* [[84Beta2Changes|Beta 2 Major Changes List]]&lt;br /&gt;
&lt;br /&gt;
== Developer Resources ==&lt;br /&gt;
* [[Developer FAQ]]&lt;br /&gt;
* [[Fixing shift/reduce conflicts in Bison]]&lt;br /&gt;
* [[Submitting a Patch]]&lt;br /&gt;
* [[Reviewing a Patch]]&lt;br /&gt;
* [[Regression test authoring]]&lt;br /&gt;
* [[Working with CVS]]&lt;br /&gt;
* [[Working with Git]]&lt;br /&gt;
* [[Working with Eclipse]] (using CVS)&lt;br /&gt;
* [http://www.postgresql.org/about/featurematrix Feature Matrix]&lt;br /&gt;
* [[PL Matrix|Procedural Language Matrix]]&lt;br /&gt;
* [http://developer.postgresql.org/pgdocs/postgres/index.html Development docs] (updated every 5 minutes)&lt;br /&gt;
* [[PgCon 2009 Developer Meeting]]&lt;br /&gt;
* [[PgCon 2008 Developer Meeting]]&lt;br /&gt;
&lt;br /&gt;
[[Category:CommitFest]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PostgreSQL_8.5_Open_Items</id>
		<title>PostgreSQL 8.5 Open Items</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PostgreSQL_8.5_Open_Items"/>
				<updated>2010-02-21T17:52:11Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;PostgreSQL 8.5 Open Items moved to PostgreSQL 9.0 Open Items: 8.5 is no more - per gripe from Tom on -hackers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[PostgreSQL 9.0 Open Items]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PostgreSQL_9.0_Open_Items</id>
		<title>PostgreSQL 9.0 Open Items</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PostgreSQL_9.0_Open_Items"/>
				<updated>2010-02-21T17:52:10Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;PostgreSQL 8.5 Open Items moved to PostgreSQL 9.0 Open Items: 8.5 is no more - per gripe from Tom on -hackers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bugs ==&lt;br /&gt;
* {{messageLink|603c8f071001041055j4a8fca2egbe438da50f0e0599@mail.gmail.com|&amp;lt;nowiki&amp;gt;missing need_initialization = false in reloptions code&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-12/msg00267.php COPY staments with paths containing non-ASCII characters under WinXP]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-12/msg00145.php BUG #5245: Full Server Certificate Chain Not Sent to client]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-10/msg00039.php incorrect exit code from psql with single transaction + violation of deferred FK constraint]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-09/msg01297.php Standalone backends run StartupXLOG in an incorrect environment]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4253.1260163602@sss.pgh.pa.us Duplicative display of exclusion constraints in psql \d]&lt;br /&gt;
&lt;br /&gt;
== Planned Further work ==&lt;br /&gt;
&lt;br /&gt;
* [[Hot Standby TODO]] contains various items that need to be addressed for Hot Standby&lt;br /&gt;
* [http://wiki.postgresql.org/wiki/Streaming_Replication#v9.0 Streaming Replication TODO for v9.0] contains various items that need to be addressed.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-11/msg00531.php Improve behavior of SUSET GUC variables added by loadable modules?]&lt;br /&gt;
&lt;br /&gt;
== Security Issues ==&lt;br /&gt;
&lt;br /&gt;
* {{messageLink|28907.1258157302@sss.pgh.pa.us|ALTER ROLE/DATABASE RESET ALL versus security}}&lt;br /&gt;
&lt;br /&gt;
== At BETA time ==&lt;br /&gt;
* Send out summary of new features/changes to other projects e.g. send COPY changes to ETL vendors&lt;br /&gt;
&lt;br /&gt;
= Resolved Issues =&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-12/msg01926.php Hot Standby needs to fully support VACUUM FULL]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-12/msg00078.php BUG #5236: Aparent bug in ecpg]&lt;br /&gt;
** rhaas says: [http://archives.postgresql.org/pgsql-bugs/2010-01/msg00077.php fixed by mmeskes]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-01/msg00643.php AbortOutOfAnyTransaction within ProcessInterrupts is *utterly* unsafe]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-01/msg01645.php Archive recovery broken on EXEC_BACKEND (win32)]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20090811111446.GA25965@depesz.com Poor handling of error cases for deferrable unique constraints]&lt;br /&gt;
* Replace ALTER TABLE ... SET STATISTICS DISTINCT with a general attribute-options facility&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-12/msg00274.php pg_listener entries deleted under heavy NOTIFY load only on Windows]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/23761.1265596434@sss.pgh.pa.us B-tree dead page removal not safe with read-only transactions]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20702.1265306533@sss.pgh.pa.us Bogus handling of relcache init files during HS replay]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-12/msg01716.php Large object ownership and permissions are dumped incorrectly]&lt;br /&gt;
&lt;br /&gt;
[[Category:PostgreSQL 8.5]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Aggregate_Median</id>
		<title>Aggregate Median</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Aggregate_Median"/>
				<updated>2009-12-09T19:51:35Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SnippetInfo|Aggregate Median|version=8.4|lang=SQL}}&lt;br /&gt;
[[Category:SQL]]&lt;br /&gt;
by Scott Bailey 'Artacus' &lt;br /&gt;
&lt;br /&gt;
Unlike mode() and range(), this one will only work with PostgreSQL 8.4 and higher due to the dynamic limit and offset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION _final_median(numeric[])&lt;br /&gt;
   RETURNS numeric AS&lt;br /&gt;
$$&lt;br /&gt;
   SELECT AVG(val)&lt;br /&gt;
   FROM (&lt;br /&gt;
     SELECT val&lt;br /&gt;
     FROM unnest($1) val&lt;br /&gt;
     ORDER BY 1&lt;br /&gt;
     LIMIT  2 - MOD(array_upper($1, 1), 2)&lt;br /&gt;
     OFFSET CEIL(array_upper($1, 1) / 2.0) - 1&lt;br /&gt;
   ) sub;&lt;br /&gt;
$$&lt;br /&gt;
LANGUAGE 'sql' IMMUTABLE;&lt;br /&gt;
&lt;br /&gt;
CREATE AGGREGATE median(numeric) (&lt;br /&gt;
  SFUNC=array_append,&lt;br /&gt;
  STYPE=numeric[],&lt;br /&gt;
  FINALFUNC=_final_median,&lt;br /&gt;
  INITCOND='{}'&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== See Also ===&lt;br /&gt;
&lt;br /&gt;
[[Aggregate Mode]]&lt;br /&gt;
[[Aggregate Median]]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/FrOSCon_2009</id>
		<title>FrOSCon 2009</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/FrOSCon_2009"/>
				<updated>2009-08-31T18:18:06Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;small corrections&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= FrOSCon 2009 =&lt;br /&gt;
&lt;br /&gt;
The German PostgreSQL User Group attended the [[http://www.froscon.org FrOSCon 2009]] in St. Augustin, Germany, near Cologne. On Sunday we had our own devroom.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Devroom Details ==&lt;br /&gt;
&lt;br /&gt;
* '''When:''' Sunday, August 23, 2009&lt;br /&gt;
** 10:00am to 3:00pm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Devroom Schedule ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Time&lt;br /&gt;
!Talk&lt;br /&gt;
!Speaker&lt;br /&gt;
!Company&lt;br /&gt;
|-&lt;br /&gt;
| 10:00&lt;br /&gt;
| PostgreSQL &amp;amp; Performance&lt;br /&gt;
| Michael Renner&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 11:00&lt;br /&gt;
| [[Media:Pg-8.4_Andreas_Scherbaum.pdf|Was gibt es neues in PostgreSQL 8.4]]&lt;br /&gt;
| Andreas Scherbaum&lt;br /&gt;
| Andreas Scherbaum&lt;br /&gt;
|-&lt;br /&gt;
| 12:00&lt;br /&gt;
| [[Media:Froscon09_pg_en_Stefan_Kaltenbrunner.pdf|postgresql.org - Die Projektinfrastruktur]]&lt;br /&gt;
| Stefan Kaltenbrunner&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 13:00&lt;br /&gt;
| Testing Postgres with pgTap&lt;br /&gt;
| Rolf Schaufelberger&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ab 14:00&lt;br /&gt;
| Lightning Talk: [[Media:Tophosting_lightning_Stefan_Kaltenbrunner.pdf|mandantenfähige ISP Hosting Plattform]]&lt;br /&gt;
| Stefan Kaltenbrunner&lt;br /&gt;
| conova communications GmbH&lt;br /&gt;
|-&lt;br /&gt;
| ab 14:00&lt;br /&gt;
| Lightning Talk: geizhals.at&lt;br /&gt;
| Michael Renner&lt;br /&gt;
| Preisvergleich Internet Services GmbH&lt;br /&gt;
|-&lt;br /&gt;
| ab 14:00&lt;br /&gt;
| Lightning Talk: Faseroptische Systeme&lt;br /&gt;
| Marek Swierzy + Andreas Scherbaum&lt;br /&gt;
| OSSCAD GmbH &amp;amp; Co. KG&lt;br /&gt;
|-&lt;br /&gt;
| ab 14:00&lt;br /&gt;
| Lightning Talk: [[Media: Pg-in-debian.org_Peter_Palfrader.pdf|PostgreSQL im Debian Projekt]]&lt;br /&gt;
| Peter Palfrader&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ab 14:00&lt;br /&gt;
| Lightning Talk: [[Media:Neue_Usergroup_Webseite_Bjoern_Haeuser.pdf|die neue Usergroup Webseite]]&lt;br /&gt;
| Björn Häuser&lt;br /&gt;
| imos GmbH&lt;br /&gt;
|-&lt;br /&gt;
| ab 14:00&lt;br /&gt;
| Lightning Talk: [[Media:Lightning_talks_FrOSCon_2009_ChristianHofstaedtler_PuppetCM.pdf|Configuration Management using Puppet]]&lt;br /&gt;
| Christian Hofstädtler&lt;br /&gt;
| Inqnet GmbH&lt;br /&gt;
|-&lt;br /&gt;
| ab 14:00&lt;br /&gt;
| Lightning Talk: [[Media:Lightning_talks_FrOSCon_2009_Andreas_Scherbaum.pdf|Uniturm.de]]&lt;br /&gt;
| Andreas Scherbaum&lt;br /&gt;
| Andreas Scherbaum IT-Services&lt;br /&gt;
|-&lt;br /&gt;
| ab 14:00&lt;br /&gt;
| Lightning Talk: [[Media:Lightning_talks_FrOSCon_2009_Andreas_Scherbaum.pdf|urbanite.de]]&lt;br /&gt;
| Andreas Scherbaum&lt;br /&gt;
| Andreas Scherbaum IT-Services&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Performance_QA_Testing</id>
		<title>Performance QA Testing</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Performance_QA_Testing"/>
				<updated>2009-08-30T12:52:37Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;add some free datasets that could be used for benchmarking - inspired by http://ronaldbradford.com/blog/seeking-public-data-for-benchmarks-2009-08-28/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page centralizes the efforts on performances QA testing: available hardware, available tools, continuous benchmarking effort...&lt;br /&gt;
&lt;br /&gt;
The PostgreSQL Performance lab is being created to allow community members of the Open Source database [http://www.postgresql.org/ PostgreSQL] to have enterprise class hardware to test on.&lt;br /&gt;
&lt;br /&gt;
The testing that will occur includes industry standard workloads such as OLTP, DSS and BI. Furthermore we will also use the hardware for other practical and customer oriented testing to improve scalability (processor utilization, i/o, load balancing, etc.) and managing large data sets (loading, backups, restores, replication, etc).&lt;br /&gt;
&lt;br /&gt;
=== Donations ===&lt;br /&gt;
&lt;br /&gt;
For donation inquiries, please contact [mailto:josh@postgresql.org Josh Berkus &amp;lt;josh @t postgresql.org&amp;gt;] and [mailto:jdrake@postgresql.org Joshua Drake &amp;lt;jdrake @t postgresql.org&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
=== Mailing List ===&lt;br /&gt;
&lt;br /&gt;
There is a [http://lists.pgfoundry.org/mailman/listinfo/perflab-general mailing list] available to discuss administrative aspects of community equipment.  Please continue to use the -hackers and -performance mailing lists for performance and technical discussions.&lt;br /&gt;
&lt;br /&gt;
== QA platforms ==&lt;br /&gt;
&lt;br /&gt;
* [[QA Platform hosted at Command Prompt]] - Portland, Oregon, USA&lt;br /&gt;
* [[QA Platform hosted at Open Wide (France)]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* Former OSDL work: [http://osdldbt.sourceforge.net/ Database Test Suite] and [http://crucible.svn.sourceforge.net/viewvc/crucible/ Web interface]&lt;br /&gt;
* [http://www.westnet.com/~gsmith/content/postgresql/pgbench-tools.htm pgbench-tools from Greg Smith]&lt;br /&gt;
* [http://bristlecone.continuent.org/HomePage Bristlecone from Continuent]&lt;br /&gt;
* [http://tsung.erlang-projects.org/ Tsung load injector] allows to define sessions (containing queries and thinktime, etc) and replay them with very high concurrency setup. Can use many loading nodes at a time, multi OS support (written in [http://www.erlang.org/ erlang], extensible in this language)&lt;br /&gt;
* [http://dim.tapoueh.org/temp/tsung-plotter/ Tsung Ploter] plots several tsung runs onto the same graphs set, for easy comparing. Uses python and matplotlib.&lt;br /&gt;
* Tsung DBT2 Implementation (tsung module in erlang), WIP, to get published asap.&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
&lt;br /&gt;
* look into [http://sysbench.sourceforge.net/ sysbench] - it has some issues with locking on postgresql but at least read-only it seems to work fine&lt;br /&gt;
&lt;br /&gt;
* collecting all the various small samples and testcases posted over the last few years on -performance, -hackers &amp;amp; -bugs and put them into a test set&lt;br /&gt;
&lt;br /&gt;
* consider doing tests using pgbench -M (simple|extended|prepared) to catch regressions in one of those modes&lt;br /&gt;
&lt;br /&gt;
* resurrect Jan Wiecks tpc-w implementation available on [http://pgfoundry.org/projects/tpc-w-php/ pgfoundry]&lt;br /&gt;
&lt;br /&gt;
* add full text search benchmarking by using [http://www.sigaev.ru/cvsweb/cvsweb.cgi/ftsbench/ ftsbench] from teodor&lt;br /&gt;
&lt;br /&gt;
* XML benchmarking ?&lt;br /&gt;
&lt;br /&gt;
* investigate [http://advogato.org/person/nconway/diary.html?start=21 QuickCheck] and http://advogato.org/person/nconway/diary/23.html&lt;br /&gt;
&lt;br /&gt;
* Implement the [http://www.cs.umb.edu/~poneil/StarSchemaB.PDF Star Schema Benchmark].&lt;br /&gt;
&lt;br /&gt;
== Datasets ==&lt;br /&gt;
&lt;br /&gt;
Some public datasets that could be used to get realistic data for various kind of benchmarks:&lt;br /&gt;
&lt;br /&gt;
* [http://www.freebase.com/docs/data_dumps Freebase] - Various wiki style data on places/people/things - ~600MB compressed&lt;br /&gt;
* [http://www.imdb.com/interfaces#plain IMDB] - the IMDB database - see also http://code.google.com/p/imbi/&lt;br /&gt;
* [http://www.data.gov/ ] - US federal government data collection see also [http://www.sunlightlabs.com/ sunlightlabs]&lt;br /&gt;
* [http://wiki.dbpedia.org/Downloads DBpedia] - wikipedia data export project&lt;br /&gt;
* [http://linux.dell.com/dvdstore/ Dell DVDstore] - Dells DVD Store context data&lt;br /&gt;
* [http://www.eoddata.com/ eoddata] - historic stock market data (requires reigstration - licence?)&lt;br /&gt;
* [http://www.transtats.bts.gov/Tables.asp?DB_ID=120&amp;amp;DB_Name=Airline%20On-Time%20Performance%20Data&amp;amp;DB_Short_Name=On-Time RITA] - Airline On-Time Performance Data&lt;br /&gt;
* [http://wiki.openstreetmap.org/wiki/Planet.osm Openstreetmap] - Openstreetmap source data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Information ==&lt;br /&gt;
* [http://wiki.postgresql.org/wiki/Performance_Optimization In depth performance articles on PostgreSQL]&lt;br /&gt;
* [http://wiki.postgresql.org/wiki/HP_ProLiant_DL380_G5_Tuning_Guide DL380 Tuning Guide]&lt;br /&gt;
* [http://www.vimeo.com/channels/postgres Videos on Performance and other topics]&lt;br /&gt;
* [http://www.commandprompt.com/blogs/joshua_drake/2008/04/is_that_performance_i_smell_ext2_vs_ext3_on_50_spindles_testing_for_postgresql/ Performance measurements between load and filesystems (Linux)]&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Category_talk:Software_Ports</id>
		<title>Category talk:Software Ports</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Category_talk:Software_Ports"/>
				<updated>2009-08-06T18:24:04Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;/* Bitweaver */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If there is no objection I would like to add Bitweaver to this page.&lt;br /&gt;
&lt;br /&gt;
Many of the lead developers use postgres exclusively. It is fully supported in Bitweaver and sets this project apart from most of the Top 10 at WikiMatrix.&lt;br /&gt;
&lt;br /&gt;
http://bitweaver.org ranks 10th in the WikiMatrix Top 25 most popular wiki CMS.&lt;br /&gt;
&lt;br /&gt;
Features that set Bitweaver apart among the Top 10 include:&lt;br /&gt;
&lt;br /&gt;
Customize Without Fear&lt;br /&gt;
Thanks to highly modular and easily extensible design&lt;br /&gt;
&lt;br /&gt;
Speed from end-to-end&lt;br /&gt;
From schema design, query utilization, to software design&lt;br /&gt;
&lt;br /&gt;
Style Made Easy&lt;br /&gt;
Standard compliant XHTML Strict 1.0 and sophisticated tableless CSS&lt;br /&gt;
&lt;br /&gt;
Datastorage&lt;br /&gt;
MySQL, PostgreSQL, Oracle, and Firebird&lt;br /&gt;
&lt;br /&gt;
Extras&lt;br /&gt;
Blog, Calendar, Image and File Galleries, Forums, Groups, Tags&lt;br /&gt;
&lt;br /&gt;
== Bitweaver ==&lt;br /&gt;
&lt;br /&gt;
seems reasonable - just add it :)&lt;/div&gt;</summary>
		<author><name>Mastermind</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Todo</id>
		<title>Todo</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Todo"/>
				<updated>2009-06-14T07:44:21Z</updated>
		
		<summary type="html">&lt;p&gt;Mastermind:&amp;#32;correct some minor typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;margin: 1ex 1em; float: right;&amp;quot;&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This list contains '''all known PostgreSQL bugs and feature requests'''. If you would like to work on an item, please read the [[Developer FAQ]] first. There is also a [[Development_information|development information page]].&lt;br /&gt;
&lt;br /&gt;
* {{TodoPending}} - marks ordinary, incomplete items&lt;br /&gt;
* {{TodoEasy}} - marks items that are easier to implement&lt;br /&gt;
* {{TodoDone}} - marks changes that are done, and will appear in the next major release&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For help on editing this list, please see [[Talk:Todo]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 1ex 4em;&amp;quot;&amp;gt;&lt;br /&gt;
== Administration ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow administrators to safely terminate individual sessions either via an SQL function or SIGTERM}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow administrators to cancel multi-statement idle transactions&lt;br /&gt;
|This allows locks to be released, but it is complex to report the cancellation back to the client.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg01340.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Check for unreferenced table files created by transactions that were in-progress when the server terminated abruptly&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-06/msg00096.php &amp;lt;nowiki&amp;gt;Removing unreferenced files&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Set proper permissions on non-system schemas during db creation&lt;br /&gt;
|Currently all schemas are owned by the super-user because they are copied from the template1 database.  However, since all objects are inherited from the template database, it is not clear that setting schemas to the db owner is correct.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add function to report the time of the most recent server reload}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow log_min_messages to be specified on a per-module basis&lt;br /&gt;
|This would allow administrators to see more detailed information from specific sections of the backend, e.g. checkpoints, autovacuum, etc. Another idea is to allow separate configuration files for each module, or allow arbitrary SET commands to be passed to them.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Simplify ability to create partitioned tables&lt;br /&gt;
|This would allow creation of partitioned tables without requiring creation of triggers or rules for INSERT/UPDATE/DELETE, and constraints for rapid partition selection.  Options could include range and hash partition selection.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg00375.php &amp;lt;nowiki&amp;gt;Auto creation of Partitions&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-04/msg00151.php &amp;lt;nowiki&amp;gt;Re: Auto Partitioning Patch - WIP version 1&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00028.php &amp;lt;nowiki&amp;gt;Dynamic Partitioning using Segment Visibility Maps&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00248.php &amp;lt;nowiki&amp;gt;Named vs Unnamed Partitions&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00387.php &amp;lt;nowiki&amp;gt;Storage Model for Partitioning&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00413.php &amp;lt;nowiki&amp;gt;Declarative partitioning grammar&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-03/msg00897.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-performance/2009-05/msg00005.php&lt;br /&gt;
* [[Todo:PartitionedTables]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow auto-selection of partitioned tables for min/max() operations}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow more complex user/database default GUC settings&lt;br /&gt;
|Currently ALTER USER and ALTER DATABASE support per-user and per-database defaults.  Consider adding per-user-and-database defaults so things like search_path can be defaulted for a specific user connecting to a specific database.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-09/msg02345.php &amp;lt;nowiki&amp;gt;Re: Per-database search_path&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow custom variables to appear in pg_settings()&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00850.php &amp;lt;nowiki&amp;gt;Re: count(*) performance improvement ideas&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow custom variable classes that can restrict who can set the values&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-11/msg00911.php &amp;lt;nowiki&amp;gt;custom variable classes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement the SQL standard mechanism whereby REVOKE ROLE revokes only the privilege granted by the invoking role, and not those granted by other roles&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-05/msg00010.php &amp;lt;nowiki&amp;gt;Re: Grantor name gets lost when grantor role dropped&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow SSL authentication/encryption over unix domain sockets&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00924.php &amp;lt;nowiki&amp;gt;Re: Spoofing as the postmaster&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow SSL key file permission checks to be optionally disabled when sharing SSL keys with other applications&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-12/msg00069.php &amp;lt;nowiki&amp;gt;BUG #3809: SSL &amp;amp;quot;unsafe&amp;amp;quot; private key permissions bug&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow SSL client certificate names to be checked against the client hostname&lt;br /&gt;
|This is already implemented in libpq/fe-secure.c::verify_peer_name_matches_certificate() but the code is commented out..  Fixed in M. Hagander commit 2008-11-13}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow SSL CRL files to be re-read during configuration file reload, rather than requiring a server restart&lt;br /&gt;
|Unlike SSL CRT files, CRL (Certificate Revocation List) files are updated frequently&lt;br /&gt;
* http://archives.postgresql.org/pgsql-general/2008-12/msg00832.php&lt;br /&gt;
Alternatively or additionally supporting OCSP (online certificate security protocol) would provide real-time revocation discovery without reloading&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Allow automatic selection of SSL client certificates from a certificate store&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-05/msg00406.php &amp;lt;nowiki&amp;gt;Allow multiple certificates or keys in the postgresql.crt/.key files&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add 'hostgss' pg_hba.conf option to allow GSS link-level encryption&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-07/msg01454.php &amp;lt;nowiki&amp;gt;Re: Plans for 8.4&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve server security options&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01875.php &amp;lt;nowiki&amp;gt;Re: [0/4] Proposal of SE-PostgreSQL patches&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00000.php &amp;lt;nowiki&amp;gt;Re: [0/4] Proposal of SE-PostgreSQL patches&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent query cancel packets from being replayed by an attacker, especially when using SSL&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-08/msg00345.php &amp;lt;nowiki&amp;gt;Replay attack of query cancel&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide a way to query the log collector subprocess to determine what the currently active log file is&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2008-11/msg00418.php &amp;lt;nowiki&amp;gt;Current log files when rotating?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow the client to authenticate the server in a Unix-domain socket connection, e.g., using SO_PEERCRED&lt;br /&gt;
* http://archives.postgresql.org/message-id/20090401173756.GB21229@svana.org&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Configuration files ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow pg_hba.conf to specify host names along with IP addresses&lt;br /&gt;
|Host name lookup could occur when the postmaster reads the pg_hba.conf file, or when the backend starts.  Another solution would be to reverse lookup the connection IP and check that hostname against the host names in pg_hba.conf. We could also then check that the host name maps to the IP address. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00569.php &amp;lt;nowiki&amp;gt;TODO Item: Allow pg_hba.conf to specify host names along with IP addresses&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow postgresql.conf file values to be changed via an SQL API, perhaps using SET GLOBAL}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow the server to be stopped/restarted via an SQL API}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Issue a warning if a change-on-restart-only postgresql.conf value is modified  and the server config files are reloaded}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider normalizing fractions in postgresql.conf, perhaps using '%'&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-06/msg00550.php &amp;lt;nowiki&amp;gt;Fractions in GUC variables&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow Kerberos to disable stripping of realms so we can check the username@realm against multiple realms&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00009.php &amp;lt;nowiki&amp;gt;krb_match_realm patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add functions to check correctness of configuration files before they are loaded &amp;quot;live&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve LDAP authentication configuration options&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01745.php &amp;lt;nowiki&amp;gt;Proposed Patch - LDAPS support for servers on port 636 w/o TLS&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add external tool to auto-tune some postgresql.conf parameters&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00000.php &amp;lt;nowiki&amp;gt;Re: Overhauling GUCS&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-11/msg00033.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Tablespaces ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow a database in tablespace t1 with tables created in tablespace t2 to be used as a template for a new database created with default tablespace t2&lt;br /&gt;
|Currently all objects in the default database tablespace must have default tablespace specifications. This is because new databases are created by copying directories. If you mix default tablespace tables and tablespace-specified tables in the same directory, creating a new database from such a mixed directory would create a new database with tables that had incorrect explicit tablespaces.  To fix this would require modifying pg_class in the newly copied database, which we don't currently do.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow reporting of which objects are in which tablespaces&lt;br /&gt;
|This item is difficult because a tablespace can contain objects from multiple databases. There is a server-side function that returns the databases which use a specific tablespace, so this requires a tool that will call that function and connect to each database to find the objects in each database for that tablespace.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow WAL replay of CREATE TABLESPACE to work when the directory structure on the recovery computer is different from the original}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow per-tablespace quotas}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Statistics Collector ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Reduce the frequency that the statistics file is written&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-09/msg00365.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow statistics file location to be user-configured&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-12/msg00106.php &amp;lt;nowiki&amp;gt;Moving pgstat.stat and pgstat.tmp&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow statistics collector information to be pulled from the collector process directly, rather than requiring the collector to write a filesystem file twice a second?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow statistics last vacuum/analyze execution times to be displayed without requiring track_counts to be enabled&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-docs/2007-04/msg00028.php &amp;lt;nowiki&amp;gt;row-level stats and last analyze time&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Clear table counters on TRUNCATE&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg00169.php &amp;lt;nowiki&amp;gt;Small TRUNCATE glitch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
| Allow the clearing of cluster-level statistics&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-03/msg00917.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Point-In-Time Recovery (PITR) ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow a warm standby system to also allow read-only statements&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg00050.php &amp;lt;nowiki&amp;gt;Updated propsoal for read-only queries on PITR slaves (SoC 2007)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Create dump tool for write-ahead logs for use in determining transaction id for point-in-time recovery&lt;br /&gt;
|This is useful for checking PITR recovery.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow recovery.conf to support the same syntax as postgresql.conf, including quoting&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00497.php &amp;lt;nowiki&amp;gt;recovery.conf parsing problems&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Fix server restart problem when the server was shutdown during a PITR backup&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00800.php &amp;lt;nowiki&amp;gt;backup_label and server start&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Recreate pg_xlog/archive_status/ if it doesn't exist after restoring from a PITR backup&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00487.php &amp;lt;nowiki&amp;gt;Recreating archive_status&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow archive_mode to be changed without server restart?&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg01655.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Data Types ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change NUMERIC to enforce the maximum precision}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce storage space for small NUMERICs&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-02/msg01331.php &amp;lt;nowiki&amp;gt;Saving space for common kinds of numeric values&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-02/msg00505.php &amp;lt;nowiki&amp;gt;Numeric patch to add special-case representations for &amp;amp;lt; 8 bytes&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-06/msg00715.php &amp;lt;nowiki&amp;gt;Re: Reducing NUMERIC size for 8.3&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix data types where equality comparison isn't intuitive, e.g. box}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for public SYNONYMs&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-03/msg00519.php &amp;lt;nowiki&amp;gt;Proposal for SYNONYMS&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix CREATE CAST on DOMAINs&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-05/msg00072.php &amp;lt;nowiki&amp;gt;bug? non working casts for domain&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-09/msg01681.php &amp;lt;nowiki&amp;gt;TODO: Fix CREATE CAST on DOMAINs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow domains to be cast&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2003-06/msg01206.php &amp;lt;nowiki&amp;gt;Domain casting still doesn't work right&amp;lt;/nowiki&amp;gt;] &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00289.php &amp;lt;nowiki&amp;gt;domain casting?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make domains work better with polymorphic functions&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4887.1228700773@sss.pgh.pa.us Polymorphic types vs. domains]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/15535.1238774571@sss.pgh.pa.us some difficulties with fixing it]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for SQL-standard GENERATED/IDENTITY columns&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-07/msg00543.php &amp;lt;nowiki&amp;gt;Re: Three weeks left until feature freeze&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-08/msg00038.php &amp;lt;nowiki&amp;gt;GENERATED ... AS IDENTITY, Was: Re: Feature Freeze&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-05/msg00344.php &amp;lt;nowiki&amp;gt;Behavior of GENERATED columns per SQL2003&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-05/msg00076.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] Behavior of GENERATED columns per SQL2003&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00604.php &amp;lt;nowiki&amp;gt;IDENTITY/GENERATED patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve XML support&lt;br /&gt;
* [[XML_Support]]&lt;br /&gt;
* [[XML_Todo]]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider placing all sequences in a single table, or create a system view&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00008.php &amp;lt;nowiki&amp;gt;Re: newbie: renaming sequences task&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow the UUID type to accept non-standard formats&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg01214.php &amp;lt;nowiki&amp;gt;UUID data format 4x-4x-4x-4x-4x-4x-4x-4x&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider a special data type for regular expressions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg01067.php &amp;lt;nowiki&amp;gt;Why is there a tsquery data type?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce BIT data type overhead using short varlena headers&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2007-12/msg00273.php &amp;lt;nowiki&amp;gt;storage size of &amp;amp;quot;bit&amp;amp;quot; data type..&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow xml arrays to be cast to other data types&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-09/msg00981.php &amp;lt;nowiki&amp;gt;proposal casting from XML[] to int[], numeric[], text[]&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg00231.php &amp;lt;nowiki&amp;gt;Re: proposal casting from XML[] to int[], numeric[], text[]&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00471.php &amp;lt;nowiki&amp;gt;Re: proposal casting from XML[] to int[], numeric[], text[]&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Simplify integer cross-data-type operators&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2008-01/msg00189.php &amp;lt;nowiki&amp;gt;why provide cross type arithmetic operators&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow adding/renaming/removing enumerated values to an existing enumerated data type&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01718.php &amp;lt;nowiki&amp;gt;Re: [COMMITTERS] pgsql: Update:  &amp;amp;lt; * Allow adding enumerated	values to an existing&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Dates and Times ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow infinite dates just like infinite timestamps}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow infinite intervals just like infinite timestamps}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow TIMESTAMP WITH TIME ZONE to store the original timezone information, either zone name or offset from UTC&lt;br /&gt;
|If the TIMESTAMP value is stored with a time zone name, interval computations should adjust based on the time zone rules. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-10/msg00705.php &amp;lt;nowiki&amp;gt;timestamp with time zone a la sql99&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix SELECT '0.01 years'::interval, '0.01 months'::interval}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add a GUC variable to allow output of interval values in ISO8601 format}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have timestamp subtraction not call justify_hours()?&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-sql/2006-10/msg00059.php &amp;lt;nowiki&amp;gt;timestamp subtraction (was Re: formatting intervals with to_char)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve timestamptz subtraction to be DST-aware&lt;br /&gt;
|Currently subtracting one date from another that crosses a daylight savings time adjustment can return '1 day 1 hour', but adding that back to the first date returns a time one hour in the future.  This is caused by the adjustment of '25 hours' to '1 day 1 hour', and '1 day' is the same time the next day, even if daylight savings adjustments are involved.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix interval display to support values exceeding 2^31 hours}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add overflow checking to timestamp and interval arithmetic}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Extend timezone code to allow 64-bit values so we can represent years beyond 2038&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-09/msg01363.php &amp;lt;nowiki&amp;gt;TODO item: update source/timezone for 64-bit tz files&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Use LC_TIME for localized weekday/month names, rather than LC_MESSAGES&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-11/msg00390.php &amp;lt;nowiki&amp;gt;Day and month name localization uses wrong locale category&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add ISO INTERVAL handling&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-01/msg00250.php &amp;lt;nowiki&amp;gt;ISO 8601 Intervals&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2006-04/msg00248.php &amp;lt;nowiki&amp;gt;Re: BUG #2403: Date arithemtic using INTERVAL in UPDATE command&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Support ISO INTERVAL syntax if units cannot be determined from the string, and are supplied after the string&lt;br /&gt;
|The SQL standard states that the units after the string specify the units of the string, e.g. INTERVAL '2' MINUTE should return '00:02:00'. The current behavior has the units restrict the interval value to the specified unit or unit range, INTERVAL '70' SECOND returns '00:00:10'.&lt;br /&gt;
For syntax that isn't uniquely ISO or PG syntax, like '1' or '1:30', treat as ISO if there is a range specification clause, and as PG if there no clause is present, e.g. interpret '1:30' MINUTE TO SECOND as '1 minute 30 seconds', and interpret '1:30' as '1 hour, 30 minutes'.&lt;br /&gt;
This makes common cases like SELECT INTERVAL '1' MONTH SQL-standard results. The SQL standard supports a limited number of unit combinations and doesn't support unit names in the string. The PostgreSQL syntax is more flexible in the range of units supported, e.g. PostgreSQL supports '1 year 1 hour', while the SQL standard does not.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add support for year-month syntax, INTERVAL '50-6' YEAR TO MONTH}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Round or truncate values to the requested precision, e.g. INTERVAL '11 months' AS YEAR should return one or zero}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Revise the src/timezone/tznames abbreviation files:&lt;br /&gt;
* to add missing abbreviations&lt;br /&gt;
* to find abbreviations that can be safely promoted to the Default list&lt;br /&gt;
* {{messageLink|7867.1219793881@sss.pgh.pa.us|BUG #4377: casting result of timeofday() to timestamp fails in some timezones}}}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Arrays ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Delay resolution of array expression's data type so assignment coercion can be performed on empty array expressions}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for arrays of domains&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-05/msg00114.php &amp;lt;nowiki&amp;gt;Re: updated WIP: arrays of composites&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow single-byte header storage for array elements}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add function to detect if an array is empty&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-11/msg00475.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve handling of empty arrays&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg01033.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve handling of NULLs in arrays&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2008-11/msg00009.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Binary Data ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve vacuum of large objects, like contrib/vacuumlo?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add security checks for large objects}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Auto-delete large objects when referencing row is deleted&lt;br /&gt;
|contrib/lo offers this functionality.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow read/write into TOAST values like large objects&lt;br /&gt;
|This requires the TOAST column to be stored EXTERNAL.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add API for 64-bit large object access&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-09/msg00781.php &amp;lt;nowiki&amp;gt;64-bit API for large objects&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== MONEY Data Type ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add locale-aware MONEY type, and support multiple currencies&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2005-08/msg01432.php &amp;lt;nowiki&amp;gt;A real currency type&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg01181.php &amp;lt;nowiki&amp;gt;Money type todos?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|MONEY dumps in a locale-specific format making it difficult to restore to a system with a different locale}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow MONEY to be easily cast to/from other numeric data types}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Text Search ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow dictionaries to change the token that is passed on to later dictionaries&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-11/msg00081.php &amp;lt;nowiki&amp;gt;a tsearch2 (8.2.4) dictionary that only filters out stopwords&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider a function-based API for '@@' searches&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg00511.php &amp;lt;nowiki&amp;gt;Simplifying Text Search&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve text search error messages&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg00966.php &amp;lt;nowiki&amp;gt;Poorly designed tsearch NOTICEs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg01146.php &amp;lt;nowiki&amp;gt;Re: Poorly designed tsearch NOTICEs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Consider changing error to warning for strings larger than one megabyte&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2008-02/msg00190.php &amp;lt;nowiki&amp;gt;BUG #3975: tsearch2 index should not bomb out of 1Mb limit&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-03/msg00062.php &amp;lt;nowiki&amp;gt;Re: [BUGS] BUG #3975: tsearch2 index should not bomb out of 1Mb limit&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|tsearch and tsdicts regression tests fail in Turkish locale on glibc&lt;br /&gt;
* [http://archives.postgresql.org/message-id/49749645.5070801@gmx.net tsearch with Turkish locale]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow INET subnet tests using non-constants to be indexed}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow to_date() and to_timestamp() to accept localized month names}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Fix to_date()-related functions to consistently issue errors&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-02/msg00915.php &amp;lt;nowiki&amp;gt;Invalid to_date patterns (was: [PATCHES] [GENERAL] ISO week dates)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2008-08/msg00163.php &amp;lt;nowiki&amp;gt;BUG #4372: TO_DATE with ISO week and day&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add missing parameter handling in to_char()&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-12/msg00948.php &amp;lt;nowiki&amp;gt;Re: to_char and i18n&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow substring/replace() to get/set bit values&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-01/msg00498.php &amp;lt;nowiki&amp;gt;implemented missing bitSetBit() and bitGetBit()&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2004-02/msg00478.php &amp;lt;nowiki&amp;gt;Re: implemented missing bitSetBit() and bitGetBit()&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow to_char() on interval values to accumulate the highest unit requested&lt;br /&gt;
|2= Some special format flag would be required to request such accumulation.  Such functionality could also be added to EXTRACT. Prevent accumulation that crosses the month/day boundary because of the uneven number of days in a month.&lt;br /&gt;
* to_char(INTERVAL '1 hour 5 minutes', 'MI') =&amp;amp;gt; 65&lt;br /&gt;
* to_char(INTERVAL '43 hours 20 minutes', 'MI' ) =&amp;amp;gt; 2600&lt;br /&gt;
* to_char(INTERVAL '43 hours 20 minutes', 'WK:DD:HR:MI') =&amp;amp;gt; 0:1:19:20&lt;br /&gt;
* to_char(INTERVAL '3 years 5 months','MM') =&amp;amp;gt; 41}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Improve to_timestamp() handling of AM/PM, and error messages&lt;br /&gt;
* http://archives.postgresql.org/pgsql-bugs/2008-09/msg00152.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-09/msg01718.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-01/msg00553.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Implement inlining of set-returning functions defined in SQL}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow SQL-language functions to return results from RETURNING queries&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-10/msg00665.php &amp;lt;nowiki&amp;gt;SQL functions, INSERT/UPDATE/DELETE RETURNING, and triggers&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow SQL-language functions to reference parameters by parameter name&lt;br /&gt;
|Currently SQL-language functions can only refer to dollar parameters, e.g. $1}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add SPI_gettypmod() to return the typemod for a TupleDesc}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Enforce typmod for function inputs, function results and parameters for spi_prepare'd statements called from PLs&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-01/msg01403.php &amp;lt;nowiki&amp;gt;Re: BUG #2917: spi_prepare doesn't accept typename aliases&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow holdable cursors in SPI}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Tighten function permission checks&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00568.php &amp;lt;nowiki&amp;gt;Re: Security leak with trigger functions?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix IS OF so it matches the ISO specification, and add documentation&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2003-08/msg00060.php &amp;lt;nowiki&amp;gt;Re: [HACKERS] IS OF&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-02/msg00060.php &amp;lt;nowiki&amp;gt;ToDo: add documentation for operator IS OF&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add missing operators for geometric data types&lt;br /&gt;
|Some geometric types do not have the full suite of geometric operators, e.g. box @&amp;amp;gt; point}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Implement Boyer-Moore searching in strpos()&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-09/msg00425.php &amp;lt;nowiki&amp;gt;Boyer-Moore strpos()&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement Boyer-Moore searching in LIKE queries&lt;br /&gt;
* {{messageLink|27645.1220635769@sss.pgh.pa.us|TODO item: Implement Boyer-Moore searching (First time hacker)}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent malicious functions from being executed with the permissions of unsuspecting users&lt;br /&gt;
|Index functions are safe, so VACUUM and ANALYZE are safe too.  Triggers, CHECK and DEFAULT expressions, and rules are still vulnerable. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-01/msg00268.php &amp;lt;nowiki&amp;gt;Some notes about the index-functions security vulnerability&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Reduce memory usage of aggregates in set returning functions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2008-01/msg00031.php &amp;lt;nowiki&amp;gt;Re: Performance of aggregates over set-returning functions&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add temporal versions of generate_series()&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-04/msg01180.php &amp;lt;nowiki&amp;gt;Re: temporal variants of generate_series()&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add array_agg() and UNNEST functions for arrays&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-08/msg00464.php &amp;lt;nowiki&amp;gt;Re: [GENERAL] array_to_set functions]&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix /contrib/ltree operator&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-11/msg00044.php &amp;lt;nowiki&amp;gt;BUG #3720: wrong results at using ltree&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Fix inconsistent precedence of =, &amp;amp;gt;, and &amp;amp;lt; compared to &amp;amp;lt;&amp;amp;gt;, &amp;amp;gt;=, and &amp;amp;lt;=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-12/msg00145.php &amp;lt;nowiki&amp;gt;BUG #3822: Nonstandard precedence for comparison operators&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix regular expression bug when using complex back-references&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-10/msg00000.php &amp;lt;nowiki&amp;gt;BUG #3645: regular expression back references seem broken&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have /contrib/dblink reuse unnamed connections&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg00895.php &amp;lt;nowiki&amp;gt;dblink un-named connection doesn't get re-used&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow calling of a procedure outside a SELECT that can control the transaction state&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-10/msg01375.php &amp;lt;nowiki&amp;gt;Proposal: real procedures again (8.4)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Fix all set-returning system functions so they support a wildcard target list&lt;br /&gt;
|SELECT * FROM pg_get_keywords() works but SELECT * FROM pg_show_all_settings() does not.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add has_sequence_privilege()&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-09/msg00032.php&lt;br /&gt;
}}&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve formatting of pg_get_viewdef() output&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-01/msg01648.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Multi-Language Support ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add NCHAR (as distinguished from ordinary varchar),}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow locale to be set at database creation&lt;br /&gt;
|Currently locale can only be set during initdb.  No global tables have locale-aware columns.  However, the database template used during database creation might have locale-aware indexes.  The indexes would need to be reindexed to match the new locale.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow more fine-grained collation selection; add CREATE COLLATION.&lt;br /&gt;
|Right now the collation is fixed at database creation time.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-03/msg00932.php &amp;lt;nowiki&amp;gt;Re: Patch for collation using ICU&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-08/msg00039.php &amp;lt;nowiki&amp;gt;FW: Win32 unicode vs ICU&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-08/msg00309.php &amp;lt;nowiki&amp;gt;Re: FW: Win32 unicode vs ICU&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-09/msg00110.php &amp;lt;nowiki&amp;gt;Proof of concept COLLATE support with patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-09/msg00020.php &amp;lt;nowiki&amp;gt;For review: Initial support for COLLATE&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-12/msg01121.php &amp;lt;nowiki&amp;gt;Proposed COLLATE implementation&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-01/msg00767.php &amp;lt;nowiki&amp;gt;TODO item: locale per database patch (new iteration)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-03/msg00233.php &amp;lt;nowiki&amp;gt;Re: FW: Win32 unicode vs ICU&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-09/msg00662.php &amp;lt;nowiki&amp;gt;Re: Fixed length data types issue&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-07/msg00557.php&lt;br /&gt;
* [[Todo:Collate]]&lt;br /&gt;
* [[Todo:ICU]]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-08/msg01362.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-09/msg00012.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg00868.php&lt;br /&gt;
* [http://www.unicode.org/unicode/reports/tr10/ Unicode collation algorithm]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a LOCALE option to CREATE DATABASE, as a shorthand&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-04/msg00119.php &amp;lt;nowiki&amp;gt; Re: 8.4 open items list&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support multiple simultaneous character sets, per SQL:2008}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve UTF8 combined character handling?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add octet_length_server() and octet_length_client()}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make octet_length_client() the same as octet_length()?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix problems with wrong runtime encoding conversion for NLS message files}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add URL to more complete multi-byte regression tests&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-07/msg00272.php &amp;lt;nowiki&amp;gt;Multi-byte and client side character encoding tests for copy command..&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix ILIKE and regular expressions to handle case insensitivity properly in multibyte encodings&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2005-10/msg00001.php &amp;lt;nowiki&amp;gt;BUG #1931: ILIKE and LIKE fails on Turkish locale&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-11/msg00173.php &amp;lt;nowiki&amp;gt;Case Conversion Fix for MB Chars&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix contrib/fuzzystrmatch to work with multibyte encodings&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2009-04/msg00047.php &amp;lt;nowiki&amp;gt; soundex function returns UTF-16 characters&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Set client encoding based on the client operating system encoding&lt;br /&gt;
|Currently client_encoding is set in postgresql.conf, which defaults to the server encoding. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-08/msg01696.php &amp;lt;nowiki&amp;gt;Re: [GENERAL] invalid byte sequence ?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change memory allocation for multi-byte functions so memory is allocated inside conversion functions&lt;br /&gt;
|Currently we preallocate memory based on worst-case usage.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ability to use case-insensitive regular expressions on multi-byte characters&lt;br /&gt;
|ILIKE already works with multi-byte characters&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg00433.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve encoding of connection startup messages sent to the client&lt;br /&gt;
|Currently some authentication error messages are sent in the server encoding&lt;br /&gt;
* http://archives.postgresql.org/pgsql-general/2008-12/msg00801.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-general/2009-01/msg00005.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have pg_stat_activity display query strings in the correct client encoding&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-01/msg00131.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|More sensible support for Unicode combining characters, normal forms&lt;br /&gt;
* http://archives.postgresql.org/message-id/200904141532.44618.peter_e@gmx.net&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Views / Rules ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Automatically create rules on views so they are updateable, per SQL:2008&lt;br /&gt;
|We can only auto-create rules for simple views.  For more complex cases users will still have to write rules manually.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-03/msg00586.php &amp;lt;nowiki&amp;gt;Proposal for updatable views&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-08/msg00255.php &amp;lt;nowiki&amp;gt;Updatable views&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-01/msg01746.php&lt;br /&gt;
* http://wiki.postgresql.org/wiki/Updatable_views&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add the functionality for WITH CHECK OPTION clause of CREATE VIEW}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow VIEW/RULE recompilation when the underlying tables change&lt;br /&gt;
|Another issue is whether underlying table changes should be reflected in the view, e.g. should SELECT * show additional columns if they are added after the view is created.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Make it possible to use RETURNING together with conditional DO INSTEAD rules, such as for partitioning setups&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-09/msg00577.php &amp;lt;nowiki&amp;gt;RETURNING and DO INSTEAD ... Intentional or not?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add the ability to automatically create materialized views&lt;br /&gt;
|Right now materialized views require the user to create triggers on the main table to keep the summary table current.  SQL syntax should be able to manager the triggers and summary table automatically.  A more sophisticated implementation would automatically retrieve from the summary table when the main table is referenced, if possible.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve ability to modify views via ALTER TABLE&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00691.php &amp;lt;nowiki&amp;gt;Re: idea: storing view source in system catalogs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-07/msg01410.php &amp;lt;nowiki&amp;gt;modifying views&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-08/msg00300.php &amp;lt;nowiki&amp;gt;Re: patch: Add columns via CREATE OR REPLACE VIEW&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Enable creation of RETURNING rules on inherited tables that have dropped columns&lt;br /&gt;
|&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2008-06/msg00183.php &amp;lt;nowiki&amp;gt;BUG #4271: dropped columns conflict with returning rules&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== SQL Commands ==&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add CORRESPONDING BY to UNION/INTERSECT/EXCEPT}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ROLLUP, CUBE, GROUPING SETS options to GROUP BY&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg00838.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-05/msg00466.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Allow SET CONSTRAINTS to be qualified by schema/table name}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add a separate TRUNCATE permission&lt;br /&gt;
|Currently only the owner can TRUNCATE a table because triggers are not called, and the table is locked in exclusive mode.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change TRUNCATE to operate on an inheritance hierarchy by default, and add ONLY support to affect a single table&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg01627.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Fix TRUNCATE ... RESTART IDENTITY so its effect on sequences is rolled back on transaction abort&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00550.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] TRUNCATE TABLE with IDENTITY&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow PREPARE of cursors}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow finer control over the caching of prepared query plans&lt;br /&gt;
|Currently queries prepared via the libpq API are planned on first execute using the supplied parameters --- allow SQL PREPARE to do the same.  Also, allow control over replanning prepared queries either manually or automatically when statistics for execute parameters differ dramatically from those used during planning.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve logging of prepared transactions recovered during startup&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-11/msg00092.php &amp;lt;nowiki&amp;gt;&amp;amp;quot;recovering prepared transaction&amp;amp;quot; after server restart message&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Improve failure message when DROP DATABASE is used on a database that has prepared transactions}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow prepared transactions with temporary tables created and dropped in the same transaction, and when an ON COMMIT DELETE ROWS temporary  table is accessed&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00047.php &amp;lt;nowiki&amp;gt;Re: &amp;amp;quot;could not open relation 1663/16384/16584: No such file or directory&amp;amp;quot; in a specific combination of transactions with temp tables&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/492543D5.9050904@enterprisedb.com A suggestion on how to implement this]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add a GUC variable to warn about non-standard SQL usage in queries}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add SQL-standard MERGE/REPLACE/UPSERT command&lt;br /&gt;
|MERGE is typically used to merge two tables.  REPLACE or UPSERT command does UPDATE, or on failure, INSERT. This is similar to UPDATE, then for unmatched rows, INSERT.  Whether concurrent access allows modifications which could cause row loss is implementation independent. To implement this cleanly requires that the table have a unique index so duplicate checking can be easily performed.  It is possible to do it without a unique index if we require the user to LOCK the table before the MERGE.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-11/msg00501.php &amp;lt;nowiki&amp;gt;someone working to add merge?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-11/msg00536.php &amp;lt;nowiki&amp;gt;MERGE vs REPLACE&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01157.php &amp;lt;nowiki&amp;gt;MERGE SQL Statement&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01475.php &amp;lt;nowiki&amp;gt;MERGE Specification&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01890.php &amp;lt;nowiki&amp;gt;Internal design of MERGE, with Rules&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add NOVICE output level for helpful messages like automatic sequence/index creation}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add GUC to issue notice about statements that use unjoined tables}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow EXPLAIN to identify tables that were skipped because of constraint_exclusion}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow EXPLAIN output to be more easily processed by scripts, perhaps XML&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-05/msg00857.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Enable standard_conforming_strings by default in 8.6?&lt;br /&gt;
|When this is done, backslash-quote should be prohibited in non-E&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt; strings because of possible confusion over how such strings treat backslashes.  Basically, &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt; is always safe for a literal single quote, while \' might or might not be based on the backslash handling rules.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Simplify dropping roles that have objects in several databases}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow the count returned by SELECT, etc to be represented as an int64 to allow a higher range of values}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add SQL:2008 Common Table Expression (WITH [RECURSIVE]) clause to SELECT&lt;br /&gt;
* [[CTEReadme]]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-01/msg01375.php &amp;lt;nowiki&amp;gt;Recursive query syntax ambiguity&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00642.php &amp;lt;nowiki&amp;gt;RFP: Recursive query in 8.4&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-03/msg00139.php &amp;lt;nowiki&amp;gt;non-recursive WITH clause support&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-11/msg01334.php &amp;lt;nowiki&amp;gt;Re: PostGreSQL and recursive queries...&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-01/msg00105.php &amp;lt;nowiki&amp;gt;[8.4] Updated WITH clause patch (non-recursive)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-03/msg00327.php &amp;lt;nowiki&amp;gt;Re: [8.4] Updated WITH clause patch (non-recursive)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for WITH RECURSIVE ... CYCLE&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg00291.php}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add DEFAULT .. AS OWNER so permission checks are done as the table owner&lt;br /&gt;
|This would be useful for SERIAL nextval() calls and CHECK constraints.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow DISTINCT to work in multiple-argument aggregate calls}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add column to pg_stat_activity that shows the progress of long-running commands like CREATE INDEX and VACUUM&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-04/msg00203.php &amp;lt;nowiki&amp;gt;EXPLAIN progress info&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Implement SQL:2008 window functions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00380.php &amp;lt;nowiki&amp;gt;proposal: add window function to 8.4&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-07/msg00232.php &amp;lt;nowiki&amp;gt;introduction of WIP window function patch&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow INSERT/UPDATE ... RETURNING inside a SELECT 'FROM' clause or target list&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2006-09/msg00803.php &amp;lt;nowiki&amp;gt;8.2: select from an INSERT returning?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-10/msg00693.php &amp;lt;nowiki&amp;gt;Re: SQL functions, INSERT/UPDATE/DELETE RETURNING, and triggers&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-06/msg00124.php &amp;lt;nowiki&amp;gt;cannot use result of (insert..returning)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Increase locking when DROPing objects so dependent objects cannot get dropped while the DROP operation is happening&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-01/msg00937.php &amp;lt;nowiki&amp;gt;DROP FUNCTION failure: cache lookup failed for relation X&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow AS in &amp;amp;quot;SELECT col AS label&amp;amp;quot; to be optional in certain cases}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow INSERT ... DELETE ... RETURNING, namely allow the DELETE ... RETURNING to supply values to the INSERT &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00979.php &amp;lt;nowiki&amp;gt;insert ... delete ... returning ... ?&amp;lt;/nowiki&amp;gt;]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add comments on system tables/columns using the information in catalogs.sgml&lt;br /&gt;
|Ideally the information would be pulled from the SGML file automatically.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Improve reporting of UNION type mismatches&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-04/msg00944.php &amp;lt;nowiki&amp;gt;Better error message for select_common_type()&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00597.php &amp;lt;nowiki&amp;gt;Re: Better error message for select_common_type()&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent the specification of conflicting transaction read/write options&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-01/msg00684.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support LATERAL subqueries&lt;br /&gt;
|Lateral subqueries can reference columns of tables defined outside the subquery at the same level, i.e. ''laterally''.&lt;br /&gt;
For example, a LATERAL subquery in a FROM clause could reference tables defined in the same FROM clause.&lt;br /&gt;
Currently only the columns of tables defined ''above'' subqueries are recognized.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CREATE ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow CREATE TABLE AS to determine column lengths for complex expressions like SELECT col1 || col2}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have WITH CONSTRAINTS also create constraint indexes&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-04/msg00149.php &amp;lt;nowiki&amp;gt;Re: CREATE TABLE LIKE INCLUDING INDEXES support&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Move NOT NULL constraint information to pg_constraint&lt;br /&gt;
|Currently NOT NULL constraints are stored in pg_attribute without any designation of their origins, e.g. primary keys.  One manifest problem is that dropping a PRIMARY KEY constraint does not remove the NOT NULL constraint designation.&lt;br /&gt;
* http://archives.postgresql.org/message-id/19768.1238680878@sss.pgh.pa.us}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent concurrent CREATE TABLE from sometimes returning a cryptic error message&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-10/msg00169.php &amp;lt;nowiki&amp;gt;BUG #3692: Conflicting create table statements throw unexpected error&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add CREATE SCHEMA ... LIKE that copies a schema}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add CREATE TABLE LIKE ... INCLUDING COMMENTS}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have CREATE TABLE LIKE copy column storage parameters&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-07/msg01417.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-08/msg00423.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-09/msg00576.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-09/msg00824.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|CREATE OR REPLACE FUNCTION might leave dependent objects depending on the function in inconsistent state&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2008-08/msg00985.php indexes on functions and create or replace function]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow GLOBAL temporary tables to exist as empty by default in all sessions&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00006.php &amp;lt;nowiki&amp;gt;what is difference between LOCAL and GLOBAL TEMP TABLES in PostgreSQL&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-04/msg01329.php&lt;br /&gt;
* http://archives.postgresql.org//pgsql-hackers/2009-05/msg00016.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add OR REPLACE to CREATE LANGUAGE&lt;br /&gt;
* http://archives.postgresql.org/pgsql-patches/2008-05/msg00057.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow the creation of &amp;quot;distinct&amp;quot; types&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-10/msg01647.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== UPDATE ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Allow UPDATE tab SET ROW (col, ...) = (SELECT...)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-07/msg01308.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] extension for sql update&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-03/msg00865.php &amp;lt;nowiki&amp;gt;UPDATE using sub selects&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2007-04/msg00315.php &amp;lt;nowiki&amp;gt;UPDATE using sub selects&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-03/msg00237.php &amp;lt;nowiki&amp;gt;Re: UPDATE using sub selects&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Research self-referential UPDATEs that see inconsistent row versions in read-committed mode&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-05/msg00507.php &amp;lt;nowiki&amp;gt;Concurrently updating an updatable view&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-06/msg00016.php &amp;lt;nowiki&amp;gt;Re: Do we need a TODO? (was Re: Concurrently updating anupdatable view)&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== ALTER ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have ALTER TABLE RENAME rename SERIAL sequence names&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00008.php &amp;lt;nowiki&amp;gt;Re: newbie: renaming sequences task&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Allow ALTER TABLE ... ALTER CONSTRAINT ... RENAME&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-02/msg00168.php &amp;lt;nowiki&amp;gt;ALTER CONSTRAINT RENAME patch reverted&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ALTER TABLE RENAME CONSTRAINT, update index name also}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have ALTER SEQUENCE RENAME rename the sequence name stored in the sequence table&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-09/msg00092.php &amp;lt;nowiki&amp;gt;BUG #3619: Renaming sequence does not update its 'sequence_name' field&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-bugs/2007-10/msg00007.php &amp;lt;nowiki&amp;gt;Re: BUG #3619: Renaming sequence does not update its 'sequence_name' field&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00008.php &amp;lt;nowiki&amp;gt;Re: newbie: renaming sequences task&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add ALTER DOMAIN to modify the underlying data type}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Allow ALTER TABLE to change constraint deferrability and actions}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add missing object types for ALTER ... SET SCHEMA}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow ALTER TABLESPACE to move to different directories}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow databases to be moved to different tablespaces}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow moving system tables to other tablespaces, where possible&lt;br /&gt;
|Currently non-global system tables must be in the default database tablespace. Global system tables can never be moved.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Prevent parent tables from altering or dropping constraints like CHECK that are inherited by child tables unless CASCADE is used}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Prevent child tables from altering or dropping constraints like CHECK that were inherited from the parent table}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Have ALTER INDEX update the name of a constraint using that index}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow column display reordering by recording a display, storage, and permanent id for every column?&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-12/msg00782.php &amp;lt;nowiki&amp;gt;Re: column ordering, was Re: [PATCHES] Enums patch v2&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-11/msg01029.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow an existing index to be marked as a table's primary key&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg00500.php &amp;lt;nowiki&amp;gt;Setting a pre-existing index as a primary key&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow ALTER TYPE on composite types to perform operations similar to ALTER TABLE&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg00245.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Don't require table rewrite on ALTER TABLE ... ALTER COLUMN TYPE, when the old and new data types are binary compatible&lt;br /&gt;
* http://archives.postgresql.org/message-id/200903040137.n241bAUV035002@wwwmaster.postgresql.org&lt;br /&gt;
* http://archives.postgresql.org/pgsql-patches/2006-10/msg00154.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== CLUSTER ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Automatically maintain clustering on a table&lt;br /&gt;
|This might require some background daemon to maintain clustering during periods of low usage. It might also require tables to be only partially filled for easier reorganization.  Another idea would be to create a merged heap/index data file so an index lookup would automatically access the heap data too.  A third idea would be to store heap rows in hashed groups, perhaps using a user-supplied hash function.&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2004-08/msg00350.php &amp;lt;nowiki&amp;gt;Equivalent praxis to CLUSTERED INDEX?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-03/msg00155.php &amp;lt;nowiki&amp;gt;Re: Grouped Index Tuples&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* http://community.enterprisedb.com/git/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Add default clustering to system tables&lt;br /&gt;
|To do this, determine the ideal cluster index for each system table and set the cluster setting during initdb.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Add VERBOSE option to report tables as they are processed, like VACUUM VERBOSE}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve CLUSTER performance by sorting to reduce random I/O&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-08/msg01371.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== COPY ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY to report error lines and continue&lt;br /&gt;
|This requires the use of a savepoint before each COPY line is processed, with ROLLBACK on COPY failure. &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-12/msg00572.php &amp;lt;nowiki&amp;gt;Re: VLDB Features&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY on a newly-created table to skip WAL logging&lt;br /&gt;
|On crash recovery, the table involved in the COPY would be removed or have its heap and index files truncated.  One issue is that no other backend should be able to add to the table at the same time, which is something that is currently allowed.  This currently is done if the table is created inside the same transaction block as the COPY because no other backends can see the table.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Consider using a ring buffer for COPY FROM&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2008-02/msg00140.php &amp;lt;nowiki&amp;gt;Bulk Insert tuning&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg01080.php &amp;lt;nowiki&amp;gt;Bulk loading performance improvements&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY FROM to create index entries in bulk&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00811.php &amp;lt;nowiki&amp;gt;Batch update of indexes on data loading&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY in CSV mode to control whether a quoted zero-length string is treated as NULL&lt;br /&gt;
|Currently this is always treated as a zero-length string, which generates an error when loading into an integer column &lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-07/msg00905.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] allow CSV quote in NULL&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve COPY performance&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00954.php &amp;lt;nowiki&amp;gt;Re: 8.3 / 8.2.6 restore comparison&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow COPY to report errors sooner&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-04/msg01169.php &amp;lt;nowiki&amp;gt;Timely reporting of COPY errors&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve bytea COPY format&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2009-05/msg00192.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== GRANT/REVOKE ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemDone&lt;br /&gt;
|Allow column-level privileges}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Allow GRANT/REVOKE permissions to be applied to all schema objects with one command&lt;br /&gt;
|The proposed syntax is: GRANT SELECT ON ALL TABLES IN public TO phpuser; GRANT SELECT ON NEW TABLES IN public TO phpuser;}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow GRANT/REVOKE permissions to be inherited by objects based on schema permissions&lt;br /&gt;
* http://wiki.postgresql.org/wiki/DefaultACL&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow SERIAL sequences to inherit permissions from the base table?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow dropping of a role that has connection rights&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-05/msg00736.php&lt;br /&gt;
}}&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== DECLARE CURSOR ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Prevent DROP TABLE from dropping a table referenced by its own open cursor?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Provide some guarantees about the behavior of cursors that invoke volatile functions&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20997.1244563664@sss.pgh.pa.us Re: Cursor with hold emits the same row more than once across commits in 8.3.7]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== INSERT ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow INSERT/UPDATE of the system-generated oid value for a row}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|In rules, allow VALUES() to contain a mixture of 'old' and 'new' references}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== SHOW/SET ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add SET PERFORMANCE_TIPS option to suggest INDEX, VACUUM, VACUUM ANALYZE, and CLUSTER}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Rationalize the discrepancy between settings that use values in bytes and SHOW that returns the object count&lt;br /&gt;
* http://archives.postgresql.org/pgsql-docs/2008-07/msg00007.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== LISTEN/NOTIFY ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow LISTEN/NOTIFY to store info in memory rather than tables?&lt;br /&gt;
|Currently LISTEN/NOTIFY information is stored in pg_listener.  Storing such information in memory would improve performance.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add optional textual message to NOTIFY&lt;br /&gt;
|This would allow an informational message to be added to the notify message, perhaps indicating the row modified or other custom information.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow multiple identical NOTIFY events to always be communicated to the client, rather than sent as a single notification to the listener&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-general/2008-01/msg00057.php &amp;lt;nowiki&amp;gt;Feature request: NOTIFY enhancement&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow NOTIFY in rules involving conditionals}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Improve LISTEN concurrency&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-02/msg01106.php &amp;lt;nowiki&amp;gt;Idle idea for improving concurrency of LISTEN/NOTIFY&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Window Functions ===&lt;br /&gt;
See {{messageLink|357.1230492361@sss.pgh.pa.us|TODO items for window functions}}.&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Support creation of user-defined window functions.&lt;br /&gt;
|We have the ability to create new window functions written in C.  Is it&lt;br /&gt;
worth the effort to create an API that would let them be written in PL/pgsql, etc?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Implement full support for window framing clauses.&lt;br /&gt;
|The cases we support now are basically those where no row ever exits the frame as the current row advances.  To do better requires some rethinking of the window aggregate support.}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Look at tuplestore performance issues.&lt;br /&gt;
|The tuplestore_in_memory() thing is just a band-aid, we ought to try to solve it properly.  tuplestore_advance seems like a weak spot as well.&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg00152.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem|Do we really need so much duplicated code between Agg and WindowAgg?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Teach planner to evaluate multiple windows in the optimal order.&lt;br /&gt;
|Currently windows are always evaluated in the query-specified order.&lt;br /&gt;
* http://archives.postgresql.org/message-id/3CDAD71E9D70417290FCF66F0178D1E1@amd64&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Integrity Constraints ==&lt;br /&gt;
=== Keys ===&lt;br /&gt;
&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow DEFERRABLE and end-of-statement UNIQUE constraints?&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;This would allow UPDATE tab SET col = col + 1 to work if col has a unique index.  Currently, uniqueness checks are done while the command is being executed, rather than at the end of the statement or transaction.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* http://people.planetpostgresql.org/greg/index.php?/archives/46-Updating-unique-columns.html&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2006-09/msg01458.php &amp;lt;nowiki&amp;gt;Re: Unique index: update error&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
=== Referential Integrity ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add MATCH PARTIAL referential integrity}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Change foreign key constraint for array -&amp;amp;gt; element to mean element in array?}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix problem when cascading referential triggers make changes on cascaded tables, seeing the tables in an intermediate state&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2005-09/msg00174.php &amp;lt;nowiki&amp;gt;Re: [PATCHES] Work-in-progress referential action trigger timing&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Optimize referential integrity checks&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-performance/2005-10/msg00458.php &amp;lt;nowiki&amp;gt;Re: Effects of cascading references in foreign keys&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-04/msg00744.php &amp;lt;nowiki&amp;gt;Can't ri_KeysEqual() consider two nulls as equal?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItemEasy&lt;br /&gt;
|Report the schema along table name in a referential failure error message&lt;br /&gt;
* [http://archives.postgresql.org/message-id/dcc563d10810211907n3c59a920ia9eb7cd2a6d5ea58@mail.gmail.com &amp;lt;nowiki&amp;gt;How to get schema name which violates fk constraint&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoEndSubsection}}&lt;br /&gt;
&lt;br /&gt;
== Server-Side Languages ==&lt;br /&gt;
&lt;br /&gt;
=== PL/pgSQL ===&lt;br /&gt;
{{TodoSubsection}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Fix RENAME to work on variables other than OLD/NEW&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2002-03/msg00591.php &amp;lt;nowiki&amp;gt;Re: PL/pgSQL RENAME bug?&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-01/msg01615.php &amp;lt;nowiki&amp;gt;Re: PL/pgSQL RENAME functionality in TODOs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2007-01/msg01587.php &amp;lt;nowiki&amp;gt;PL/pgSQL RENAME functionality in TODOs&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow function parameters to be passed by name, get_employee_salary(12345 AS emp_id, 2001 AS tax_year)&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-08/msg00559.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2008-12/msg00880.php&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Allow handling of %TYPE arrays, e.g. tab.col%TYPE[]}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Allow listing of record column names, and access to record columns via variables, e.g. columns := r.(*), tval2 := r.(colname)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2005-07/msg00458.php &amp;lt;nowiki&amp;gt;Re: PL/PGSQL: Dynamic Record Introspection&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-05/msg00302.php &amp;lt;nowiki&amp;gt;Re: PL/PGSQL: Dynamic Record Introspection&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-patches/2006-06/msg00031.php &amp;lt;nowiki&amp;gt;Re: PL/PGSQL: Dynamic Record Introspection&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&lt;br /&gt;
|Add support for SCROLL cursors}}&lt;br /&gt;
&lt;br /&gt;
{{TodoItem&l