nyuuzyou/wikis huggingface dataset:
TodoDone90

__TOC__
This list contains all PostgreSQL bugs and features requests that were solved in 9.0. There is a Todo page too for bugs and features that are still not solved.
== Administration ==
=== Tablespaces ===
=== Point-In-Time Recovery (PITR) ===
=== Standby server mode ===
== Data Types ==
=== Dates and Times ===
=== Binary Data ===
=== XML ===
== Functions ==
== SQL Commands ==
=== CREATE ===
=== COPY ===
=== GRANT/REVOKE ===
=== LISTEN/NOTIFY ===
=== Window Functions ===
See .
== Integrity Constraints ==
=== Keys ===
== Server-Side Languages ==
=== PL/pgSQL ===
=== PL/Python ===
 create table users (first_name text, last_name text);
 create function user_name(user) returns text as 'mycode' language plpython;
 select user_name(user) from users;
 alter table add column user_id integer;
 select user_name(user) from users;
You have to drop and create the function(s) each time its arguments
are modified (not nice), or don't cache the input and output functions
(slower?), or check if the structure of the argument has been
altered (is this possible, easy, quick?) and recreate cache.}}
== Clients ==
=== pg_dump / pg_restore ===
=== ecpg ===
=== libpq ===
== Triggers ==
== Indexes ==
=== Hash ===
== Catalogs ==
== Vacuum ==
== Write-Ahead Log ==
== Source Code ==
=== /contrib/pg_upgrade ===
=== Windows ===
Category:Todo
Category:PostgreSQL 9.0
Category:Historical information
TodoDone91

__TOC__
This list contains all PostgreSQL bugs and features requests that were solved in 9.1. There is a Todo page too for bugs and features that are still not solved.
== Administration ==
=== Configuration files ===
=== Statistics Collector ===
=== Point-In-Time Recovery (PITR) ===
=== Standby server mode ===
== Data Types ==
=== MONEY Data Type ===
=== XML ===
== Functions ==
== Multi-Language Support ==
== SQL Commands ==
=== CREATE ===
=== ALTER ===
=== CLUSTER ===
== Server-Side Languages ==
=== PL/Python ===
== Clients ==
=== psql ===
=== libpq ===
== Indexes ==
=== GIN ===
== Locking ==
== Write-Ahead Log ==
== Optimizer / Executor ==
=== Hashing ===
== Source Code ==
=== /contrib/pg_upgrade ===
Category:Todo
Category:PostgreSQL_9.1
Category:Historical information
Todo:WishlistFor84

= Wishlist for PostgreSQL 8.4.0 =
This list ist not maintained any more - please look at here for features proposed for the current commitfest or the featurematrix for a list of recently added features. We also keep a list of TODO items done for 8.4.
== Proposed ==
* Updatable VIEWs (Bernd)
* On disk bitmap index (Gavin Sherry, Heikki Linnakangas)
* Temporal data type
== Postponed ==
* Concurrent psql (Gregory Stark)
* Create a mechanism for plperl to load modules safely (Andrew Dunstan)
* Fix permissions properly on custom GUC vars (Andrew Dunstan)
* Group commit (Heikki Linnakangas)
* Grouped Index Tuples (Heikki Linnakangas)¨
* large file support (Zdenek Kotala)
* MERGE (Simon Riggs)
* Notification payload messages (Andrew Dunstan)
* Stacked recordset (multirecordset)
* Updates using subselect (Nikhils)
* Better handling of partitioning (Nikhils)
* Index Advisor (Gurjeet Singh)
* SQL/PSM support per SQL:2003 (patch)(Pavel)
== Done ==
* EXECUTE USING (Pavel) 
* WITH and WITH RECURSIVE hierarchical queries (Yoshiyuki Asaba with help from Tatsuo Ishii and Tom Lane)
* Visibility map / Dead space map (Heikki Linnakangas)
* SQL:2003 window functions (Hitoshi Harada)
Category:PostgreSQL 8.4
Tools and tips for develpment in PL/pgSQL language

* Ora2pg - conversion from Oracle to Postgres (conversion from PL/SQL to PL/pgSQL is included)
* plpgsql_check - multi-purpose tool for PL/pgSQL developers based on static analyse of source code - check validity of SQL identifiers, detect SQL injection and some performance problems. This tool use PL/pgSQL debug API, and can be used for code profiling, tracing. It can display dependency list and two code coverage metrics.
* plProfiler - profiler for PL/pgSQL with nice html reports (with flame graphs)
* pldbgapi - this extension allows to use remotely PL/pgSQL debug API. It is necessary for using PLpgSQL interactive debugger from PgAdmin.
Topological sort

