From 63f1ccd838a19e4a0923221b2f90e4e014cabf74 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 4 Sep 2012 12:38:33 -0400 Subject: [PATCH] Remove src/tool/backend, now that the content is on the web site and wiki. --- src/tools/backend/README | 4 - src/tools/backend/backend_dirs.html | 349 ---------------------------- src/tools/backend/flow.fig | 143 ------------ src/tools/backend/flow.gif | Bin 501221 -> 0 bytes src/tools/backend/index.html | 155 ------------ 5 files changed, 651 deletions(-) delete mode 100644 src/tools/backend/README delete mode 100644 src/tools/backend/backend_dirs.html delete mode 100644 src/tools/backend/flow.fig delete mode 100644 src/tools/backend/flow.gif delete mode 100644 src/tools/backend/index.html diff --git a/src/tools/backend/README b/src/tools/backend/README deleted file mode 100644 index 2b8692d3939..00000000000 --- a/src/tools/backend/README +++ /dev/null @@ -1,4 +0,0 @@ -src/tools/backend/README - -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 deleted file mode 100644 index 16bd894582e..00000000000 --- a/src/tools/backend/backend_dirs.html +++ /dev/null @@ -1,349 +0,0 @@ - - - - -PostgreSQL Backend Directories - - -

PostgreSQL Backend Directories

- -

by Bruce Momjian

- -
-

Click on any of the section headings to see the source code -for that section.

- -

bootstrap - creates initial -template database via initdb

- -

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 jams the data directly -into tables using a special syntax used only by the bootstrap -procedure.

- -

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

- -

This creates shared memory, and then goes into a loop waiting -for connection requests. When a connection request arrives, a -postgres backend is started, and the connection is passed to -it.

- -

libpq - backend libpq library -routines

- -

This handles communication to the client processes.

- -

tcop - traffic cop, dispatches -request to proper module

- -

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

- -

parser - converts SQL query to -query tree

- -

This converts SQL queries coming from libpq into -command-specific structures to be used the optimizer/executor, -or /commands 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 /commands processing routines, or -converted into Lists of Nodes to be handled by the -optimizer and executor.

- -

rewrite - rule and views -support

- -

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

- -

This takes the parser query output, and generates all possible -methods of executing the request. It examines table join order, -where clause restrictions, and optimizer table statistics to -evaluate each possible execution method, and assigns a cost to -each.

- -

optimizer/geqo - genetic -query optimizer

- -

optimizer/path 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.

- -

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

- -

This does special plan processing.

- -

optimizer/util - optimizer -support routines

- -

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

- -

executor - executes complex node -plans from optimizer

- -

This handles select, insert, update, and delete -statements. The operations required to handle these statement types -include heap scans, index scans, sorting, joining tables, grouping, -aggregates, and uniqueness.

- -

commands - commands that do not -require the executor

- -

These process SQL commands that do not require complex handling. -It includes vacuum, copy, alter, create table, create type, -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.

- -

catalog - system catalog -manipulation

- -

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.

- -

storage - manages various storage -systems

- -

These allow uniform resource access by the backend.
-
- storage/buffer - shared -buffer pool manager
- storage/file - file -manager
- storage/freespace - free -space map
- storage/ipc - semaphores and -shared memory
- storage/large_object -- large objects
- storage/lmgr - lock -manager
- storage/page - page -manager
- storage/smgr - storage/disk -manager
-
-

- -

access - various data access -methods

- -

These control the way data is accessed in heap, indexes, and -transactions.
-
- access/common - common -access routines
- access/gist - easy-to-define -access method system
- access/hash - hash
- access/heap - heap is use to -store data rows
- access/index - used by all -index types
- access/nbtree - Lehman and -Yao's btree management algorithm
- access/transam - -transaction manager (BEGIN/ABORT/COMMIT)
-
-

- -

nodes - creation/manipulation of -nodes and lists

- -

PostgreSQL stores information about SQL queries in structures -called nodes. Nodes are generic containers that have a -type field and then a type-specific data section. Nodes are -usually placed in Lists. A List is container with an -elem element, and a next field that points to the -next List. These List structures are chained together -in a forward linked list. In this way, a chain of List s can -contain an unlimited number of Node elements, and each -Node can contain any data type. These are used extensively -in the parser, optimizer, and executor to store requests and -data.

- -

utils - support routines

- -

utils/adt - built-in data type -routines

- -

This contains all the PostgreSQL builtin data types.

- -

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

- -

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.

- -

utils/error - error reporting -routines

- -

Reports backend errors to the front end.

- -

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

- -

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.

- -

utils/init - various -initialization stuff

- -

utils/mb - single and multibyte -encoding

- -

utils/misc - miscellaneous -stuff

- -

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

- -

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.

- -

