summaryrefslogtreecommitdiff
path: root/src/tools/backend
diff options
context:
space:
mode:
authorBruce Momjian1997-10-29 23:48:18 +0000
committerBruce Momjian1997-10-29 23:48:18 +0000
commit97b1bb228135dee3770ea0dd1db39d85e239030c (patch)
tree84b08efaf673c85a3216f591fe0887bbf03cc76b /src/tools/backend
parent5071d3124a1420d4c7d6a1efebcdbbe83b33f889 (diff)
New backend_dir html source.
Diffstat (limited to 'src/tools/backend')
-rw-r--r--src/tools/backend/README3
-rw-r--r--src/tools/backend/backend_dirs.html420
-rw-r--r--src/tools/backend/flow.fig140
-rw-r--r--src/tools/backend/flow.gifbin0 -> 674098 bytes
-rw-r--r--src/tools/backend/index.html42
5 files changed, 605 insertions, 0 deletions
diff --git a/src/tools/backend/README b/src/tools/backend/README
new file mode 100644
index 00000000000..601c66cc4bc
--- /dev/null
+++ b/src/tools/backend/README
@@ -0,0 +1,3 @@
+Just point your browser at the index.html file, and click on the
+flowchart to see the description and source code.
+
diff --git a/src/tools/backend/backend_dirs.html b/src/tools/backend/backend_dirs.html
new file mode 100644
index 00000000000..3ef940f0ca1
--- /dev/null
+++ b/src/tools/backend/backend_dirs.html
@@ -0,0 +1,420 @@
+<HTML>
+<HEAD>
+<TITLE>PostgreSQL Backend Directories</TITLE>
+</HEAD>
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#FF0000" VLINK="#A00000" ALINK="#0000FF">
+<H1 ALIGN=CENTER>
+PostgreSQL Backend Directories
+</H1>
+<H2 ALIGN=CENTER>
+by Bruce Momjian
+</H2 ALIGN=CENTER>
+<H2>
+<A NAME="bootstrap">
+<A HREF="../../backend/bootstrap">bootstrap</A></A>
+- creates initial template database via initdb
+</H2>
+<P>
+Because PostgreSQL requires access to system tables for almost every
+operation, getting those system tables in place is a problem.
+You can't just create the tables and insert data into them in the normal way,
+because table creation and insertion requires the tables to already
+exist.
+This code <I>jams</I> the data directly into tables using a
+special syntax used only by the bootstrap procedure.
+</P>
+<H2>
+<A NAME="main">
+<A HREF="../../backend/main">main</A></A>
+- passes control to postmaster or postgres
+</H2>
+<P>
+This checks the process name(argv[0]) and various flags, and passes
+control to the postmaster or postgres backend code.
+</P>
+<H2>
+<A NAME="postmaster">
+<A HREF="../../backend/postmaster">postmaster</A></A>
+- controls postgres server startup/termination
+</H2>
+<P>
+This creates shared memory, and then goes into a loop waiting for
+connection requests.
+When a connection request arrives, a <I>postgres</I> backend is started,
+and the connection is passed to it.
+</P>
+<H2>
+<A NAME="libpq">
+<A HREF="../../backend/libpq">libpq</A></A>
+- backend libpq library routines
+</H2>
+<P>
+This handles communication to the client processes.
+</P>
+<H2>
+<A NAME="tcop">
+<A HREF="../../backend/tcop">tcop</A></A>
+- traffic cop, dispatches request to proper module
+</H2>
+<P>
+This contains the <I>postgres</I> backend main handler, as well as the
+code that makes calls to the parser, optimizer, executor, and
+<I>/commands</I> functions.
+</P>
+<H2>
+<A NAME="parser">
+<A HREF="../../backend/parser">parser</A></A>
+- converts SQL query to query tree
+</H2>
+<P>
+This converts SQL queries coming from <I>libpq</I> into command-specific
+structures to be used the the optimizer/executor, or <I>/commands</I>
+routines.
+The SQL is lexically analyzed into keywords, identifiers, and constants,
+and passed to the parser.
+The parser creates command-specific structures to hold the elements of
+the query.
+The command-specific structures are then broken apart, checked, and passed to
+<I>/commands</I> processing routines, or converted into <I>Lists</I> of
+<I>Nodes</I> to be handled by the optimizer and executor.
+</P>
+<H2>
+<A NAME="optimizer">
+<A HREF="../../backend/optimizer">optimizer</A></A>
+- creates path and plan
+</H2>
+<P>
+This uses the parser output to generate an optimal plan for the
+executor.
+</P>
+<H4>
+<A NAME="optimizer/path">
+<A HREF="../../backend/optimizer/path">optimizer/path</A></A>
+- creates path from parser output
+</H4>
+<P>
+This takes the parser query output, and generates all possible methods of
+executing the request.
+It examines table join order, <I>where</I> clause restrictions,
+and optimizer table statistics to evaluate each possible execution
+method, and assigns a cost to each.
+</P>
+<H4>
+<A NAME="optimizer/geqo">
+<A HREF="../../backend/optimizer/geqo">optimizer/geqo</A></A>
+- genetic query optimizer
+</H4>
+<P>
+<I>optimizer/path</I> evaluates all possible ways to join the requested tables.
+When the number of tables becomes great, the number of tests made
+becomes great too.
+The Genetic Query Optimizer considers each table separately, then figures
+the most optimal order to perform the join.
+For a few tables, this method takes longer, but for a large number of
+tables, it is faster.
+There is an option to control when this feature is used.
+</P>
+<H4>
+<A NAME="optimizer/plan">
+<A HREF="../../backend/optimizer/plan">optimizer/plan</A></A>
+- optimizes path output
+</H4>
+<P>
+This takes the <I>optimizer/path</I> output, chooses the path with the
+least cost, and creates a plan for the executor.
+</P>
+<H4>
+<A NAME="optimizer/prep">
+<A HREF="../../backend/optimizer/prep">optimizer/prep</A></A>
+- handle special plan cases
+</H4>
+<P>
+This does special plan processing.
+</P>
+<H4>
+<A NAME="optimizer/util">
+<A HREF="../../backend/optimizer/util">optimizer/util</A></A>
+- optimizer support routines
+</H4>
+<P>
+This contains support routines used by other parts of the optimizer.
+</P>
+<H2>
+<A NAME="executor">
+<A HREF="../../backend/executor">executor</A></A>
+- executes complex node plans from optimizer
+</H2>
+<P>
+This handles <I>select, insert, update,</I> and <I>delete</I> statements.
+The operations required to handle these statement types include
+heap scans, index scans, sorting, joining tables, grouping, aggregates,
+and uniqueness.
+</P>
+<H2>
+<A NAME="commands">
+<A HREF="../../backend/commands">commands</A></A>
+- commands that do not require the executor
+</H2>
+<P>
+These process SQL commands that do not require complex handling.
+It includes <I>vacuum, copy, alter, create table, create type,</I> and
+many others.
+The code is called with the structures generated by the parser.
+Most of the routines do some processing, then call lower-level functions
+in the catalog directory to do the actual work.
+</P>
+<H2>
+<A NAME="catalog">
+<A HREF="../../backend/catalog">catalog</A></A>
+- system catalog manipulation
+</H2>
+<P>
+This contains functions that manipulate the system tables or catalogs.
+Table, index, procedure, operator, type, and aggregate creation and
+manipulation routines are here.
+These are low-level routines, and are usually called by upper routines
+that pre-format user requests into a predefined format.
+</P>
+<H2>
+<A NAME="storage">
+<A HREF="../../backend/storage">storage</A></A>
+- manages various storage systems
+</H2>
+<P>
+These allow uniform resource access by the backend.
+<BR>
+<BR>
+<A NAME="storage/buffer">
+<A HREF="../../backend/storage/buffer">storage/buffer</A></A>
+- shared buffer pool manager
+<BR>
+<A NAME="storage/file">
+<A HREF="../../backend/storage/file">storage/file</A></A>
+- file manager
+<BR>
+<A NAME="storage/ipc">
+<A HREF="../../backend/storage/ipc">storage/ipc</A></A>
+- semaphores and shared memory
+<BR>
+<A NAME="storage/large_object">
+<A HREF="../../backend/storage/large_object">storage/large_object</A></A>
+- large objects
+<BR>
+<A NAME="storage/lmgr">
+<A HREF="../../backend/storage/lmgr">storage/lmgr</A></A>
+- lock manager
+<BR>
+<A NAME="storage/page">
+<A HREF="../../backend/storage/page">storage/page</A></A>
+- page manager
+<BR>
+<A NAME="storage/smgr">
+<A HREF="../../backend/storage/smgr">storage/smgr</A></A>
+- storage/disk manager
+<BR>
+<BR>
+</P>
+<H2>
+<A NAME="access">
+<A HREF="../../backend/access">access</A></A>
+- various data access methods
+</H2>
+<P>
+These control the way data is accessed in heap, indexes, and
+transactions.
+<BR>
+<BR>
+<A NAME="access/common">
+<A HREF="../../backend/access/common">access/common</A></A>
+- common access routines
+<BR>
+<A NAME="access/gist">
+<A HREF="../../backend/access/gist">access/gist</A></A>
+- easy-to-define access method system
+<BR>
+<A NAME="access/hash">
+<A HREF="../../backend/access/hash">access/hash</A></A>
+- hash
+<BR>
+<A NAME="access/heap">
+<A HREF="../../backend/access/heap">access/heap</A></A>
+- heap is use to store data rows
+<BR>
+<A NAME="access/index">
+<A HREF="../../backend/access/index">access/index</A></A>
+- used by all index types
+<BR>
+<A NAME="access/nbtree">
+<A HREF="../../backend/access/nbtree">access/nbtree</A></A>
+- Lehman and Yao's btree management algorithm
+<BR>
+<A NAME="access/rtree">
+<A HREF="../../backend/access/rtree">access/rtree</A></A>
+- used for indexing of 2-dimensional data
+<BR>
+<A NAME="access/transam">
+<A HREF="../../backend/access/transam">access/transam</A></A>
+- transaction manager (BEGIN/ABORT/COMMIT)
+<BR>
+<BR>
+</P>
+<H2>
+<A NAME="nodes">
+<A HREF="../../backend/nodes">nodes</A></A>
+- creation/manipulation of nodes and lists
+</H2>
+<P>
+PostgreSQL stores information about SQL queries in structures called
+nodes.
+<I>Nodes</I> are generic containers that have a <I>type</I> field and then a
+type-specific data section.
+Nodes are usually placed in <I>Lists.</I>
+A <I>List</I> is container with an <I>elem</I> element,
+and a <I>next</I> field that points to the next <I>List.</I>
+These <I>List</I> structures are chained together in a forward linked list.
+In this way, a chain of <I>List</I>s can contain an unlimited number of <I>Node</I>
+elements, and each <I>Node</I> can contain any data type.
+These are used extensively in the parser, optimizer, and executor to
+store requests and data.
+</P>
+<H2>
+<A NAME="utils">
+<A HREF="../../backend/utils">utils</A></A>
+- support routines
+</H2>
+<H4>
+<A NAME="utils/adt">
+<A HREF="../../backend/utils/adt">utils/adt</A></A>
+- built-in data type routines
+</H4>
+<P>
+This contains all the PostgreSQL builtin data types.
+</P>
+<H4>
+<A NAME="utils/cache">
+<A HREF="../../backend/utils/cache">utils/cache</A></A>
+- system/relation/function cache routines
+</H4>
+<P>
+PostgreSQL supports arbitrary data types, so no data types are hard-coded
+into the core backend routines.
+When the backend needs to find out about a type, is does a lookup of a
+system table.
+Because these system tables are referred to often, a cache is maintained
+that speeds lookups.
+There is a system relation cache, a function/operator cache, and a relation
+information cache.
+This last cache maintains information about all recently-accessed
+tables, not just system ones.
+</P>
+<H4>
+<A NAME="utils/error">
+<A HREF="../../backend/utils/error">utils/error</A></A>
+- error reporting routines
+</H4>
+<P>
+Reports backend errors to the front end.
+</P>
+<H4>
+<A NAME="utils/fmgr">
+<A HREF="../../backend/utils/fmgr">utils/fmgr</A></A>
+- function manager
+</H4>
+<P>
+This handles the calling of dynamically-loaded functions, and the calling
+of functions defined in the system tables.
+</P>
+<H4>
+<A NAME="utils/hash">
+<A HREF="../../backend/utils/hash">utils/hash</A></A>
+- hash routines for internal algorithms
+</H4>
+<P>
+These hash routines are used by the cache and memory-manager routines to
+do quick lookups of dynamic data storage structures maintained by the
+backend.
+</P>
+<H4>
+<A NAME="utils/init">
+<A HREF="../../backend/utils/init">utils/init</A></A>
+- various initialization stuff
+</H4>
+<H4>
+<A NAME="utils/misc">
+<A HREF="../../backend/utils/misc">utils/misc</A></A>
+- miscellaneous stuff
+</H4>
+<H4>
+<A NAME="utils/mmgr">
+<A HREF="../../backend/utils/mmgr">utils/mmgr</A></A>
+- memory manager(process-local memory)
+</H4>
+<P>
+When PostgreSQL allocates memory, it does so in an explicit context.
+Contexts can be statement-specific, transaction-specific, or
+persistent/global.
+By doing this, the backend can easily free memory once a statement or
+transaction completes.
+</P>
+<H4>
+<A NAME="utils/sort">
+<A HREF="../../backend/utils/sort">utils/sort</A></A>
+- sort routines for internal algorithms
+</H4>
+<P>
+When statement output must be sorted as part of a backend operation,
+this code sorts the tuples, either in memory or using disk files.
+</P>
+<H4>
+<A NAME="utils/time">
+<A HREF="../../backend/utils/time">utils/time</A></A>
+- transaction time qualification routines
+</H4>
+<P>
+These routines do checking of tuple internal columns to determine if the
+current row is still valid, or is part of a non-committed transaction or
+superseded by a new row.
+</P>
+<H2>
+<A NAME="include">
+<A HREF="../../backend/include">include</A></A>
+- include files
+</H2>
+<P>
+There are include directories for each subsystem.
+</P>
+<H2>
+<A NAME="lib">
+<A HREF="../../backend/lib">lib</A></A>
+- support library
+</H2>
+<P>
+This houses several generic routines.
+</P>
+<H2>
+<A NAME="regex">
+<A HREF="../../backend/regex">regex</A></A>
+- regular expression library
+</H2>
+<P>
+This is used for regular expression handling in the backend, i.e. '~'.
+</P>
+<H2>
+<A NAME="rewrite">
+<A HREF="../../backend/rewrite">rewrite</A></A>
+- rules system
+</H2>
+<P>
+This does processing for the rules system.
+</P>
+<H2>
+<A NAME="tioga">
+<A HREF="../../backend/tioga">tioga</A></A>
+- unused (array handling?)
+</H2>
+<HR>
+<ADDRESS>
+Maintainer: Bruce Momjian<A
+HREF="mailto:maillist@candle.pha.pa.us">maillist@candle.pha.pa.us</a>)<BR>
+Last updated: Mon Oct 27 11:01:08 EST 1997
+</ADDRESS>
diff --git a/src/tools/backend/flow.fig b/src/tools/backend/flow.fig
new file mode 100644
index 00000000000..265fb28e089
--- /dev/null
+++ b/src/tools/backend/flow.fig
@@ -0,0 +1,140 @@
+#FIG 3.1
+Landscape
+Center
+Inches
+1200 2
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 6900 1200 6900 600 4500 600 4500 1200 6900 1200
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5700 1200 5700 1800
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 6900 2400 6900 1800 4500 1800 4500 2400 6900 2400
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 6900 3600 6900 3000 4500 3000 4500 3600 6900 3600
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5700 2400 5700 3000
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 10800 3600 10800 3000 8400 3000 8400 3600 10800 3600
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5700 2400 9600 3000
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 6900 5100 6900 4500 4500 4500 4500 5100 6900 5100
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 6900 6300 6900 5700 4500 5700 4500 6300 6900 6300
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5700 5100 5700 5700
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 6900 7500 6900 6900 4500 6900 4500 7500 6900 7500
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5700 6300 5700 6900
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 6900 8700 6900 8100 4500 8100 4500 8700 6900 8700
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5700 7500 5700 8100
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5700 8700 5700 9300
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 10800 6300 10800 5700 8400 5700 8400 6300 10800 6300
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 6900 6000 8400 6000
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 3
+ 0 0 1.00 60.00 120.00
+ 4500 9600 3900 9600 3900 6600
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 10800 6000 11400 6000 11400 4200 5700 4200
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 1
+ 2700 8100
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 1
+ 8475 2175
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 1
+ 8475 2175
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 3900 6600 3900 4200
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 3900 4200 5700 4200
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5700 4200 5700 4500
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 2700 9600 2700 9000 300 9000 300 9600 2700 9600
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 1 2
+ 0 0 1.00 60.00 120.00
+ 0 0 1.00 60.00 120.00
+ 2700 9300 3300 9300
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 2700 8700 2700 8100 300 8100 300 8700 2700 8700
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 1 2
+ 0 0 1.00 60.00 120.00
+ 0 0 1.00 60.00 120.00
+ 2700 8400 3300 8400
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 2700 7800 2700 7200 300 7200 300 7800 2700 7800
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 1 2
+ 0 0 1.00 60.00 120.00
+ 0 0 1.00 60.00 120.00
+ 3300 7500 2700 7500
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 2700 6900 2700 6300 300 6300 300 6900 2700 6900
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 1 2
+ 0 0 1.00 60.00 120.00
+ 0 0 1.00 60.00 120.00
+ 3300 6600 2700 6600
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 2700 6000 2700 5400 300 5400 300 6000 2700 6000
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 1 2
+ 0 0 1.00 60.00 120.00
+ 0 0 1.00 60.00 120.00
+ 2700 5700 3300 5700
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 6900 9900 6900 9300 4500 9300 4500 9900 6900 9900
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 8 0 0 5
+ 10800 1200 10800 600 8400 600 8400 1200 10800 1200
+2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5
+ 10800 2400 10800 1800 8400 1800 8400 2400 10800 2400
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 1 2
+ 0 0 1.00 60.00 120.00
+ 0 0 1.00 60.00 120.00
+ 8400 2100 7725 2100
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 1 2
+ 0 0 1.00 60.00 120.00
+ 0 0 1.00 60.00 120.00
+ 8325 2175 7725 2550
+2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5700 3600 5700 4200
+4 1 -1 0 0 28 18 0.0000 4 195 630 5670 990 Main\001
+4 1 -1 0 0 28 18 0.0000 4 195 1470 5685 2190 Postmaster\001
+4 1 -1 0 0 28 18 0.0000 4 240 1110 9585 3375 Postgres\001
+4 1 -1 0 0 28 18 0.0000 4 240 1110 5700 3390 Postgres\001
+4 1 -1 0 0 28 18 0.0000 4 240 915 9600 5970 Simple\001
+4 1 -1 0 0 28 18 0.0000 4 195 1980 5685 7455 Generate Paths\001
+4 1 -1 0 0 28 18 0.0000 4 195 1275 5715 7170 Rewrite &\001
+4 1 -1 0 0 28 18 0.0000 4 255 1500 5715 6090 Traffic Cop\001
+4 1 -1 0 0 28 18 0.0000 4 195 825 5685 4875 Parser\001
+4 1 -1 0 0 28 18 0.0000 4 195 1485 9600 6255 Commands\001
+4 1 -1 0 0 28 18 0.0000 4 195 1830 5715 8670 Generate Plan\001
+4 1 -1 0 0 28 18 0.0000 4 195 1890 5700 8400 Choose Path &\001
+4 1 -1 0 0 28 18 0.0000 4 240 900 7605 5925 simple\001
+4 1 -1 0 0 28 18 0.0000 4 240 1125 5715 6660 complex\001
+4 0 -1 0 0 0 24 0.0000 4 330 1290 600 1470 Program\001
+4 0 -1 0 0 0 24 0.0000 4 255 735 600 1890 Flow\001
+4 0 -1 0 0 0 24 0.0000 4 330 1800 600 1050 PostgreSQL\001
+4 0 -1 0 0 0 18 0.0000 4 255 1095 9000 975 Bootstrap\001
+4 1 -1 0 0 28 18 0.0000 4 240 2325 1515 9390 Storage Managers\001
+4 0 -1 0 0 0 18 0.0000 4 225 1425 750 8475 Nodes / Lists\001
+4 1 -1 0 0 28 18 0.0000 4 195 1050 1485 7590 Utilities\001
+4 1 -1 0 0 28 18 0.0000 4 195 2100 1485 5805 Access Methods\001
+4 1 -1 0 0 28 18 0.0000 4 195 1140 5685 9720 Executor\001
+4 0 -1 0 0 0 18 0.0000 4 255 645 9225 2175 Libpq\001
+4 0 -1 0 0 0 18 0.0000 4 255 840 1050 6675 Catalog\001
diff --git a/src/tools/backend/flow.gif b/src/tools/backend/flow.gif
new file mode 100644
index 00000000000..1076af06f42
--- /dev/null
+++ b/src/tools/backend/flow.gif
Binary files differ
diff --git a/src/tools/backend/index.html b/src/tools/backend/index.html
new file mode 100644
index 00000000000..6b5362dff8c
--- /dev/null
+++ b/src/tools/backend/index.html
@@ -0,0 +1,42 @@
+<HTML>
+<HEAD>
+<TITLE>PostgreSQL Backend Flowchart</TITLE>
+</HEAD>
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#FF0000" VLINK="#A00000" ALINK="#0000FF">
+<H1 ALIGN=CENTER>
+PostgreSQL Backend Flowchart
+</H1>
+<H2 ALIGN=CENTER>
+by Bruce Momjian
+</H2 ALIGN=CENTER>
+<CENTER>
+Click on an item to see more detail.
+<BR>
+<BR>
+<IMG src="flow.gif" usemap="#flowmap">
+</CENTER>
+<MAP name="flowmap">
+<AREA COORDS="290,10,450,50" HREF="backend_dirs.html#main">
+<AREA COORDS="550,10,710,50" HREF="backend_dirs.html#bootstrap">
+<AREA COORDS="290,90,450,130," HREF="backend_dirs.html#postmaster">
+<AREA COORDS="550,90,710,130," HREF="backend_dirs.html#libpq">
+<AREA COORDS="290,170,450,210" HREF="backend_dirs.html#tcop">
+<AREA COORDS="550,170,710,210" HREF="backend_dirs.html#tcop">
+<AREA COORDS="290,270,450,310" HREF="backend_dirs.html#parser">
+<AREA COORDS="290,350,450,390" HREF="backend_dirs.html#tcop">
+<AREA COORDS="290,430,450,470" HREF="backend_dirs.html#optimizer">
+<AREA COORDS="290,510,450,550" HREF="backend_dirs.html#optimizer/plan">
+<AREA COORDS="290,570,450,630" HREF="backend_dirs.html#executor">
+<AREA COORDS="550,350,710,390" HREF="backend_dirs.html#commands">
+<AREA COORDS="10,330,170,370" HREF="backend_dirs.html#access">
+<AREA COORDS="10,390,170,430" HREF="backend_dirs.html#catalog">
+<AREA COORDS="10,450,170,490" HREF="backend_dirs.html#utils">
+<AREA COORDS="10,510,170,550" HREF="backend_dirs.html#nodes">
+<AREA COORDS="10,570,170,610" HREF="backend_dirs.html#storage">
+</MAP>
+<HR>
+<ADDRESS>
+Maintainer: Bruce Momjian<A
+HREF="mailto:maillist@candle.pha.pa.us">maillist@candle.pha.pa.us</a>)<BR>
+Last updated: Mon Oct 27 11:01:08 EST 1997
+</ADDRESS>