Example usage:
SELECT topological_sort(
 ARRAY[5,7,3,11,8,2,9,10],
 hstore '11 => "{5,7}", 8 => "{7,3}", 2 => "{11}", 9 => "{8,11}", 10 => "{3,11}"'
);
Here's the function source code:
CREATE OR REPLACE FUNCTION topological_sort(_nodes int[], _edges hstore)
RETURNS int[]
LANGUAGE plpgsql
AS $$
DECLARE
_L int[];
_S int[];
_n int;
_all_ms text[];
_m text;
_n_m_edges int[];
BEGIN
_L := '{}';
_S := ARRAY(
 SELECT u.node
 FROM unnest(_nodes) u(node)
 WHERE (_edges->(u.node::text)) IS NULL
);
IF array_length(_S, 1) IS NULL THEN
 RAISE EXCEPTION 'no nodes with no incoming edges in input';
END IF;
WHILE array_length(_S, 1) IS NOT NULL LOOP
 _n := _S[1];
 _S := _S[2:];
 _L := array_append(_L, _n);
 _all_ms := ARRAY(
 SELECT each.key
 FROM each(_edges)
 WHERE (each.value)::int[] @> ARRAY[_n]
 );
 FOREACH _m IN ARRAY _all_ms LOOP
 _n_m_edges := (_edges->_m)::int[];
 IF _n_m_edges = ARRAY[_n] THEN
 _S := array_append(_s, _m::int);
 _edges := _edges - _m;
 ELSE
 _edges := _edges || hstore(_m, array_remove(_n_m_edges, _n)::text);
 END IF;
 END LOOP;
END LOOP;
IF _edges <> THEN
 RAISE EXCEPTION 'input graph contains cycles';
END IF;
RETURN _L;
END
$$;
Towers of Hanoi

-- auxiliary function for towers of hanoi
-- select the next state for a given move for a given stick
create or replace function hnext (move int, ndiscs int,
 this int[], right int[], left int[])
 returns int[]
 language sql as
$$
 select
 case when $1 % 2 = 1 then
 -- on odd numbered moves move smallest disc, 
 -- clockwise if ndiscs is odd, counterclockwise if it's even
 case when 1 = any($3) then
 $3[array_lower($3,1):array_upper($3,1)-1]
 when $2 %2 = 1 and 1 = any($5) then
 $3 || 1
 when $2 %2 = 0 and 1 = any($4) then
 $3 || 1
 else $3
 end
 else
 -- on even numbered moves, make the only other move possible
 case when 1 = any($3) then
 $3
 when 1 = any($5) then
 case when array_length($3,1) = 1 then
 $3 || $4[array_upper($4,1)]
 when array_length($4,1) = 1 then
 $3[array_lower($3,1):array_upper($3,1)-1]
 when $3[array_upper($3,1)] < $4[array_upper($4,1)] then
 $3[array_lower($3,1):array_upper($3,1)-1]
 else 
 $3 || $4[array_upper($4,1)]
 end
 else
 case when array_length($3,1) = 1 then
 $3 || $5[array_upper($5,1)]
 when array_length($5,1) = 1 then
 $3[array_lower($3,1):array_upper($3,1)-1]
 when $3[array_upper($3,1)] < $5[array_upper($5,1)] then
 $3[array_lower($3,1):array_upper($3,1)-1]
 else 
 $3|| $5[array_upper($5,1)]
 end
 end
 end
$$;
-- main function
-- recursively calculate the next state from the present state
create or replace function hanoi
 (discs integer, move out integer, a out int[], b out int[], c out int[])
 returns setof record
 language sql as
$$
with recursive han as (
 select 1::int as move, $1 as ndiscs, 
 '{99}'::int[] || array_agg(discs)as a, 
 '{99}'::int[] as b, '{99}'::int[] as c
 from generate_series($1,1,-1) as discs 
 union all
 select move + 1 , ndiscs, 
 hnext(move, ndiscs, a,b,c), 
 hnext(move, ndiscs, b,c,a), 
 hnext(move, ndiscs, c,a,b)
 from han
 where array_length(b,1) < ndiscs + 1
 )