utils/resowner - resource -owner tracking

- -

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

- -

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.

- -

include - include files

- -

There are include directories for each subsystem.

- -

lib -- support library

- -

This houses several generic routines.

- -

regex - regular expression -library

- -

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

- -

port - compatibility routines

- -
- -
-Maintainer: Bruce Momjian ( pgman@candle.pha.pa.us -)
- Last updated: Fri May 6 14:22:27 EDT 2005
- - diff --git a/src/tools/backend/flow.fig b/src/tools/backend/flow.fig deleted file mode 100644 index b10aa2cfc48..00000000000 --- a/src/tools/backend/flow.fig +++ /dev/null @@ -1,143 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5 -Portrait -Center -Inches -Letter -88.00 -Single --2 -1200 2 -0 32 #919191 -0 33 #c5ddc1 -2 4 0 1 -1 26 1 0 20 0.000 0 0 7 0 0 5 - 3600 900 1200 900 1200 300 3600 300 3600 900 -2 4 0 1 -1 4 1 0 20 0.000 0 0 7 0 0 5 - 3600 2100 1200 2100 1200 1500 3600 1500 3600 2100 -2 4 0 1 -1 0 1 0 20 0.000 0 0 7 0 0 5 - 7500 1500 5100 1500 5100 900 7500 900 7500 1500 -2 4 0 1 -1 31 1 0 20 0.000 0 0 7 0 0 5 - 3600 3300 1200 3300 1200 2700 3600 2700 3600 3300 -2 4 0 1 -1 8 1 0 20 0.000 0 0 7 0 0 5 - 3600 6000 1200 6000 1200 5400 3600 5400 3600 6000 -2 4 0 1 -1 31 1 0 20 0.000 0 0 7 0 0 5 - 7500 3300 5100 3300 5100 2700 7500 2700 7500 3300 -2 4 0 1 -1 8 1 0 20 0.000 0 0 7 0 0 5 - 3600 8400 1200 8400 1200 7800 3600 7800 3600 8400 -2 4 0 1 -1 8 1 0 20 0.000 0 0 7 0 0 5 - 3600 9600 1200 9600 1200 9000 3600 9000 3600 9600 -2 1 2 2 -1 7 0 0 -1 3.000 0 1 -1 1 1 2 - 0 0 2.00 80.00 150.00 - 0 0 2.00 80.00 150.00 - 4500 1425 5135 1194 -2 1 2 2 -1 7 0 0 -1 4.000 0 1 -1 1 1 2 - 0 0 2.00 80.00 150.00 - 0 0 2.00 80.00 150.00 - 4725 2025 5160 1467 -2 1 0 2 20 7 1 0 -1 0.000 0 0 -1 1 0 2 - 0 0 2.00 150.00 180.00 - 2400 2100 2400 2700 -2 1 0 2 31 7 1 0 -1 0.000 0 0 -1 1 0 2 - 0 0 2.00 150.00 180.00 - 2400 3300 2400 4275 -2 4 0 1 -1 8 1 0 20 0.000 0 0 7 0 0 5 - 3600 7200 1200 7200 1200 6600 3600 6600 3600 7200 -2 4 0 1 -1 8 1 0 20 0.000 0 0 7 0 0 5 - 3600 10800 1200 10800 1200 10200 3600 10200 3600 10800 -2 4 0 1 -1 8 1 0 20 0.000 0 0 7 0 0 5 - 3600 4800 1200 4800 1200 4200 3600 4200 3600 4800 -2 1 1 2 32 7 1 0 -1 4.000 0 0 -1 1 0 2 - 0 0 2.00 150.00 180.00 - 2400 8400 2400 9000 -2 1 1 2 32 7 1 0 -1 4.000 0 0 -1 1 0 2 - 0 0 2.00 150.00 180.00 - 2400 7200 2400 7800 -2 1 1 2 32 7 1 0 -1 4.000 0 0 -1 1 0 2 - 0 0 2.00 150.00 180.00 - 2400 6000 2400 6600 -2 1 1 2 32 7 1 0 -1 4.000 0 0 -1 1 0 2 - 0 0 2.00 150.00 180.00 - 2400 4800 2400 5400 -2 1 1 2 32 7 1 0 -1 4.000 0 0 -1 1 0 2 - 0 0 2.00 150.00 180.00 - 3600 5700 5100 5700 -2 1 0 2 25 7 0 0 -1 0.000 0 0 -1 1 0 2 - 0 0 2.00 150.00 180.50 - 2400 900 2400 1500 -2 4 0 1 -1 8 1 0 20 0.000 0 0 7 0 0 5 - 7500 6000 5100 6000 5100 5400 7500 5400 7500 6000 -2 4 0 1 33 33 3 0 20 0.000 0 0 40 0 0 5 - 8700 11100 300 11100 300 3600 8700 3600 8700 11100 -2 1 0 2 29 7 0 0 -1 0.000 0 0 -1 1 1 2 - 0 0 2.00 150.00 180.00 - 0 0 2.00 150.00 180.00 - 3150 13050 3150 13650 -2 1 0 2 29 7 0 0 -1 0.000 0 0 -1 1 1 2 - 0 0 2.00 150.00 180.00 - 0 0 2.00 150.00 180.00 - 1500 12450 1500 11850 -2 4 0 1 -1 29 1 0 20 0.000 0 0 7 0 0 5 - 2700 13050 300 13050 300 12450 2700 12450 2700 13050 -2 4 0 1 -1 29 1 0 20 0.000 0 0 7 0 0 5 - 6000 13050 3600 13050 3600 12450 6000 12450 6000 13050 -2 4 0 1 -1 29 1 0 20 0.000 0 0 7 0 0 5 - 7500 14250 5100 14250 5100 13650 7500 13650 7500 14250 -2 4 0 1 -1 29 1 0 20 0.000 0 0 7 0 0 5 - 4200 14250 1800 14250 1800 13650 4200 13650 4200 14250 -2 1 0 2 29 7 0 0 -1 0.000 0 0 -1 1 1 2 - 0 0 2.00 150.00 180.00 - 0 0 2.00 150.00 180.00 - 4800 12450 4800 11850 -2 1 0 2 29 7 0 0 -1 0.000 0 0 -1 1 1 2 - 0 0 2.00 150.00 180.00 - 0 0 2.00 150.00 180.00 - 6300 13050 6300 13650 -2 4 0 1 -1 29 1 0 20 0.000 0 0 7 0 0 5 - 9300 13050 6600 13050 6600 12450 9300 12450 9300 13050 -2 1 0 2 29 7 0 0 -1 0.000 0 0 -1 1 1 2 - 0 0 2.00 150.00 180.00 - 0 0 2.00 150.00 180.00 - 7950 11850 7950 12450 -2 1 1 2 5 7 1 0 -1 4.000 0 0 -1 1 0 2 - 0 0 2.00 150.00 180.00 - 2400 6000 2400 6600 -2 1 1 2 32 7 1 0 -1 4.000 0 0 -1 1 0 2 - 0 0 2.00 150.00 180.00 - 2400 9600 2400 10200 -3 2 2 2 20 7 0 0 -1 6.000 1 1 0 5 - 0 0 2.00 150.00 180.00 - 2415 2140 3090 2440 5265 2515 6090 2590 6315 2740 - 0.000 -1.000 -1.000 -1.000 0.000 -3 0 1 2 32 7 1 0 -1 4.500 0 1 0 7 - 0 0 2.00 150.00 150.00 - 7500 5700 8400 5400 8400 4500 7800 3900 3600 3900 3000 3900 - 2700 4200 - 0.000 1.000 1.000 1.000 1.000 1.000 0.000 -3 0 1 2 32 7 0 0 -1 4.000 0 1 0 8 - 0 0 2.00 150.00 150.00 - 1125 10500 900 10350 675 9975 675 4350 900 3975 1350 3900 - 1800 3900 2100 4200 - 0.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000 -4 1 5 2 0 28 18 0.0000 4 285 870 4350 5625 utility\001 -4 1 -1 0 0 16 18 0.0000 4 210 1455 2400 1950 Postmaster\001 -4 1 -1 0 0 16 18 0.0000 4 270 1125 2400 3150 Postgres\001 -4 1 -1 0 0 16 18 0.0000 4 270 1125 6300 3150 Postgres\001 -4 1 7 0 0 16 18 0.0000 4 270 720 6300 1350 Libpq\001 -4 1 -1 0 0 16 18 0.0000 4 210 615 2400 750 Main\001 -4 1 7 0 0 16 18 0.0000 4 210 1815 2400 9450 Generate Plan\001 -4 1 7 0 0 16 18 0.0000 4 270 1440 2400 5850 Traffic Cop\001 -4 1 7 0 0 16 18 0.0000 4 210 1980 2400 8250 Generate Paths\001 -4 1 5 2 0 28 18 0.0000 4 225 615 2400 9900 Plan\001 -4 1 5 2 0 28 18 0.0000 4 285 1920 2400 8700 Optimal Path\001 -4 1 5 2 0 28 18 0.0000 4 285 900 2400 6300 Query\001 -4 1 7 0 0 16 18 0.0000 4 210 1680 2400 10650 Execute Plan\001 -4 0 5 0 0 16 12 0.0000 4 210 2640 5250 6300 e.g. CREATE TABLE, COPY\001 -4 1 5 0 0 16 12 0.0000 4 195 3540 2400 6525 SELECT, INSERT, UPDATE, DELETE\001 -4 1 7 0 0 16 18 0.0000 4 270 1800 2400 7050 Rewrite Query\001 -4 1 7 0 0 16 18 0.0000 4 210 2130 2400 4650 Parse Statement\001 -4 1 7 0 0 16 18 0.0000 4 270 720 6300 5700 Utility\001 -4 1 7 0 0 16 18 0.0000 4 210 1335 6300 6000 Command\001 -4 1 -1 0 0 16 18 0.0000 4 270 2355 7950 12900 Storage Managers\001 -4 1 -1 0 0 16 18 0.0000 4 270 1020 4800 12900 Catalog\001 -4 1 -1 0 0 16 18 0.0000 4 210 915 1500 12900 Utilities\001 -4 1 -1 0 0 16 18 0.0000 4 210 2085 3000 14100 Access Methods\001 -4 1 -1 0 0 16 18 0.0000 4 210 1635 6300 14100 Nodes / Lists\001 diff --git a/src/tools/backend/flow.gif b/src/tools/backend/flow.gif deleted file mode 100644 index e0cd8db9b193c7667e00131fa3f3847af97daa14..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 501221 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 LYEPR+EKdFZHE - - - - -How PostgreSQL Processes a Query - - -

