From 97b1bb228135dee3770ea0dd1db39d85e239030c Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Wed, 29 Oct 1997 23:48:18 +0000 Subject: [PATCH] New backend_dir html source. --- src/tools/backend/README | 3 + .../backend_dirs.html} | 196 +++++++++++++----- src/tools/{ => backend}/flow.fig | 94 ++++++--- src/tools/backend/flow.gif | Bin 0 -> 674098 bytes src/tools/backend/index.html | 42 ++++ src/tools/flow.gif | Bin 8444 -> 0 bytes 6 files changed, 253 insertions(+), 82 deletions(-) create mode 100644 src/tools/backend/README rename src/tools/{BACKEND_DIRS.html => backend/backend_dirs.html} (56%) rename src/tools/{ => backend}/flow.fig (65%) create mode 100644 src/tools/backend/flow.gif create mode 100644 src/tools/backend/index.html delete mode 100644 src/tools/flow.gif 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_DIRS.html b/src/tools/backend/backend_dirs.html similarity index 56% rename from src/tools/BACKEND_DIRS.html rename to src/tools/backend/backend_dirs.html index 0d9a1bc7d9d..3ef940f0ca1 100644 --- a/src/tools/BACKEND_DIRS.html +++ b/src/tools/backend/backend_dirs.html @@ -10,7 +10,9 @@ PostgreSQL Backend Directories by Bruce Momjian

-bootstrap - creates initial template database via initdb + +bootstrap +- creates initial template database via initdb

Because PostgreSQL requires access to system tables for almost every @@ -22,14 +24,18 @@ This code jams the data directly into tables using a special syntax used only by the bootstrap procedure.

-main - passes control to postmaster or postgres + +main +- passes control to postmaster or postgres

This checks the process name(argv[0]) and various flags, and passes control to the postmaster or postgres backend code.

-postmaster - controls postgres server startup/termination + +postmaster +- controls postgres server startup/termination

This creates shared memory, and then goes into a loop waiting for @@ -38,13 +44,17 @@ When a connection request arrives, a postgres backend is started, and the connection is passed to it.

-libpq - backend libpq library routines + +libpq +- backend libpq library routines

This handles communication to the client processes.

-tcop - traffic cop, dispatches request to proper module + +tcop +- traffic cop, dispatches request to proper module

This contains the postgres backend main handler, as well as the @@ -52,7 +62,9 @@ code that makes calls to the parser, optimizer, executor, and /commands functions.

-parser - converts SQL query to query tree + +parser +- converts SQL query to query tree

This converts SQL queries coming from libpq into command-specific @@ -67,14 +79,18 @@ The command-specific structures are then broken apart, checked, and passed to Nodes to be handled by the optimizer and executor.

-optimizer - creates path and plan + +optimizer +- creates path and plan

This uses the parser output to generate an optimal plan for the executor.

-optimizer/path - creates path from parser output + +optimizer/path +- creates path from parser output

This takes the parser query output, and generates all possible methods of @@ -84,7 +100,9 @@ and optimizer table statistics to evaluate each possible execution method, and assigns a cost to each.

-optimizer/geqo - genetic query optimizer + +optimizer/geqo +- genetic query optimizer

optimizer/path evaluates all possible ways to join the requested tables. @@ -97,26 +115,34 @@ tables, it is faster. There is an option to control when this feature is used.

-optimizer/plan - optimizes path output + +optimizer/plan +- optimizes path output

This takes the optimizer/path output, chooses the path with the least cost, and creates a plan for the executor.

-optimizer/prep - handle special plan cases + +optimizer/prep +- handle special plan cases

This does special plan processing.

-optimizer/util - optimizer support routines + +optimizer/util +- optimizer support routines

This contains support routines used by other parts of the optimizer.

-executor - executes complex node plans from optimizer + +executor +- executes complex node plans from optimizer

This handles select, insert, update, and delete statements. @@ -125,7 +151,9 @@ heap scans, index scans, sorting, joining tables, grouping, aggregates, and uniqueness.

-commands - commands that do not require the executor + +commands +- commands that do not require the executor

These process SQL commands that do not require complex handling. @@ -136,7 +164,9 @@ Most of the routines do some processing, then call lower-level functions in the catalog directory to do the actual work.

-catalog - system catalog manipulation + +catalog +- system catalog manipulation

This contains functions that manipulate the system tables or catalogs. @@ -146,56 +176,92 @@ These are low-level routines, and are usually called by upper routines that pre-format user requests into a predefined format.

-storage - manages various storage systems + +storage +- manages various storage systems

These allow uniform resource access by the backend.

-storage/buffer - shared buffer pool manager + +storage/buffer +- shared buffer pool manager
-storage/file - file manager + +storage/file +- file manager
-storage/ipc - semaphores and shared memory + +storage/ipc +- semaphores and shared memory
-storage/large_object - large objects + +storage/large_object +- large objects
-storage/lmgr - lock manager + +storage/lmgr +- lock manager
-storage/page - page manager + +storage/page +- page manager
-storage/smgr - storage/disk manager + +storage/smgr +- storage/disk manager

-access - various data access methods + +access +- various data access methods

These control the way data is accessed in heap, indexes, and transactions.

-access/common - common access routines + +access/common +- common access routines
-access/gist - easy-to-define access method system + +access/gist +- easy-to-define access method system
-access/hash - hash + +access/hash +- hash
-access/heap - heap is use to store data rows + +access/heap +- heap is use to store data rows
-access/index - used by all index types + +access/index +- used by all index types
-access/nbtree - Lehman and Yao's btree management algorithm + +access/nbtree +- Lehman and Yao's btree management algorithm
-access/rtree - used for indexing of 2-dimensional data + +access/rtree +- used for indexing of 2-dimensional data
-access/transam - transaction manager (BEGIN/ABORT/COMMIT) + +access/transam +- transaction manager (BEGIN/ABORT/COMMIT)