select move, a[2:$1+1] as a, b[2:$1+1] as b, c[2:$1+1] as c 
from han 
order by move
$$;
-- see all the states, use a small number here
select * from hanoi(5);
-- count the states, can use larger numbers here
select count(*) from hanoi(16);
--Adunstan 14:20, 21 November 2009 (UTC)
TPC-H

The TPC-H Benchmark is a popular one for comparing database vendors. It's possible to run the TPC-H data set on PostgreSQL without having a formal testing kit, as demonstrated by the DBT-3 project's work to provide a full kit. Commercial database vendors are famously so focused on this benchmark they will "game" TPC-H runs--add optimizations specifically aimed at it--to make absolutely sure they do well.
PostgreSQL is still missing some features needed to seriously compete on this benchmark. The parallel query features added in PostgreSQL 9.6 and later helped pull down run times for several queries, see EDB's Parallel Query in PostgreSQL and TPC-H performance 8.3-13. 
Columnar storage with compression is a well known way to accelerate the TPC-H queries. As covered below, Greenplum's PostgreSQL fork claimed some improved results against PG 8.4. Crunchy claims large improvements over PG 16 with their commercial columnar Iceberg based extensions.
----
Early reference notes about the benchmark:
* TPC-H data generation and loading
* TPC-H Performance Study using an old version of PostgreSQL
* Discussion of limitations started by the above
* TPC-H fun with Greenplum (single node edition) - leads into the below and discusses what's needed to do well on TPC-H
* GP SNE versus Postgres 8.4.2 - 22 Query Benchmark Results (similar to TPC-H queries, tweaked to run better)
Category:Benchmarking
* PostgreSQL and Benchmarks TPC-H, TPC-E, and EAStress 2004 review (2008)
Trabajando con Eclipse

== Desarrollando con Eclipse ==
Esta página explica como comenzar rápidamente si usted desea utilizar Eclipse para desarrollar en PostgreSQL.
La versión original de esta página se ha creado basándose en Eclipse Ganymede v3.4.1 para Linux.
== Preparando el ambiente de trabajo ==
# Descargar Eclipse desde http://www.eclipse.org/downloads/ ('seleccionar el paquete Eclipse IDE for C/C++' Developers package)
# Instalar e iniciar Eclipse
# Vamos a asumir que ya ha instalado una versión local del sistema CVS como se describe en Trabajando con CVS
# En Eclipse, ir a Ventanas->Abrir Perspectiva->Repositorios CVS
# Hacer click en Agregar un Repositorio CVS
# Capturar la infomración del Servidor CVS (ver ejemplo abajo)
# Abrir el repositorio y seleccionar la versión que necesita ( vamos a asumir que utilizará HEAD para el resto de este ejemplo)
# Hacer click derecho en el directorio pgsql y seleccionar 'Obtener como'
# Seleccion Obtener con Asistente para Nuevo Proyecto y haga click en Finalizar 
# En el asistente, seleccione 'Nuevo proyecto C' y haga click en Siguiente
# Finalmente, establezca un nombre para su proyecto y seleccione 'Proyecto Makefile/Proyecto Vacío' con la cadena 'Linux GCC' y haga click en Finalizar
# El proyecto será obtenido entonces desde el servidoe CVS
# El proyecto no se compilará y mostrará un error
# Abra una ventana para el interprete de comandos (shell) y vaya al directorio del proyecto. Ejecute './configure --enable-depend --enable-cassert --enable-debug'
# Regrese a Eclipse, haga click derecho en el proyecto y selecione 'Actualizar'
# Seleccion 'Proyecto/Generar Proyecto' para invocar make, el resultado de la compilación se podrá ver en la consola
¡ Ahora se encuentra listo para utilizar Eclipse y contribuir a Postgres !
== Agregar objetivos para generar ==
# Abrir la vista de Generación (Make)
# Hacer click derecho en el proyecto y seleccionar 'Agregar un objetivo para generar'
# Capture el nombre del objetivo que desea invocar y haga click en Aceptar
# Hacer doble click en el objetivo lo invocará (el resultado de la generación se puede encontrar en la consola como es común)
== Depurando PostgreSQL desde Eclipse ==
# Asegúrese de que gdb esta instalado en su computadora
# Hacer click derecho en el proyecto en la ventana del Explorador de Proyectos y seleccione 'Depurar Como -> Aplicación C/C++'
# Seleccione 'postgres' como el binario para ejecutar
# Si no tiene establecido PGDATA en el ambiente en que Eclipse se está ejecutando, puede modificar los argumentos de la línea de comandos en Ejecutar/Configuraciones para que Postgres pueda iniciar adecuadamente
Tip: Puede hacer un 'make install' y hacer que sus argumentos apunten al directorio donde se encuentra la instalación.
Category:Español
Transactions recovering failures in scripts