How PostgreSQL Processes a Query

- -

by Bruce Momjian

- -
-

Click on an item to see more detail or look at the full -index.

- -

flowchart - - -main -libpq -postmaster -tcop -tcop -parser -tcop -commands -rewrite -path -plan -executor -utils -catalog -storage -access -nodes - -

- -
- -

A query comes to the backend via data packets arriving through -TCP/IP or Unix Domain sockets. It is loaded into a string, and -passed to the parser, where the -lexical scanner, scan.l, -breaks the query up into tokens(words). The parser uses gram.y and the tokens to -identify the query type, and load the proper query-specific -structure, like CreateStmt or SelectStmt.

- -

The statement is then identified as complex (SELECT / INSERT / -UPDATE / DELETE) or a simple, e.g CREATE USER, ANALYZE, , -etc. Simple utility commands are processed by statement-specific -functions in backend/commands. -Complex statements require more handling.

- -

The parser takes a complex query, and creates a Query structure that -contains all the elements used by complex queries. Query.qual holds -the WHERE clause qualification, which is filled in by transformWhereClause(). -Each table referenced in the query is represented by a RangeTableEntry, and -they are linked together to form the range table of the -query, which is generated by transformFromClause(). -Query.rtable holds the query's range table.

- -

Certain queries, like SELECT, return columns of data. -Other queries, like INSERT and UPDATE, specify the -columns modified by the query. These column references are -converted to TargetEntry entries, -which are linked together to make up the target list of the -query. The target list is stored in Query.targetList, which is -generated by transformTargetList().

