From 1efd7330cbdd50fc2c9b065e63db357b539a4d1d Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Wed, 29 Nov 2000 20:15:59 +0000
Subject: [PATCH] Rewrite system catalog documentation man page in DocBook with
 more recent information.

---
 doc/src/sgml/catalogs.sgml  | 2357 ++++++++++++++++++++++++++++-------
 doc/src/sgml/developer.sgml |    9 +-
 doc/src/sgml/extend.sgml    |    4 +-
 doc/src/sgml/sql.sgml       |    8 +-
 4 files changed, 1920 insertions(+), 458 deletions(-)

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 1613774f26b..a185d185495 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -1,445 +1,1912 @@
-.\" This is -*-nroff-*-
-.\" XXX standard disclaimer belongs here....
-.\" $Header: /cvsroot/pgsql/doc/src/sgml/catalogs.sgml,v 2.7 2000/07/17 03:04:40 tgl Exp $
-.TH "SYSTEM CATALOGS" INTRO 03/13/94 PostgreSQL PostgreSQL
-.SH "Section 7 - System Catalogs"
-.de LS
-.PP
-.if n .ta 5 +13 +13
-.if t .ta 0.5i +1.3i +1.3i
-.in 0
-.nf
-..
-.de LE
-.fi
-.in
-..
-.SH "DESCRIPTION"
-In this
-section we list each of the attributes of the system catalogs and
-define their meanings.
-.SH "CLASS/TYPE SYSTEM CATALOGS"
-These catalogs form the core of the extensibility system:
-.LS
-	\fBname\fP	\fBshared/local\fP	\fBdescription\fP
-	pg_aggregate	local	aggregate functions
-	pg_am	local	access methods
-	pg_amop	local	operators usable with specific access methods
-	pg_amproc	local	procedures used with specific access methods
-	pg_attribute	local	class attributes
-	pg_class	local	classes
-	pg_index	local	indices
-	pg_inherits	local	class inheritance hierarchy
-	pg_language	local	procedure implementation languages
-	pg_opclass	local	operator classes
-	pg_operator	local	query language operators
-	pg_proc	local	procedures (functions)
-	pg_type	local	data types
-.LE
-.SH "ENTITIES"
-These catalogs deal with identification of entities known throughout
-the site:
-.LS
-	\fBname\fP	\fBshared/local\fP	\fBdescription\fP
-	pg_database	shared	current databases
-	pg_group	shared	user groups
-	pg_shadow	shared	valid users
-.LE
-.SH "RULE SYSTEM CATALOGS"
-.LS
-	\fBname\fP	\fBshared/local\fP	\fBdescription\fP
-	pg_listener	local	processes waiting on alerters
-	pg_prs2plans	local	instance system procedures
-	pg_prs2rule	local	instance system rules
-	pg_prs2stub	local	instance system ``stubs''
-	pg_rewrite	local	rewrite system information
-.LE
-.SH "LARGE OBJECT CATALOGS"
-.PP
-These catalogs are specific to the Inversion file system and large
-objects in general:
-.LS
-	\fBname\fP	\fBshared/local\fP	\fBdescription\fP
-	pg_lobj	local	description of a large object
-	pg_naming	local	Inversion name space mapping
-	pg_platter	local	jukebox platter inventory
-	pg_plmap	local	jukebox platter extent map
-.LE
-.SH "INTERNAL CATALOGS"
-.PP
-These catalogs are internal classes that are not stored as normal
-heaps and cannot be accessed through normal means (attempting to do so
-causes an error).
-.LS
-	\fBname\fP	\fBshared/local\fP	\fBdescription\fP
-	pg_log	shared	transaction commit/rollback log
-	pg_magic	shared	magic constant
-	pg_time	shared	commit/rollback times
-	pg_variable	shared	special variable values
-.LE
-.PP
-There are several other classes defined with \*(lqpg_\*(rq names.
-Aside from those that end in \*(lqind\*(rq (secondary indices), these
-are all obsolete or otherwise deprecated.
-.SH "CLASS/TYPE SYSTEM CATALOGS"
-.PP
-The following catalogs relate to the class/type system.
-.nf M
-/*
- * aggregates
- *
- * see DEFINE AGGREGATE for an explanation of transition functions
- */
-pg_aggregate
-    NameData    aggname		/* aggregate name (e.g., "count") */
-    oid         aggowner	/* usesysid of creator */
-    regproc     aggtransfn	/* transition function */
-    regproc     aggfinalfn	/* final function */
-    oid         aggbasetype	/* type of data on which aggregate
-				   operates */
-    oid         aggtranstype	/* type of aggregate's transition
-				   (state) data */
-    oid         aggfinaltype	/* type of aggregate's final result */
-    text        agginitval	/* external format of initial state value */
-.fi
-.nf M
-pg_am
-    NameData    amname          /* access method name */
-    oid         amowner         /* usesysid of creator */
-    int2        amstrategies    /* total NUMBER of strategies by which
-                                   we can traverse/search this AM */
-    int2        amsupport       /* total NUMBER of support functions
-                                   that this AM uses */
-    int2        amorderstrategy /* if this AM has a sort order, the
-                                 * strategy number of the sort operator.
-                                 * Zero if AM is not ordered.
-                                 */
-    regproc     amgettuple      /* "next valid tuple" function */
-    regproc     aminsert        /* "insert this tuple" function */
-    regproc     amdelete        /* "delete this tuple" function */
-    regproc     amgetattr       /* - deprecated */
-    regproc     amsetlock       /* - deprecated */
-    regproc     amsettid        /* - deprecated */
-    regproc     amfreetuple     /* - deprecated */
-    regproc     ambeginscan     /* "start new scan" function */
-    regproc     amrescan        /* "restart this scan" function */
-    regproc     amendscan       /* "end this scan" function */
-    regproc     ammarkpos       /* "mark current scan position"
-                                   function */
-    regproc     amrestrpos      /* "restore marked scan position"
-                                   function */
-    regproc     amopen          /* - deprecated */
-    regproc     amclose         /* - deprecated */
-    regproc     ambuild         /* "build new index" function */
-    regproc     amcreate        /* - deprecated */
-    regproc     amdestroy       /* - deprecated */
-    regproc     amcostestimate  /* estimate cost of an indexscan */
-
-.fi
-.nf M
-pg_amop
-    oid         amopid		/* access method with which this 
-				   operator be used */
-    oid         amopclaid	/* operator class with which this
-				   operator can be used */
-    oid         amopopr	/* the operator */
-    int2        amopstrategy	/* traversal/search strategy number
-				   to which this operator applies */
-.fi
-.nf M
-pg_amproc
-    oid         amid		/* access method with which this
-				   procedure is associated */
-    oid         amopclaid	/* operator class with which this
-				   operator can be used */
-    oid         amproc		/* the procedure */
-    int2        amprocnum	/* support function number to which
-				   this operator applies */
-.fi
-.nf M
-pg_class
-     NameData     relname	/* class name */
-     oid        relowner	/* usesysid of owner */
-     oid        relam	/* access method */
-     int4       relpages	/* # of 8KB pages */
-     int4       reltuples	/* # of instances */
-     abstime    relexpires	/* time after which instances are
-				   deleted from non-archival storage */
-     reltime    relpreserved	/* timespan after which instances are
-				   deleted from non-archival storage */
-     bool       relhasindex	/* does the class have a secondary
-				   index? */
-     bool       relisshared	/* is the class shared or local? */
-     char       relkind		/* type of relation:
-				   i=index
-				   r=relation (heap)
-				   s=special
-				   u=uncatalogued (temporary) */
-     char       relarch	/* archive mode:
-			   h=heavy
-			   l=light
-			   n=none */
-     int2       relnatts	/* current # of non-system
-				   attributes */
-     int2       relsmgr	/* storage manager:
-			   0=magnetic disk
-			   1=sony WORM jukebox
-			   2=main memory */
-     int2vector relkey		/* - unused */
-     oidvector  relkeyop	/* - unused */
-     bool       relhassubclass	/* does the class have a subclass?
-				    */
-     aclitem    relacl[1]	/* access control lists */
-.fi
-.nf M
-pg_attribute
-    oid         attrelid	/* class containing this attribute */
-    NameData      attname	/* attribute name */
-    oid         atttypid	/* attribute type */
-    oid         attdefrel	/* - deprecated */
-    int4        attnvals	/* - deprecated */
-    oid         atttyparg	/* - deprecated */
-    int2        attlen	/* attribute length, in bytes
-			   -1=variable */
-    int2        attnum	/* attribute number
-			   >0=user attribute
-			   <0=system attribute */
-    int2        attbound	/* - deprecated */
-    bool        attbyval	/* type passed by value? */
-    bool        attcanindex	/* - deprecated */
-    oid         attproc	/* - deprecated */
-    int4        attnelems	/* # of array dimensions */
-    int4        attcacheoff	/* cached offset into tuple */
-    bool        attisset	/* is attribute set-valued? */
-.fi
-.nf M
-pg_inherits
-    oid         inhrel	/* child class */
-    oid         inhparent	/* parent class */
-    int4        inhseqno	/* - deprecated */
-.fi
-.nf M
-    oid         indexrelid	/* oid of secondary index class */
-    oid         indrelid	/* oid of indexed heap class */
-    oid         indproc	/* function to compute index key from
-				   attribute(s) in heap
-				   0=not a functional index */
-    int2vector  indkey	/* attribute numbers of key 
-			   attribute(s) */
-    oidvector   indclass	/* opclass of each key */
-    bool        indisclustered	/* is the index clustered?
-				   - unused */
-    bool        indisarchived	/* is the index archival?
-				   - unused */
-    text        indpred	/* query plan for partial index 
-			   predicate */
-.fi
-.nf M
-pg_type
-    NameData      typname	/* type name */
-    oid         typowner	/* usesysid of owner */
-    int2        typlen	/* length in internal form
-			   -1=variable-length */
-    int2        typprtlen	/* length in external form */
-    bool        typbyval	/* type passed by value? */
-    char        typtype	/* kind of type:
-			   c=catalog (composite)
-			   b=base */
-    bool        typisdefined	/* defined or still a shell? */
-    char        typdelim	/* delimiter for array external form */
-    oid         typrelid	/* class (if composite) */
-    oid         typelem	/* type of each array element */
-    regproc     typinput	/* external-internal conversion
-				   function */ 
-    regproc     typoutput	/* internal-external conversion
-				   function */
-    regproc     typreceive	/* client-server conversion function */
-    regproc     typsend	/* server-client conversion function */
-    text        typdefault	/* default value */
-.fi
-.nf M
-pg_operator
-    NameData      oprname	/* operator name */
-    oid         oprowner	/* usesysid of owner */
-    int2        oprprec	/* - deprecated */
-    char        oprkind	/* kind of operator:
-			   b=binary
-			   l=left unary
-			   r=right unary */
-    bool        oprisleft	/* is operator left/right associative? */
-    bool        oprcanhash	/* is operator usable for hashjoin? */
-    oid         oprleft	/* left operand type */
-    oid         oprright	/* right operand type */
-    oid         oprresult	/* result type */
-    oid         oprcom	/* commutator operator */
-    oid         oprnegate	/* negator operator */
-    oid         oprlsortop	/* sort operator for left operand */
-    oid         oprrsortop	/* sort operator for right operand */
-    regproc     oprcode	/* function implementing this operator */
-    regproc     oprrest	/* function to calculate operator
-			   restriction selectivity */
-    regproc     oprjoin	/* function to calculate operator 
-			   join selectivity */
-.fi
-.nf M
-pg_opclass
-    NameData      opcname	/* operator class name */
-.fi
-.nf M
-pg_proc
-    NameData      proname	/* function name */
-    oid         proowner	/* usesysid of owner */
-    oid         prolang	/* function implementation language */
-    bool        proisinh	/* - deprecated */
-    bool        proistrusted	/* run in server or untrusted function
-				   process? */
-    bool        proiscachable	/* can the function return values be
-				   cached? */
-    int2        pronargs	/* # of arguments */
-    bool        proretset	/* does the function return a set?
-				   - unused */
-    oid         prorettype	/* return type */
-    oidvector   proargtypes	/* argument types */
-    int4        probyte_pct	/* % of argument size (in bytes) that
-				   needs to be examined in order to
-				   compute the function */ 
-    int4        properbyte_cpu	/* sensitivity of the function's
-				   running time to the size of its
-				   inputs */
-    int4        propercall_cpu	/* overhead of the function's
-				   invocation (regardless of input
-				   size) */
-    int4        prooutin_ratio	/* size of the function's output as a
-				   percentage of the size of the input */
-    text        prosrc	/* function definition:
-			   INTERNAL function: actual C name of function
-			   C function: currently, this field is unused
-			   SQL function: text of query(s)
-			   PL function: text in procedural language */
-    bytea       probin	/* path to object file (C functions only) */
-.fi
-.nf M
-pg_language
-    NameData      lanname	/* language name */
-    text        lancompiler	/* - deprecated */
-.fi
-.SH "ENTITIES"
-.nf M
-pg_database
-    NameData      datname		/* database name */
-    oid         datdba		/* usesysid of database administrator */
-    text        datpath		/* directory of database under
-				   $PGDATA */ 
-.fi
-.nf M
-pg_group
-    NameData      groname	/* group name */
-    int2        grosysid	/* group's UNIX group id */
-    int2        grolist[1]	/* list of usesysids of group members */
-.fi
-.nf M
-pg_shadow
-    NameData      usename		/* user's name */
-    int2        usesysid	/* user's UNIX user id */
-    bool        usecreatedb	/* can user create databases? */
-    bool        usetrace	/* can user set trace flags? */
-    bool        usesuper	/* can user be POSTGRES superuser? */
-    bool        usecatupd	/* can user update catalogs? */
-.fi
-.SH "RULE SYSTEM CATALOGS"
-.nf M
-pg_listener
-    NameData      relname	/* class for which asynchronous 
-			   notification is desired */
-    int4        listenerpid	/* process id of server corresponding
-				   to a frontend program waiting for
-				   asynchronous notification */
-    int4        notification	/* whether an event notification for
-				   this process id still pending */
-
-.fi
-.nf M
-pg_prs2rule
-    NameData      prs2name	/* rule name */
-    char        prs2eventtype	/* rule event type:
-				   R=retrieve
-				   U=update (replace)
-				   A=append
-				   D=delete */
-    oid         prs2eventrel	/* class to which event applies */
-    int2        prs2eventattr	/* attribute to which event applies */
-    float8      necessary	/* - deprecated */
-    float8      sufficient	/* - deprecated */
-    text        prs2text	/* text of original rule definition */
-.fi
-.nf M
-pg_prs2plans
-    oid         prs2ruleid	/* prs2rule instance for which this
-				   plan is used */
-    int2        prs2planno	/* plan number (one rule may invoke
-				   multiple plans) */
-    text        prs2code	/* external representation of the plan */
-.fi
-.nf M
-pg_prs2stub
-    oid         prs2relid	/* class to which this rule applies */
-    bool        prs2islast	/* is this the last stub fragment? */
-    int4        prs2no		/* stub fragment number */
-    stub        prs2stub	/* stub fragment */
-.fi
-.nf M
-pg_rewrite
-    NameData      rulename	/* rule name */
-    char        ev_type	/* event type:
-			   RETRIEVE, REPLACE, APPEND, DELETE
-			   codes are parser-dependent (!?) */
-    oid         ev_class	/* class to which this rule applies */
-    int2        ev_attr	/* attribute to which this rule applies */
-    bool        is_instead	/* is this an "instead" rule? */
-    text        ev_qual	/* qualification with which to modify
-			   (rewrite) the plan that triggered this
-			   rule */
-    text        action	/* parse tree of action */
-.fi
-.SH "LARGE OBJECT CATALOGS"
-.nf M
-pg_lobj
-    oid         ourid		/* 'ourid' from pg_naming that
-				   identifies this object in the
-				   Inversion file system namespace */
-    int4        objtype		/* storage type code:
-				   0=Inversion
-				   1=Unix
-				   2=External
-				   3=Jaquith */
-    bytea       object_descripto/* opaque object-handle structure */
-.fi
-.nf M
-pg_naming
-    NameData      filename	/* filename component */
-    oid         ourid		/* random oid used to identify this
-				   instance in other instances (can't
-				   use the actual oid for obscure
-				   reasons */
-    oid         parentid	/* pg_naming instance of parent
-				   Inversion file system directory */
-.fi
-.nf M
-pg_platter
-     NameData     plname		/* platter name */
-     int4       plstart		/* the highest OCCUPIED extent */
-.fi
-.nf M
-pg_plmap
-     oid        plid		/* platter (in pg_platter) on which
-				   this extent (of blocks) resides */
-     oid        pldbid		/* database of the class to which this
-				   extent (of blocks) belongs */
-     oid        plrelid		/* class to which this extend (of
-				   blocks) belongs */
-     int4       plblkno		/* starting block number within the
-				   class */ 
-     int4       ploffset	/* offset within the platter at which
-				   this extent begins */
-     int4       plextentsz	/* length of this extent */
-.fi
+<!--
+ Documentation of the system catalogs, directed toward PostgreSQL developers
+ $Header: /cvsroot/pgsql/doc/src/sgml/catalogs.sgml,v 2.8 2000/11/29 20:15:58 petere Exp $
+ -->
+
+<chapter id="catalogs">
+ <title>System Catalogs</title>
+
+ <section id="catalogs-overview">
+  <title>Overview</title>
+
+  <para>
+   The system catalogs are the place where a relational database
+   management system stores schema metadata, such as information about
+   tables and columns, and internal bookkeeping information.
+   <productname>PostgreSQL</productname>'s system catalogs are regular
+   tables.  You can drop and recreate the tables, add columns, insert
+   and update values, and severely mess up your system that way.
+   Normally one never has to change the system catalogs by hand, there
+   are always SQL commands to do that.  (For example, <command>CREATE
+   DATABASE</command> inserts a row into the
+   <structname>pg_database</structname> catalog -- and actually
+   creates the database on disk.)  There are some exceptions for
+   esoteric operations, such as adding index access methods.
+  </para>
+
+  <table>
+   <title>System Catalogs</title>
+
+   <tgroup cols="2">
+    <thead>
+     <row>
+      <entry>Catalog Name</entry>
+      <entry>Purpose</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>pg_aggregate</entry>
+      <entry>aggregate functions</entry>
+     </row>
+
+     <row>
+      <entry>pg_am</entry>
+      <entry>index access methods</entry>
+     </row>
+
+     <row>
+      <entry>pg_amop</entry>
+      <entry>access method operators</entry>
+     </row>
+
+     <row>
+      <entry>pg_amproc</entry>
+      <entry>access method support procedures</entry>
+     </row>
+
+     <row>
+      <entry>pg_attrdef</entry>
+      <entry>column default values</entry>
+     </row>
+
+     <row>
+      <entry>pg_attribute</entry>
+      <entry>table columns (attributes, fields)</entry>
+     </row>
+
+     <row>
+      <entry>pg_class</entry>
+      <entry>tables, indexes, sequences (<quote>relations</quote>)</entry>
+     </row>
+
+     <row>
+      <entry>pg_database</entry>
+      <entry>databases</entry>
+     </row>
+
+     <row>
+      <entry>pg_description</entry>
+      <entry>descriptions or comments on database objects</entry>
+     </row>
+
+     <row>
+      <entry>pg_group</entry>
+      <entry>user groups</entry>
+     </row>
+
+     <row>
+      <entry>pg_index</entry>
+      <entry>additional index information</entry>
+     </row>
+
+     <row>
+      <entry>pg_inheritproc</entry>
+      <entry>(not used)</entry>
+     </row>
+
+     <row>
+      <entry>pg_inherits</entry>
+      <entry>table inheritance hierarchy</entry>
+     </row>
+
+     <row>
+      <entry>pg_ipl</entry>
+      <entry>(not used)</entry>
+     </row>
+
+     <row>
+      <entry>pg_language</entry>
+      <entry>languages for writing functions</entry>
+     </row>
+
+     <row>
+      <entry>pg_largeobject</entry>
+      <entry>large objects</entry>
+     </row>
+
+     <row>
+      <entry>pg_listener</entry>
+      <entry>asynchronous notification</entry>
+     </row>
+
+     <row>
+      <entry>pg_opclass</entry>
+      <entry>index access method operator classes</entry>
+     </row>
+
+     <row>
+      <entry>pg_operator</entry>
+      <entry>operators</entry>
+     </row>
+
+     <row>
+      <entry>pg_proc</entry>
+      <entry>functions and procedures</entry>
+     </row>
+
+     <row>
+      <entry>pg_relcheck</entry>
+      <entry>check constraints</entry>
+     </row>
+
+     <row>
+      <entry>pg_rewrite</entry>
+      <entry>query rewriter rules</entry>
+     </row>
+
+     <row>
+      <entry>pg_shadow</entry>
+      <entry>database users</entry>
+     </row>
+
+     <row>
+      <entry>pg_statistic</entry>
+      <entry>optimizer statistics</entry>
+     </row>
+
+     <row>
+      <entry>pg_trigger</entry>
+      <entry>triggers</entry>
+     </row>
+
+     <row>
+      <entry>pg_type</entry>
+      <entry>data types</entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+  <para>
+   More detailed documentation of most catalogs follow below.  The
+   catalogs that relate to index access methods are explained in the
+   <citetitle>Programmer's Guide</citetitle>.  Some catalogs don't
+   have any documentation, yet.
+  </para>
+
+ </section>
+
+
+ <section id="catalog-pg-aggregate">
+  <title>pg_aggregate</title>
+
+  <para>
+   <structname>pg_aggregate</structname> stores information about
+   aggregate functions.  An aggregate function is a function that
+   operates on a set of values (typically one column from each the row
+   that matches a query condition) and returns a single value computed
+   from all these values.  Typical aggregate functions are
+   <function>sum</function>, <function>count</function>, and
+   <function>max</function>.
+  </para>
+
+  <table>
+   <title>pg_aggregate Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+    <tbody>
+     <row>
+      <entry>aggname</entry>
+      <entry><type>name</type></entry>
+      <entry></entry>
+      <entry>Name of the aggregate function</entry>
+     </row>
+     <row>
+      <entry>aggowner</entry>
+      <entry><type>int4</type></entry>
+      <entry>pg_shadow.usesysid</entry>
+      <entry>Owner (creator) of the aggregate function</entry>
+     </row>
+     <row>
+      <entry>aggtransfn</entry>
+      <entry><type>regproc</type> (function)</entry>
+      <entry></entry>
+      <entry>Transition function</entry>
+     </row>
+     <row>
+      <entry>aggfinalfn</entry>
+      <entry><type>regproc</type> (function)</entry>
+      <entry></entry>
+      <entry>Final function</entry>
+     </row>
+     <row>
+      <entry>aggbasetype</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_type.oid</entry>
+      <entry>The type on which this function operates when invoked from SQL</entry>
+     </row>
+     <row>
+      <entry>aggtranstype</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_type.oid</entry>
+      <entry>The type of the aggregate function's internal transition (state) data</entry>
+     </row>
+     <row>
+      <entry>aggfinaltype</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_type.oid</entry>
+      <entry>The type of the result</entry>
+     </row>
+     <row>
+      <entry>agginitval</entry>
+      <entry><type>text</type></entry>
+      <entry></entry>
+      <entry>
+       The initial value of the transition state.  This is a text
+       field which will be cast to the type of aggtranstype.
+      </entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+  <para>
+   New aggregate functions are registered with the <command>CREATE
+   AGGREGATE</command> command.  See the <citetitle>Programmer's
+   Guide</citetitle> for more information about writing aggregate
+   functions and the meaning of the transition functions, etc.
+  </para>
+
+  <para>
+   An aggregate function is identified through name
+   <emphasis>and</emphasis> argument type.  Hence aggname and aggname
+   are the composite primary key.
+  </para>
+
+ </section>
+
+
+ <section id="catalog-pg-attrdef">
+  <title>pg_attrdef</title>
+
+  <para>
+   This catalog stores column default values.  The main information
+   about columns is stored in <structname>pg_attribute</structname>
+   (see below).  Only columns that explicitly specify a default value
+   (when the table is created or the column is added) will have an
+   entry here.
+  </para>
+
+  <table>
+   <title>pg_attrdef Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>adrelid</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_class.oid</entry>
+      <entry>The table this column belongs to</entry>
+     </row>
+
+     <row>
+      <entry>adnum</entry>
+      <entry><type>int2</type></entry>
+      <entry></entry>
+      <entry>
+       The number of the column; see
+       <structname>pg_attribute</structname>.<structfield>pg_attnum</structfield>
+      </entry>
+     </row>
+
+     <row>
+      <entry>adbin</entry>
+      <entry><type>text</type></entry>
+      <entry></entry>
+      <entry>An internal representation of the column default value</entry>
+     </row>
+
+     <row>
+      <entry>adsrc</entry>
+      <entry><type>text</type></entry>
+      <entry></entry>
+      <entry>A human-readable representation of the default value</entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+ </section>
+
+
+ <section id="catalog-pg-attribute">
+  <title>pg_attribute</title>
+
+  <para>
+   <structname>pg_attribute</structname> stores information about
+   table columns.  There will be exactly one
+   <structname>pg_attribute</structname> row for every column in every
+   table in the database.  (There will also be attribute entries for
+   indexes and other objects.  See <structname>pg_class</structname>.)
+  </para>
+
+  <para>
+   The term attribute is equivalent to column and is used for
+   historical reasons.
+  </para>
+
+  <table>
+   <title>pg_attribute Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>attrelid</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_class.oid</entry>
+      <entry>The table this column belongs to</entry>
+     </row>
+
+     <row>
+      <entry>attname</entry>
+      <entry><type>name</type></entry>
+      <entry></entry>
+      <entry>Column name</entry>
+     </row>
+
+     <row>
+      <entry>atttypid</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_type.oid</entry>
+      <entry>The data type of this column</entry>
+     </row>
+
+     <row>
+      <entry>attdispersion</entry>
+      <entry><type>float4</type></entry>
+      <entry></entry>
+      <entry>
+       <structfield>attdispersion</structfield> is the dispersion
+       statistic of the column (0.0 to 1.0), or zero if the statistic
+       has not been calculated, or -1.0 if <command>VACUUM</command>
+       found that the column contains no duplicate entries (in which
+       case the dispersion should be taken as
+       1.0/<symbol>numberOfRows</symbol> for the current table size).
+       The -1.0 hack is useful because the number of rows may be
+       updated more often than
+       <structfield>attdispersion</structfield> is. We assume that the
+       column will retain its no-duplicate-entry property.
+      </entry>
+     </row>
+
+     <row>
+      <entry>attlen</entry>
+      <entry><type>int2</type></entry>
+      <entry></entry>
+      <entry>
+       This is a copy of the
+       <structname>pg_type</structname>.<structfield>typlen</structfield>
+       for this column's type.
+      </entry>
+     </row>
+
+     <row>
+      <entry>attnum</entry>
+      <entry><type>int2</type></entry>
+      <entry></entry>
+      <entry>
+       The number of the column.  Ordinary columns are numbered from 1
+       up.  System columns, such as <structfield>oid</structfield>,
+       have (arbitrary) negative numbers.
+      </entry>
+     </row>
+
+     <row>
+      <entry>attnelems</entry>
+      <entry><type>int4</type></entry>
+      <entry></entry>
+      <entry>Number of dimensions, if the column is an array</entry>
+     </row>
+
+     <row>
+      <entry>attcacheoff</entry>
+      <entry><type>int4</type></entry>
+      <entry></entry>
+      <entry>
+       Always -1 in storage, but when loaded into a tuple descriptor
+       in memory this may be updated cache the offset of the attribute
+       within the tuple.
+      </entry>
+     </row>
+
+     <row>
+      <entry>atttypmod</entry>
+      <entry><type>int4</type></entry>
+      <entry></entry>
+      <entry>
+       <structfield>atttypmod</structfield> records type-specific data
+       supplied at table creation time (for example, the maximum
+       length of a <type>varchar</type> column).  It is passed to
+       type-specific input and output functions as the third
+       argument. The value will generally be -1 for types that do not
+       need typmod.
+      </entry>
+     </row>
+
+     <row>
+      <entry>attbyval</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>
+       A copy of
+       <structname>pg_type</structname>.<structfield>typbyval</structfield>
+       of this column's type
+      </entry>
+     </row>
+
+     <row>
+      <entry>attstorage</entry>
+      <entry><type>char</type></entry>
+      <entry></entry>
+      <entry>
+       A copy of
+       <structname>pg_type</structname>.<structfield>typstorage</structfield>
+       of this column's type
+      </entry>
+     </row>
+
+     <row>
+      <entry>attisset</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>
+       If true, this attribute is a set.  In that case, what is really
+       stored in the attribute is the OID of a tuple in the
+       <structname>pg_proc</structname> catalog.  The
+       <structname>pg_proc</structname> tuple contains the query
+       string which defines this set - i.e., the query to run to get
+       the set.  So the <structfield>atttypid</structfield> (see
+       above) refers to the type returned by this query, but the
+       actual length of this attribute is the length (size) of an
+       <type>oid</type>.  --- At least this is the theory.  All this
+       is probably quite broken these days.
+      </entry>
+     </row>
+
+     <row>
+      <entry>attalign</entry>
+      <entry><type>char</type></entry>
+      <entry></entry>
+      <entry>
+       A copy of
+       <structname>pg_type</structname>.<structfield>typalign</structfield>
+       of this column's type
+      </entry>
+     </row>
+
+     <row>
+      <entry>attnotnull</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>
+       This represents a NOT NULL constraint.  It is possible to
+       change this field to enable or disable the constraint.
+      </entry>
+     </row>
+
+     <row>
+      <entry>atthasdef</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>
+       This column has a default value, in which case there will be a
+       corresponding entry in the <structname>pg_attrdef</structname>
+       catalog that actually defines the value.
+      </entry>
+     </row>
+
+    </tbody>
+   </tgroup>
+  </table>
+ </section>
+
+
+ <section id="catalog-pg-class">
+  <title>pg_class</title>
+
+  <para>
+   <structname>pg_class</structname> catalogues tables and mostly
+   everything else that has columns or is otherwise similar to a
+   table.  This includes indexes (but see
+   <structname>pg_index</structname>), sequences, views, and some
+   kinds of special relation kinds.  Below, when we mean all of these
+   kinds of objects we speak of <quote>relations</quote>.  Not all
+   fields are meaningful for all relation types.
+  </para>
+
+  <table>
+   <title>pg_class Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>relname</entry>
+      <entry><type>name</type></entry>
+      <entry></entry>
+      <entry>Name of the table, index, view, etc.</entry>
+     </row>
+
+     <row>
+      <entry>reltype</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_type.oid</entry>
+      <entry>
+       The data type that corresponds to this table (not functional,
+       only set for system tables)
+      </entry>
+     </row>
+
+     <row>
+      <entry>relowner</entry>
+      <entry><type>int4</type></entry>
+      <entry>pg_shadow.usesysid</entry>
+      <entry>Owner of the relation</entry>
+     </row>
+
+     <row>
+      <entry>relam</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_am.oid</entry>
+      <entry>If this is an index, the access method used (btree, hash, etc.)</entry>
+     </row>
+
+     <row>
+      <entry>relfilenode</entry>
+      <entry><type>oid</type></entry>
+      <entry></entry>
+      <entry>Name of the on-disk file of this relation</entry>
+     </row>
+
+     <row>
+      <entry>relpages</entry>
+      <entry><type>int4</type></entry>
+      <entry></entry>
+      <entry>
+       Size of the on-disk representation of this table in pages (size
+       <symbol>BLCKSZ</symbol>).  This is only an approximate value
+       which is calculated during vacuum.
+      </entry>
+     </row>
+
+     <row>
+      <entry>reltuples</entry>
+      <entry><type>int4</type></entry>
+      <entry></entry>
+      <entry>
+       Number of tuples in the table.  This is only an estimate used
+       by the planner, updated by <command>VACUUM</command>.
+      </entry>
+     </row>
+
+     <row>
+      <entry>reltoastrelid</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_class.oid</entry>
+      <entry>
+       Oid of the TOAST table associated with this table, 0 if none.
+       The TOAST table stores large attributes <quote>out of
+       line</quote> in a secondary table.
+      </entry>
+     </row>
+
+     <row>
+      <entry>reltoastidxid</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_class.oid</entry>
+      <entry>Oid of the index on the TOAST table for this table, 0 if none</entry>
+     </row>
+
+     <row>
+      <entry>relhasindex</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>True if this is a table and it has at least one index</entry>
+     </row>
+
+     <row>
+      <entry>relisshared</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>XXX (This is not what it seems to be.)</entry>
+     </row>
+
+     <row>
+      <entry>relkind</entry>
+      <entry><type>char</type></entry>
+      <entry></entry>
+      <entry>
+       'r' = ordinary table, 'i' = index, 'S' = sequence, 'v' = view,
+       's' = special, 't' = secondary TOAST table
+      </entry>
+     </row>
+
+     <row>
+      <entry>relnatts</entry>
+      <entry><type>int2</type></entry>
+      <entry></entry>
+      <entry>
+       Number of columns in the relation, besides system columns.
+       There must be this many corresponding entries in
+       <structname>pg_attribute</structname>.  See also
+       <structname>pg_attribute</structname>.<structfield>attnum</structfield>.
+      </entry>
+     </row>
+
+     <row>
+      <entry>relchecks</entry>
+      <entry><type>int2</type></entry>
+      <entry></entry>
+      <entry>
+       Number of check constraints on the table; see
+       <structname>pg_relcheck</structname> catalog
+      </entry>
+     </row>
+
+     <row>
+      <entry>reltriggers</entry>
+      <entry><type>int2</type></entry>
+      <entry></entry>
+      <entry>
+       Number of triggers on the table; see
+       <structname>pg_trigger</structname> catalog
+      </entry>
+     </row>
+
+     <row>
+      <entry>relukeys</entry>
+      <entry><type>int2</type></entry>
+      <entry></entry>
+      <entry>unused  (<emphasis>Not</emphasis> the number of unique keys or something.)</entry>
+     </row>
+
+     <row>
+      <entry>relfkeys</entry>
+      <entry><type>int2</type></entry>
+      <entry></entry>
+      <entry>Number foreign keys on the table</entry>
+     </row>
+
+     <row>
+      <entry>relhaspkey</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>
+       unused  (No, this does not say whether the table has a primary
+       key.  It's really unused.)
+      </entry>
+     </row>
+
+     <row>
+      <entry>relhasrules</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>Table has rules</entry>
+     </row>
+
+     <row>
+      <entry>relhassubclass</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>At least one table inherits this one</entry>
+     </row>
+
+     <row>
+      <entry>relacl</entry>
+      <entry><type>aclitem[]</type></entry>
+      <entry></entry>
+      <entry>
+       Access permissions.  See the descriptions of
+       <command>GRANT</command> and <command>REVOKE</command> for
+       details.
+      </entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+ </section>
+
+
+ <section id="catalog-pg-database">
+  <title>pg_database</title>
+
+  <para>
+   The <structname>pg_database</structname> catalog stores information
+   about the available databases.  The
+   <structname>pg_database</structname> table is shared between all
+   databases of a cluster.  Databases are created with the
+   <command>CREATE DATABASE</command>.  Consult the
+   <citetitle>Administrator's Guide</citetitle> for details about the
+   meaning of some of the parameters.
+  </para>
+
+  <table>
+   <title>pg_database Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>datname</entry>
+      <entry><type>name</type></entry>
+      <entry></entry>
+      <entry>Database name</entry>
+     </row>
+
+     <row>
+      <entry>datdba</entry>
+      <entry><type>int4</type></entry>
+      <entry>pg_shadow.usesysid</entry>
+      <entry>Owner of the database, initially who created it</entry>
+     </row>
+
+     <row>
+      <entry>encoding</entry>
+      <entry><type>int4</type></entry>
+      <entry></entry>
+      <entry>Character/multibyte encoding for this database</entry>
+     </row>
+
+     <row>
+      <entry>datistemplate</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>
+       If true then this database can be used in the
+       <quote>TEMPLATE</quote> clause of <command>CREATE
+       DATABASE</command> to create the new database as a clone of
+       this one.
+      </entry>
+     </row>
+
+     <row>
+      <entry>datallowconn</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>
+       If false then no one can connect to this database.  This is
+       used to protect the template0 database from being altered.
+      </entry>
+     </row>
+
+     <row>
+      <entry>datlastsysoid</entry>
+      <entry><type>oid</type></entry>
+      <entry></entry>
+      <entry>
+       Last oid in existence after the database was created; useful
+       particularly to <application>pg_dump</application>
+      </entry>
+     </row>
+
+     <row>
+      <entry>datpath</entry>
+      <entry><type>text</type></entry>
+      <entry></entry>
+      <entry>
+       If the database is stored at an alternative location then this
+       records the location.  It's either an environment variable name
+       or an absolute path, depending how it was entered.
+      </entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+ </section>
+
+
+ <section id="catalog-pg-description">
+  <title>pg_description</title>
+
+  <para>
+   The pg_description table can store an optional description or
+   comment for each database object.  Descriptions can be manipulated
+   with the <command>COMMENT</command> command.  Client applications
+   can view the descriptions by joining with this table.  Many builtin
+   system objects have comments associated with them that are shown by
+   <application>psql</application>'s <literal>\d</literal> commands.
+  </para>
+
+  <table>
+   <title>pg_description Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>objoid</entry>
+      <entry><type>oid</type></entry>
+      <entry>any oid attribute</entry>
+      <entry>The oid of the object this description pertains to</entry>
+     </row>
+
+     <row>
+      <entry>description</entry>
+      <entry><type>text</type></entry>
+      <entry></entry>
+      <entry>Arbitrary text that serves as the description of this object.</entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+ </section>
+
+
+ <section id="catalog-pg-group">
+  <title>pg_group</title>
+
+  <para>
+   This catalog defines groups and stores what users belong to what
+   groups.  Groups are created with the <command>CREATE
+   GROUP</command> command.  Consult the <citetitle>Administrator's
+   Guide</citetitle> for information about user permission management.
+  </para>
+
+  <table>
+   <title>pg_group Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>groname</entry>
+      <entry><type>name</type></entry>
+      <entry></entry>
+      <entry>Name of the group</entry>
+     </row>
+
+     <row>
+      <entry>grosysid</entry>
+      <entry><type>int4</type></entry>
+      <entry></entry>
+      <entry>An arbitrary number to identify this group</entry>
+     </row>
+
+     <row>
+      <entry>grolist</entry>
+      <entry><type>int4[]</type></entry>
+      <entry>pg_shadow.usesysid</entry>
+      <entry>An array containing the ids of the users in this group</entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+ </section>
+
+
+ <section id="catalog-pg-index">
+  <title>pg_index</title>
+
+  <para>
+   <structname>pg_index</structname> contains part of the information
+   about indexes.  The rest is mostly in
+   <structname>pg_class</structname>.
+  </para>
+
+  <table>
+   <title>pg_index Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>indexrelid</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_class.oid</entry>
+      <entry>The oid of the pg_class entry for this index</entry>
+     </row>
+
+     <row>
+      <entry>indrelid</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_class.oid</entry>
+      <entry>The oid of the pg_class entry for the table this index is for</entry>
+     </row>
+
+     <row>
+      <entry>indproc</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_proc.oid</entry>
+      <entry>The registered procedure if this is a functional index</entry>
+     </row>
+
+     <row>
+      <entry>indkey</entry>
+      <entry><type>int2vector</type></entry>
+      <entry>pg_attribute.attnum</entry>
+      <entry>
+       This is an vector (array) of up to
+       <symbol>INDEX_MAX_KEYS</symbol> values that indicate which
+       table columns this index pertains to.  For example a value of
+       <literal>1 3</literal> would mean that the first and the third
+       column make up the index key.
+      </entry>
+     </row>
+
+     <row>
+      <entry>indclass</entry>
+      <entry><type>oidvector</type></entry>
+      <entry>pg_opclass.oid</entry>
+      <entry>
+       For each column in the index key this contains a reference to
+       the <quote>operator class</quote> to use.  See
+       <structname>pg_opclass</structname> for details.
+      </entry>
+     </row>
+
+     <row>
+      <entry>indisclustered</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>unused</entry>
+     </row>
+
+     <row>
+      <entry>indislossy</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>???</entry>
+     </row>
+
+     <row>
+      <entry>indisunique</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>If true, this is a unique index.</entry>
+     </row>
+
+     <row>
+      <entry>indisprimary</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>If true, this index is a unique index that represents the primary key of the table.</entry>
+     </row>
+
+     <row>
+      <entry>indreference</entry>
+      <entry><type>oid</type></entry>
+      <entry></entry>
+      <entry>unused</entry>
+     </row>
+
+     <row>
+      <entry>indpred</entry>
+      <entry><type>text</type></entry>
+      <entry></entry>
+      <entry>Query plan for partial index predicate (not functional)</entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+ </section>
+
+
+ <section id="catalog-pg-inherits">
+  <title>pg_inherits</title>
+
+  <para>
+   This catalog records information about table inheritance hierarchies.
+  </para>
+
+  <table>
+   <title>pg_inherits Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>inhrelid</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_class.oid</entry>
+      <entry>
+       This is the reference to the subtable, that is, it records the
+       fact that the identified table is inherited from some other
+       table.
+      </entry>
+     </row>
+
+     <row>
+      <entry>inhparent</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_class.oid</entry>
+      <entry>
+       This is the reference to the parent table, from which the table
+       referenced by <structfield>inhrelid</structfield> inherited
+       from.
+      </entry>
+     </row>
+
+     <row>
+      <entry>inhseqno</entry>
+      <entry><type>int4</type></entry>
+      <entry></entry>
+      <entry>
+       If there is more than one subtable/parent pair (multiple
+       inheritance), this number tells the order in which the
+       inherited columns are to be arranged.  The count starts at 1.
+      </entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+ </section>
+
+
+ <section id="catalog-pg-language">
+  <title>pg_language</title>
+
+  <para>
+   <structname>pg_language</structname> registers call interfaces or
+   languages in which you can write functions or stored procedures.
+   See under <command>CREATE LANGUAGE</command> and in the
+   <citetitle>Programmer's Guide</citetitle> for more information
+   about language handlers.
+  </para>
+
+  <table>
+   <title>pg_language Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>lanname</entry>
+      <entry><type>name</type></entry>
+      <entry></entry>
+      <entry>Name of the language (to be specified when creating a function)</entry>
+     </row>
+
+     <row>
+      <entry>lanispl</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>
+       This is false for internal languages (such as SQL) and true for
+       dynamically loaded language handler modules.  It essentially
+       means that, if it is true, the language may be dropped.
+      </entry>
+     </row>
+
+     <row>
+      <entry>lanpltrusted</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>
+       This is a trusted language.  See under <command>CREATE
+       LANGUAGE</command> what this means.  If this is an internal
+       language (<structfield>lanispl</structfield> is false) then
+       this field is meaningless.
+      </entry>
+     </row>
+
+     <row>
+      <entry>lanplcallfoid</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_proc.oid</entry>
+      <entry>
+       For non-internal languages this references the language
+       handler, which is a special function that is responsible for
+       executing all functions that are written in the particular
+       language.
+      </entry>
+     </row>
+
+     <row>
+      <entry>lancompiler</entry>
+      <entry><type>text</type></entry>
+      <entry></entry>
+      <entry>not useful</entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+ </section>
+
+
+ <section id="catalog-pg-operator">
+  <title>pg_operator</title>
+
+  <para>
+   See <command>CREATE OPERATOR</command> and the
+   <citetitle>Programmer's Guide</citetitle> for details on these
+   operator parameters.
+  </para>
+
+  <table>
+   <title>pg_operator Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>oprname</entry>
+      <entry><type>name</type></entry>
+      <entry></entry>
+      <entry>Name of the operator</entry>
+     </row>
+
+     <row>
+      <entry>oprowner</entry>
+      <entry><type>int4</type></entry>
+      <entry>pg_shadow.usesysid</entry>
+      <entry>Owner (creator) of the operator</entry>
+     </row>
+
+     <row>
+      <entry>oprprec</entry>
+      <entry><type>int2</type></entry>
+      <entry></entry>
+      <entry>unused</entry>
+     </row>
+
+     <row>
+      <entry>oprkind</entry>
+      <entry><type>char</type></entry>
+      <entry></entry>
+      <entry>
+       'b' = infix (<quote>both</quote>), 'l' = prefix
+       (<quote>left</quote>), 'r' = postfix (<quote>right</quote>)
+      </entry>
+     </row>
+
+     <row>
+      <entry>oprisleft</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>unused</entry>
+     </row>
+
+     <row>
+      <entry>oprcanhash</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>This operator supports hash joins.</entry>
+     </row>
+
+     <row>
+      <entry>oprleft</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_type.oid</entry>
+      <entry>Type of the left operand</entry>
+     </row>
+
+     <row>
+      <entry>oprright</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_type.oid</entry>
+      <entry>Type of the right operand</entry>
+     </row>
+
+     <row>
+      <entry>oprresult</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_type.oid</entry>
+      <entry>Type of the result</entry>
+     </row>
+
+     <row>
+      <entry>oprcom</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_operator.oid</entry>
+      <entry>Commutator of this operator, if any</entry>
+     </row>
+
+     <row>
+      <entry>oprnegate</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_operator.oid</entry>
+      <entry>Inverse of this operator, if any</entry>
+     </row>
+
+     <row>
+      <entry>oprlsortop</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_operator.oid</entry>
+      <entry>
+       If this operator supports merge joins, the operator that sorts
+       the type of the left-hand operand
+      </entry>
+     </row>
+
+     <row>
+      <entry>oprrsortop</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_operator.oid</entry>
+      <entry>
+       If this operator supports merge joins, the operator that sorts
+       the type of the left-hand operand
+      </entry>
+     </row>
+
+     <row>
+      <entry>oprcode</entry>
+      <entry><type>regproc</type></entry>
+      <entry></entry>
+      <entry>Function that implements this operator</entry>
+     </row>
+
+     <row>
+      <entry>oprrest</entry>
+      <entry><type>regproc</type></entry>
+      <entry></entry>
+      <entry>Restriction selectivity estimation function for this operator</entry>
+     </row>
+
+     <row>
+      <entry>oprjoin</entry>
+      <entry><type>regproc</type></entry>
+      <entry></entry>
+      <entry>Join selectivity estimation function for this operator</entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+ </section>
+
+
+ <section id="catalog-pg-proc">
+  <title>pg_proc</title>
+
+  <para>
+   This catalog stores information about functions (or procedures).
+   The description of <command>CREATE FUNCTION</command> and the
+   <citetitle>Programmer's Guide</citetitle> contain more information
+   about the meaning of some fields.
+  </para>
+
+  <table>
+   <title>pg_proc Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>proname</entry>
+      <entry><type>name</type></entry>
+      <entry></entry>
+      <entry>Name of the function</entry>
+     </row>
+
+     <row>
+      <entry>proowner</entry>
+      <entry><type>int4</type></entry>
+      <entry>pg_shadow.usesysid</entry>
+      <entry>Owner (creator) of the function</entry>
+     </row>
+
+     <row>
+      <entry>prolang</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_language.oid</entry>
+      <entry>Implementation language or call interface of this function</entry>
+     </row>
+
+     <row>
+      <entry>proisinh</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>unused</entry>
+     </row>
+
+     <row>
+      <entry>proistrusted</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>not functional</entry>
+     </row>
+
+     <row>
+      <entry>proiscachable</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>Function returns same result for same input values</entry>
+     </row>
+
+     <row>
+      <entry>proisstrict</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>
+       Function returns null if any call argument is null.  In that
+       case the function won't actually be called at all.  Functions
+       that are not <quote>strict</quote> must be prepared to handle
+       null inputs.
+      </entry>
+     </row>
+
+     <row>
+      <entry>pronargs</entry>
+      <entry><type>int2</type></entry>
+      <entry></entry>
+      <entry>Number of arguments</entry>
+     </row>
+
+     <row>
+      <entry>proretset</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>Function returns a set (probably not functional)</entry>
+     </row>
+
+     <row>
+      <entry>prorettype</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_type.oid</entry>
+      <entry>Data type of the return value (0 if the function does not return a value)</entry>
+     </row>
+
+     <row>
+      <entry>proargtypes</entry>
+      <entry><type>oidvector</type></entry>
+      <entry>pg_type.oid</entry>
+      <entry>A vector with the data types of the function arguments</entry>
+     </row>
+
+     <row>
+      <entry>probyte_pct</entry>
+      <entry><type>int4</type></entry>
+      <entry></entry>
+      <entry>dead code</entry>
+     </row>
+
+     <row>
+      <entry>properbyte_pct</entry>
+      <entry><type>int4</type></entry>
+      <entry></entry>
+      <entry>dead code</entry>
+     </row>
+
+     <row>
+      <entry>propercall_pct</entry>
+      <entry><type>int4</type></entry>
+      <entry></entry>
+      <entry>dead code</entry>
+     </row>
+
+     <row>
+      <entry>prooutin_ratio</entry>
+      <entry><type>int4</type></entry>
+      <entry></entry>
+      <entry>dead code</entry>
+     </row>
+
+     <row>
+      <entry>prosrc</entry>
+      <entry><type>text</type></entry>
+      <entry></entry>
+      <entry>
+       This tells the function handler how to invoke the function.  It
+       might be the actual source code of the function for interpreted
+       languages, a link symbol, a file name, or just about anything
+       else, depending the implementation language/call convention.
+      </entry>
+     </row>
+
+     <row>
+      <entry>probin</entry>
+      <entry><type>bytea</type></entry>
+      <entry></entry>
+      <entry>?</entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+ </section>
+
+
+ <section id="catalog-pg-relcheck">
+  <title>pg_relcheck</title>
+
+  <para>
+   This system catalog stores CHECK constraints on tables.  (Column
+   constraints are not treated specially.  Every column constraint is
+   equivalent to some table constraint.)  See under <command>CREATE
+   TABLE</command> for more information.
+  </para>
+
+  <table>
+   <title>pg_relcheck Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>rcrelid</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_class.oid</entry>
+      <entry>The table this check constraint is on</entry>
+     </row>
+
+     <row>
+      <entry>rcname</entry>
+      <entry><type>name</type></entry>
+      <entry></entry>
+      <entry>Constraint name</entry>
+     </row>
+
+     <row>
+      <entry>rcbin</entry>
+      <entry><type>text</type></entry>
+      <entry></entry>
+      <entry>An internal representation of the constraint expression</entry>
+     </row>
+
+     <row>
+      <entry>rcsrc</entry>
+      <entry><type>text</type></entry>
+      <entry></entry>
+      <entry>A human-readable representation of the consraint expression</entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+  <note>
+   <para>
+    <structname>pg_class</structname>.<structfield>relchecks</structfield>
+    needs to match up with the entries in this table.
+   </para>
+  </note>
+
+ </section>
+
+
+ <section id="catalog-pg-shadow">
+  <title>pg_shadow</title>
+
+  <para>
+   <structname>pg_shadow</structname> contains information about
+   database users.  The name stems from the fact that this table
+   should not be readable by the public since it contains passwords.
+   <structname>pg_user</structname> is a view on
+   <structname>pg_shadow</structname> that blanks out the password field.
+  </para>
+
+  <para>
+   The <citetitle>Administrator's Guide</citetitle> contains detailed
+   information about user and permission management.
+  </para>
+
+  <table>
+   <title>pg_shadow Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>usename</entry>
+      <entry><type>name</type></entry>
+      <entry></entry>
+      <entry>User name</entry>
+     </row>
+
+     <row>
+      <entry>usesysid</entry>
+      <entry><type>int4</type></entry>
+      <entry></entry>
+      <entry>User id (arbitrary number used to reference this user)</entry>
+     </row>
+
+     <row>
+      <entry>usecreatedb</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>User may create databases</entry>
+     </row>
+
+     <row>
+      <entry>usetrace</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>not used</entry>
+     </row>
+
+     <row>
+      <entry>usesuper</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>User is a superuser</entry>
+     </row>
+
+     <row>
+      <entry>usecatupd</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>
+       User may update system catalogs.  (Even a superuser may not do
+       this unless this attribute is true.)
+      </entry>
+     </row>
+
+     <row>
+      <entry>passwd</entry>
+      <entry><type>text</type></entry>
+      <entry></entry>
+      <entry>Password</entry>
+     </row>
+
+     <row>
+      <entry>valuntil</entry>
+      <entry><type>abstime</type></entry>
+      <entry></entry>
+      <entry>Account expiry time (only used for password authentication)</entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+ </section>
+
+
+ <section id="catalog-pg-type">
+  <title>pg_type</title>
+
+  <table>
+   <title>pg_type Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>typname</entry>
+      <entry><type>name</type></entry>
+      <entry></entry>
+      <entry>Data type name</entry>
+     </row>
+
+     <row>
+      <entry>typowner</entry>
+      <entry><type>int4</type></entry>
+      <entry>pg_shadow.usesysid</entry>
+      <entry>Owner (creator) of the type</entry>
+     </row>
+
+     <row>
+      <entry>typlen</entry>
+      <entry><type>int2</type></entry>
+      <entry></entry>
+      <entry>Length of the storage representation of the type, -1 if variable length</entry>
+     </row>
+
+     <row>
+      <entry>typprtlen</entry>
+      <entry><type>int2</type></entry>
+      <entry></entry>
+      <entry>unused</entry>
+     </row>
+
+     <row>
+      <entry>typbyval</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>
+       <structfield>typbyval</structfield> determines whether internal
+       routines pass a value of this type by value or by reference.
+       Only <type>char</type>, <type>short</type>, and
+       <type>int</type> equivalent items can be passed by value, so if
+       the type is not 1, 2, or 4 bytes long, Postgres does not have
+       the option of passing by value and so
+       <structfield>typbyval</structfield> had better be false.
+       Variable-length types are always passed by reference. Note that
+       <structfield>typbyval</structfield> can be false even if the
+       length would allow pass-by-value; this is currently true for
+       type <type>float4</type>, for example.
+      </entry>
+     </row>
+
+     <row>
+      <entry>typtype</entry>
+      <entry><type>char</type></entry>
+      <entry></entry>
+      <entry>
+       <structfield>typtype</structfield> is <literal>b</literal> for
+       a basic type and <literal>c</literal> for a catalog type (i.e.,
+       a table).  If <structfield>typtype</structfield> is
+       <literal>c</literal>, <structfield>typrelid</structfield> is
+       the OID of the type's entry in
+       <structname>pg_class</structname>.
+      </entry>
+     </row>
+
+     <row>
+      <entry>typisdefined</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>???</entry>
+     </row>
+
+     <row>
+      <entry>typdelim</entry>
+      <entry><type>char</type></entry>
+      <entry></entry>
+      <entry>Character that separates two values of this type when parsing array input</entry>
+     </row>
+
+     <row>
+      <entry>typrelid</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_class.oid</entry>
+      <entry>
+       If this is a catalog type (see
+       <structfield>typtype</structfield>), then this field points to
+       the <structfield>pg_class</structfield> entry that defines the
+       corresponding table. A table could theoretically be used as a
+       composite data type, but this is not fully functional.
+      </entry>
+     </row>
+
+     <row>
+      <entry>typelem</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_type.oid</entry>
+      <entry>
+       If <structfield>typelem</structfield> is not 0 then it
+       identifies another row in <structname>pg_type</structname>.
+       The current type can then be subscripted like an array yielding
+       values of type <structfield>typelem</structfield>. A non-zero
+       <structfield>typelem</structfield> does not guarantee this type
+       to be a <quote>real</quote> array type; some ordinary
+       fixed-length types can also be subscripted (e.g.,
+       <type>oidvector</type>). Variable-length types can
+       <emphasis>not</emphasis> be turned into pseudo-arrays like
+       that. Hence, the way to determine whether a type is a
+       <quote>true</quote> array type is typelem != 0 and typlen < 0.
+      </entry>
+     </row>
+
+     <row>
+      <entry>typinput</entry>
+      <entry><type>regproc</type></entry>
+      <entry></entry>
+      <entry>Input function</entry>
+     </row>
+
+     <row>
+      <entry>typoutput</entry>
+      <entry><type>regproc</type></entry>
+      <entry></entry>
+      <entry>Output function</entry>
+     </row>
+
+     <row>
+      <entry>typreceive</entry>
+      <entry><type>regproc</type></entry>
+      <entry></entry>
+      <entry>unused</entry>
+     </row>
+
+     <row>
+      <entry>typsend</entry>
+      <entry><type>regproc</type></entry>
+      <entry></entry>
+      <entry>unused</entry>
+     </row>
+
+     <row>
+      <entry>typalign</entry>
+      <entry><type>char</type></entry>
+      <entry></entry>
+      <entry><para>
+
+       <structfield>typalign</structfield> is the alignment required
+       when storing a value of this type.  It applies to storage on
+       disk as well as most representations of the value inside
+       Postgres.  When multiple values are stored consecutively, such
+       as in the representation of a complete row on disk, padding is
+       inserted before a datum of this type so that it begins on the
+       specified boundary.  The alignment reference is the beginning
+       of the first datum in the sequence.
+      </para><para>
+       Possible values are:
+       <itemizedlist>
+        <listitem>
+         <para>'c' = CHAR alignment, ie no alignment needed.</para>
+        </listitem>
+        <listitem>
+         <para>'s' = SHORT alignment (2 bytes on most machines).</para>
+        </listitem>
+        <listitem>
+         <para>'i' = INT alignment (4 bytes on most machines).</para>
+        </listitem>
+        <listitem>
+         <para>'d' = DOUBLE alignment (8 bytes on many machines, but by no means all).</para>
+        </listitem>
+       </itemizedlist>
+      </para><note>
+       <para>
+        For types used in system tables, it is critical that the size
+        and alignment defined in <structname>pg_type</structname>
+        agree with the way that the compiler will lay out the field in
+        a struct representing a table row.
+       </para>
+      </note></entry>
+     </row>
+
+     <row>
+      <entry>typstorage</entry>
+      <entry><type>char</type></entry>
+      <entry></entry>
+      <entry><para>
+       <structfield>typstorage</structfield> tells for variable-length
+       types (those with <structfield>typlen</structfield> = -1) if
+       the type is prepared for toasting and what the default strategy
+       for attributes of this type should be.
+       Possible values are
+       <itemizedlist>
+        <listitem>
+         <para>'p': Value must always be stored plain.</para>
+        </listitem>
+        <listitem>
+         <para>
+          'e': Value can be stored in a <quote>secondary</quote>
+          relation (if relation has one, see
+          <structname>pg_class</structname>.<structfield>reltoastrelid</structfield>).
+         </para>
+        </listitem>
+        <listitem>
+         <para>'m': Value can be stored compressed inline.</para>
+        </listitem>
+        <listitem>
+         <para>'x': Value can be stored compressed inline or in <quote>secondary</quote>.</para>
+        </listitem>
+       </itemizedlist>
+       Note that 'm' fields can also be moved out to secondary
+       storage, but only as a last resort ('e' and 'x' fields are
+       moved first).
+      </para></entry>
+     </row>
+
+     <row>
+      <entry>typdefault</entry>
+      <entry><type>text</type></entry>
+      <entry></entry>
+      <entry>???</entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+ </section>
+
+</chapter>
diff --git a/doc/src/sgml/developer.sgml b/doc/src/sgml/developer.sgml
index 586f0eaa95a..4cd9a876856 100644
--- a/doc/src/sgml/developer.sgml
+++ b/doc/src/sgml/developer.sgml
@@ -1,4 +1,4 @@
-<!-- $Header: /cvsroot/pgsql/doc/src/sgml/Attic/developer.sgml,v 1.2 2000/11/24 17:44:21 petere Exp $ -->
+<!-- $Header: /cvsroot/pgsql/doc/src/sgml/Attic/developer.sgml,v 1.3 2000/11/29 20:15:59 petere Exp $ -->
 <!-- PostgreSQL Developer's Guide -->
 
 <book id="developer">
@@ -17,17 +17,12 @@
  
  &sources;
  &arch-dev; 
- &geqo;
-<!--
- This listing of Postgres catalogs is currently just a copy of the old
- man page. It is not up to date and has not been marked up for DocBook.
- - thomas 2000-04-20
  &catalogs;
--->
  &protocol;
  &compiler;
  &bki;
  &page;
+ &geqo;
 <![%single-book;[
  &biblio;
 ]]>
diff --git a/doc/src/sgml/extend.sgml b/doc/src/sgml/extend.sgml
index 5f18a1c770d..7d4d6f8f61b 100644
--- a/doc/src/sgml/extend.sgml
+++ b/doc/src/sgml/extend.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/extend.sgml,v 1.6 2000/09/29 20:21:33 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/extend.sgml,v 1.7 2000/11/29 20:15:59 petere Exp $
 -->
 
  <chapter id="extend">
@@ -107,7 +107,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/extend.sgml,v 1.6 2000/09/29 20:21:33 peter
    </para>
   </sect1>
 
-  <sect1 id="system-catalogs">
+  <sect1 id="pg-system-catalogs">
    <title>About the <productname>Postgres</productname> System Catalogs</title>
 
    <para>
diff --git a/doc/src/sgml/sql.sgml b/doc/src/sgml/sql.sgml
index 51bd5e43c53..ce668e37b39 100644
--- a/doc/src/sgml/sql.sgml
+++ b/doc/src/sgml/sql.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/sql.sgml,v 1.12 2000/09/29 20:21:34 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/sql.sgml,v 1.13 2000/11/29 20:15:59 petere Exp $
 -->
 
  <chapter id="sql">
@@ -1574,7 +1574,7 @@ CREATE INDEX I ON SUPPLIER (SNAME);
       view (i.e. the rules about how to access physically stored base
       tables in order to materialize the view) somewhere in the system
       catalogs (see
-      <xref linkend="catalogs-title" endterm="catalogs-title">). For a
+      <xref linkend="tutorial-catalogs-title" endterm="tutorial-catalogs-title">). For a
       discussion on different techniques to implement views refer to
 <!--
       section
@@ -1783,8 +1783,8 @@ DELETE FROM SUPPLIER
     </sect3>
    </sect2>
 
-   <sect2 id="catalogs">
-    <title id="catalogs-title">System Catalogs</title>
+   <sect2 id="tutorial-catalogs">
+    <title id="tutorial-catalogs-title">System Catalogs</title>
 
     <para>
      In every <acronym>SQL</acronym> database system
-- 
GitLab