You may need to have a portion of a script that could fail or not, but you want the script to recover and keep the transaction going. 
Failure at that point could be acceptable.
This could be the case of a DDL statement like creating a table that could exists or not. SAVEPOINT comes to rescue, but
you need to make it ROLLBACK TO SAVEPOINT when there is a failure and RELEASE when there is no failure.
== A Practical Example ==
BEGIN;
SELECT 1;
SAVEPOINT sp;
CREATE TABLE t1 (
 id bigint,
 s text);
RELEASE sp;
SAVEPOINT sp;
ROLLBACK TO SAVEPOINT sp;
RELEASE sp;
SELECT * FROM t1;
COMMIT;
Run the above code as many times you want and it works!
The trick is that in case of failure 
 RELEASE sp;
 SAVEPOINT sp;
from above snippet are simply ignored by the backend because the transaction is in ERROR state.
While when there is no failure the savepoint is released and the following is executed:
SAVEPOINT sp;
ROLLBACK TO SAVEPOINT sp;
RELEASE sp;
Which as you can easily see does nothing since the subtransaction is opened and closed and sp is released right after.
Further info on subtransactions can be found here: PostgreSQL Documentation
--Mcm 00:00, 20 June 2010 (UTC)
Category:SQL
Trigger-based Replication

== Trigger-based replication ==
Third-party replication tools that replicate based on SQL triggers running on the primary server(s).
=== Bucardo ===
bucardo.org
Bucardo is an asynchronous PostgreSQL replication system, allowing for both multi-master and multi-slave operations. It was developed at Backcountry.com by Jon Jensen and Greg Sabino Mullane of End Point Corporation, and is now in use at many other organizations. 
Bucardo is free and open source software released under the BSD license.
=== Londiste ===
github.com/pgq/skytools-legacy
PgQ is a queuing system written in PL/pgSQL, Python and C code. It is
based on snapshot-based event handling ideas from Slony-I, and is
written for general usage.
Londiste is a replication tool written in Python, using PgQ as event transport.
=== Mimeo ===
github.com/omniti-labs/mimeo
Mimeo is an extension that provides specialized, per-table replication between PostgreSQL instances. It currently provides snapshot (whole table copy), incremental (based on an incrementing timestamp or id), and DML (inserts, updates and deletes).
=== Slony ===
slony.info
Slony-I is a "master to multiple slaves" replication system for PostgreSQL supporting cascading (e.g. - a node can feed another node which feeds another node...) and failover.
The big picture for the development of Slony-I is that it is a master-slave replication system that includes all features and capabilities needed to replicate large databases to a reasonably limited number of slave systems.
Truncate text by byte

Several different ways to truncate a String/Text that is encoded in UTF-8 or other variable encoding method to specified byte width:
----
Method 1: author Laruenz Albe is an SQL implementation generating a record set containing all possible byte lengths to character length in a table then filters the result down 
CREATE OR REPLACE FUNCTION get_prefix (
 string text,
 max_bytes bigint
) RETURNS text
 LANGUAGE sql STRICT AS
$$SELECT p
FROM (SELECT p.p, octet_length(p.p) AS len
 FROM generate_series(0, length($1)) AS len
 CROSS JOIN LATERAL substr($1, 1, len.len) AS p) AS q
WHERE len <= $2
ORDER BY len DESC
LIMIT 1$$;
----
Method 2: Author Zsheep is an PLpg/SQL implementation, iterating over the string 1 character at a time moving left to right until the string byte width is approximately the input width 
Create or Replace function max_bytea_length(pchars text, bytea_length int)
RETURNS bytea
LANGUAGE plpgsql
COST 100
VOLATILE 
AS $BODY$
declare 
_i int;
_length_of_chars int;
_newchars text;
_testchars text;
begin
if octet_length(pchars::bytea) <= bytea_length then
 return pchars::bytea;
