1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-12 21:01:52 +03:00

New backend_dir html source.

This commit is contained in:
Bruce Momjian
1997-10-29 23:48:18 +00:00
parent 5071d3124a
commit 97b1bb2281
6 changed files with 253 additions and 82 deletions

3
src/tools/backend/README Normal file
View File

@ -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.

View File

@ -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>

140
src/tools/backend/flow.fig Normal file
View File

@ -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

BIN
src/tools/backend/flow.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 KiB

View File

@ -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>