-nodes - creation/manipulation of nodes and lists + +nodes +- creation/manipulation of nodes and lists

PostgreSQL stores information about SQL queries in structures called @@ -212,16 +278,22 @@ These are used extensively in the parser, optimizer, and executor to store requests and data.

-utils - support routines + +utils +- support routines

-utils/adt - built-in data type routines + +utils/adt +- built-in data type routines

This contains all the PostgreSQL builtin data types.

-utils/cache - system/relation/function cache routines + +utils/cache +- system/relation/function cache routines

PostgreSQL supports arbitrary data types, so no data types are hard-coded @@ -236,20 +308,26 @@ This last cache maintains information about all recently-accessed tables, not just system ones.

-utils/error - error reporting routines + +utils/error +- error reporting routines

Reports backend errors to the front end.

-utils/fmgr - function manager + +utils/fmgr +- function manager

This handles the calling of dynamically-loaded functions, and the calling of functions defined in the system tables.

-utils/hash - hash routines for internal algorithms + +utils/hash +- hash routines for internal algorithms

These hash routines are used by the cache and memory-manager routines to @@ -257,13 +335,19 @@ do quick lookups of dynamic data storage structures maintained by the backend.

-utils/init - various initialization stuff + +utils/init +- various initialization stuff

-utils/misc - miscellaneous stuff + +utils/misc +- miscellaneous stuff

-utils/mmgr - memory manager(process-local memory) + +utils/mmgr +- memory manager(process-local memory)

When PostgreSQL allocates memory, it does so in an explicit context. @@ -273,14 +357,18 @@ By doing this, the backend can easily free memory once a statement or transaction completes.

-utils/sort - sort routines for internal algorithms + +utils/sort +- sort routines for internal algorithms

When statement output must be sorted as part of a backend operation, this code sorts the tuples, either in memory or using disk files.

-utils/time - transaction time qualification routines + +utils/time +- transaction time qualification routines

These routines do checking of tuple internal columns to determine if the @@ -288,31 +376,41 @@ current row is still valid, or is part of a non-committed transaction or superseded by a new row.

-include - include files + +include +- include files

There are include directories for each subsystem.

-lib - support library + +lib +- support library

This houses several generic routines.

-regex - regular expression library + +regex +- regular expression library

This is used for regular expression handling in the backend, i.e. '~'.

-rewrite - rules system + +rewrite +- rules system

This does processing for the rules system.

-tioga - unused (array handling?) + +tioga +- unused (array handling?)


diff --git a/src/tools/flow.fig b/src/tools/backend/flow.fig similarity index 65% rename from src/tools/flow.fig rename to src/tools/backend/flow.fig index f609590fe74..265fb28e089 100644 --- a/src/tools/flow.fig +++ b/src/tools/backend/flow.fig @@ -20,21 +20,8 @@ Inches 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 - 2700 5100 2700 4500 300 4500 300 5100 2700 5100 -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 1500 4500 -2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 - 2700 6300 2700 5700 300 5700 300 6300 2700 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 - 1500 5100 1500 5700 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 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 6 - 0 0 1.00 60.00 120.00 - 1500 6300 1500 6600 3900 6600 3900 4200 5700 4200 5700 4500 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 @@ -50,58 +37,91 @@ Inches 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 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 - 6900 9600 6900 9000 4500 9000 4500 9600 6900 9600 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 9000 + 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 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 - 2700 7500 2700 6900 300 6900 300 7500 2700 7500 -2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 - 2700 8400 2700 7800 300 7800 300 8400 2700 8400 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 9300 3900 9300 3900 6600 + 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 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 - 2700 9300 2700 8700 300 8700 300 9300 2700 9300 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 7200 3300 7200 + 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 - 2700 8100 3300 8100 + 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 - 2700 9000 3300 9000 + 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 195 1710 1500 4905 Initialization\001 -4 1 -1 0 0 28 18 0.0000 4 195 1215 1470 5940 Attach to\001 -4 1 -1 0 0 28 18 0.0000 4 195 2340 1485 6270 Shared Resources\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 1140 5685 9420 Executor\001 -4 1 -1 0 0 28 18 0.0000 4 195 2100 1485 7305 Access Methods\001 -4 1 -1 0 0 28 18 0.0000 4 195 1050 1485 9090 Utilities\001 -4 1 -1 0 0 28 18 0.0000 4 240 2325 1515 8190 Storage Managers\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 @@ -110,3 +130,11 @@ Inches 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 0000000000000000000000000000000000000000..1076af06f425fe342007c70de4a5814e19fd44da GIT binary patch literal 674098 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 W6R5VS1vTwxzWy7h{r&~;@BTMWEYgSo literal 0 Hc-jL100001 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 @@ + + +PostgreSQL Backend Flowchart + + +

+PostgreSQL Backend Flowchart +

+

+by Bruce Momjian +

+
+Click on an item to see more detail. +
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+
+Maintainer: Bruce Momjianmaillist@candle.pha.pa.us)
+Last updated: Mon Oct 27 11:01:08 EST 1997 +
diff --git a/src/tools/flow.gif b/src/tools/flow.gif deleted file mode 100644 index 5d697a39f069ce69ba72e8913949e553a4549c7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 8444 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 -- 2.39.5