end if;
_i = least( octet_length(pchars)-4, bytea_length-4);
_length_of_chars = char_length(pchars);
loop 
 _newchars= left(pchars, _i);
 _testchars = left(pchars, _i+1); 
 if octet_length(_testchars::bytea) > bytea_length or _i = _length_of_chars then
 return _newchars::bytea;
 end if ;
 _i = _i+1;
end loop ;
end;
$BODY$
----
Method 3: Author Daniel Veritte is an SQL function that inspects the UTF-8 byte sequence looking for the high order bytea that is <= max byte width.
create function utf8_truncate(str text, len int) returns text
as $$
select case when octet_length(str) <= len then str
else (
 with bstr(s) as (select convert_to(str, 'UTF-8'))
 select
 case
 when len>=1 and (get_byte(s, len) & 192) <> 128
 then convert_from(substring(s, 1, len), 'UTF-8')
 else
 case
 when len>=2 and (get_byte(s, len-1) & 192) <> 128
 then convert_from(substring(s, 1, len-1), 'UTF-8')
 else
 case
 when len>=3 and (get_byte(s, len-2) & 192) <> 128
 then convert_from(substring(s, 1, len-2), 'UTF-8')
 else
 case
 when len>=4 and (get_byte(s, len-3) & 192) <> 128
 then convert_from(substring(s, 1, len-3), 'UTF-8')
 else ''
 end
 end
 end
 end
 from bstr)
 end;
$$ language sql strict immutable parallel safe; 
Examples of usage
SELECT get_prefix('abc€', 4);
select max_bytea_length('i ♥ u function changed it to be faster', 56);
select utf8_truncate('method 3 €', 9);
Category:PL/pgSQL
TurnKey PostgreSQL

TurnKey PostgreSQL is an easy to use, lightweight, installable live CD of PostgreSQL that can run on real hardware in addition to most types of virtual machines. It is designed to provide users with a pre-integrated, turn-key operating system environment that is carefully built from the ground up with the minimum components needed to run PostgreSQL with maximum usability, efficiency, and security.
TurnKey PostgreSQL is part of TurnKey Linux, a third-party opensource project that aims to develop high-quality software appliances that are easy to use, easy to deploy, and free. The project's motto is "everything that can be easy, should be easy!"
== Feature highlights ==
* SSL support out of the box
* PHPPgAdmin administration front-end for PostgreSQL
* auto-updated daily with the latest security patches
* easy to use configuration console and web management interface
* minimal footprint - includes only minimum components needed
* packaged as installable Live CD that runs on real machines and most types of virtual machines (e.g., VMWare, VirtualBox)
* based on Ubuntu 8.04.2 Hardy LTS
* PostGIS support
== See also ==
* TurnKey LAPP stack
* TurnKey PostgreSQL
* TurnKey Linux
== Screenshots ==
Image:Screenshot-boot.png|Live CD boot loader
Image:Screenshot-confconsole1.png|Configuration console
Image:Webmin-pgsql-fw.png|Web management interface - firewall
Image:Phppgadmin3.png|phpPgAdmin
Category:Install
Ulib array

ulib_array is a proposal for a "standard" user-defined library of SQL and PL/pgSQL array functions, defined here by snippets:
FUNCTION 	RETURNS
array_sort(anyarray) 	anyarray
array_distinct(anyarray) 	anyarray
array_intersect(anyarray) 	anyarray
...(anyarray) 	...
unnest_multidim(anyarray, integer)	SETOF anyarray
== See also ==
* ulib_agg
== External links ==
* postgres.cz/Array based functions
Unindexed foreign keys