- -

Other query elements, like aggregates(SUM()), GROUP -BY, and ORDER BY are also stored in their own Query -fields.

- -

The next step is for the Query to be modified by any -VIEWS or RULES that may apply to the query. This is -performed by the rewrite -system.

- -

The optimizer takes the -Query structure and generates an optimal Plan, which contains the -operations to be performed to execute the query. The path module determines the -best table join order and join type of each table in the -RangeTable, using Query.qual(WHERE clause) to consider -optimal index usage.

- -

The Plan is then passed to the executor for execution, and the -result returned to the client. The Plan is actually as set of nodes, -arranged in a tree structure with a top-level node, and various -sub-nodes as children.

- -

There are many other modules that support this basic -functionality. They can be accessed by clicking on the -flowchart.

- -
-

Another area of interest is the shared memory area, which -contains data accessible to all backends. It has recently used -data/index blocks, locks, backend process information, and lookup -tables for these structures:

- -
    -
  • ShmemIndex - lookup shared memory addresses using structure -names
  • - -
  • Buffer -Descriptor - control header for buffer cache block
  • - -
  • Buffer -Block - data/index buffer cache block
  • - -
  • Shared Buffer Lookup Table - lookup of buffer cache block -addresses using table name and block number( BufferTag)
  • - -
  • Lock Manager Tables (lock hash) - the LOCK structure, looked up -using a LOCKTAG. -A LOCK structure exists for each lockable object that is currently -locked by any backend. Also, there is a subsidiary PROCLOCK structure for each -backend currently interested in a given LOCK
  • - -
  • PGPROC Structures - -information about each backend, including locks held/waiting
  • -
- -

Each data structure is created by calling ShmemInitStruct(), and -the lookups are created by ShmemInitHash().

- -
-Maintainer: Bruce Momjian (pgman@candle.pha.pa.us)
- -Last updated: Fri May 6 14:22:27 EDT 2005
- - -- 2.39.5