== Unindexed Foreign Keys ==
I'm not sure of the original source of this query, but it might be from Michael Fuhr in the pgsql-performance mailing lists back in 2007.
It has been modified in several ways:
* Size of referencing and referenced tables added,
* Suggestion on index to add,
* Searches only for single-column or compound indexes where the leading column is the referencing key.
Tested in PostgreSQL 9.2 (might work with earlier versions).
CREATE OR REPLACE VIEW admin.unindexed_foreign_keys AS
WITH y AS (
 SELECT
 pg_catalog.format('%I.%I', n1.nspname, c1.relname) AS referencing_tbl,
 pg_catalog.quote_ident(a1.attname) AS referencing_column,
 t.conname AS existing_fk_on_referencing_tbl,
 pg_catalog.format('%I.%I', n2.nspname, c2.relname) AS referenced_tbl,
 pg_catalog.quote_ident(a2.attname) AS referenced_column,
 pg_relation_size( pg_catalog.format('%I.%I', n1.nspname, c1.relname) ) AS referencing_tbl_bytes,
 pg_relation_size( pg_catalog.format('%I.%I', n2.nspname, c2.relname) ) AS referenced_tbl_bytes,
 pg_catalog.format($$CREATE INDEX ON %I.%I(%I);$$, n1.nspname, c1.relname, a1.attname) AS suggestion
 FROM pg_catalog.pg_constraint t
 JOIN pg_catalog.pg_attribute a1 ON a1.attrelid = t.conrelid AND a1.attnum = t.conkey[1]
 JOIN pg_catalog.pg_class c1 ON c1.oid = t.conrelid
 JOIN pg_catalog.pg_namespace n1 ON n1.oid = c1.relnamespace
 JOIN pg_catalog.pg_class c2 ON c2.oid = t.confrelid
 JOIN pg_catalog.pg_namespace n2 ON n2.oid = c2.relnamespace
 JOIN pg_catalog.pg_attribute a2 ON a2.attrelid = t.confrelid AND a2.attnum = t.confkey[1]
 WHERE t.contype = 'f'
 AND NOT EXISTS (
 SELECT 1
 FROM pg_catalog.pg_index i
 WHERE i.indrelid = t.conrelid
 AND i.indkey[0] = t.conkey[1]
 )
)
SELECT referencing_tbl,
 referencing_column,
 existing_fk_on_referencing_tbl,
 referenced_tbl,
 referenced_column,
 pg_size_pretty(referencing_tbl_bytes) AS referencing_tbl_size,
 pg_size_pretty(referenced_tbl_bytes) AS referenced_tbl_size,
 suggestion
FROM y
ORDER BY
 referencing_tbl_bytes DESC,
 referenced_tbl_bytes DESC,
 referencing_tbl,
 referenced_tbl,
 referencing_column,
 referenced_column;
Unnest multidimensional array

Purpose: To emulate the unnest functionality for a multi-dimensional array.
Courtesy of Pavel Stehule, from 
NOTE: This will not work on an array of more than 2 dimensions. For an idea on how to handle multiple dimensions, take a look at Multidimensional Array Mapping
== Function ==
CREATE OR REPLACE FUNCTION public.reduce_dim(anyarray)
RETURNS SETOF anyarray AS
$function$
DECLARE
 s $1%type;
BEGIN
 FOREACH s SLICE 1 IN ARRAY $1 LOOP
 RETURN NEXT s;
 END LOOP;
 RETURN;
END;
$function$
LANGUAGE plpgsql IMMUTABLE;
 
select reduce_dim(array[array[1, 2], array[2, 3], array[4,5], array[9,10]]);
 reduce_dim
------------
 {1,2}
 {2,3}
 {4,5}
 {9,10}
Category:SQL
Update all extensions in all databases

It is possible that development cluster might contain a number of databases that are being carried over from one PostgreSQL version to another with pg_upgrade.
There might be a chance that some less frequently used databases will have older extension versions installed requiring updating those to make pg_upgrade possible.
Here are a couple of scripts for Windows and Linux that can help to update all extensions in all databases in a cluster to current versions.
 
== MS Windows ==
Copy and paste the following into a PowerShell script adjusting accordingly.
 
# $env:PGPORT=5430
# Maintenance database to connect to initially
$env:PGDATABASE='postgres'
$env:PGUSER='postgres'
ForEach ($db in & psql -tAc 'select datname from pg_database where datallowconn') {
 Write-Output "**** Working on $db ****"
 $sql = ((& psql -tAc 'select name from pg_available_extensions where default_version != installed_version' $db) -join " update;`nalter extension ")
 if ($sql) {
 $sql = "alter extension $sql update;"
 & psql -tAc "$sql" $db
 }
}
Usability reviews

Over the years, PostgreSQL and common software around it has accumulated its share of usability problems. While experienced users are used to these problems and often don't even notice that they are there, these issues frequently trip up newbies.
This article aims to collect various reviews and studies posted about PostgreSQL's usability, to make sure they don't simply get lost in mailing list archives.
* Usability write-up - looking at Pg, especially PgAdmin-III and Pg on Windows, from an inexperienced user PoV
** ... Longer blog article on this subject
* database schema quality survey & postgresql pitfalls
** ... Full paper, "On the Quality of Relational Database Schemas in Open-source Software" (local copy)
See also: Usability Challenges
Category:Todo