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 2b8692d393..0000000000 --- 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 16bd894582..0000000000 --- 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 b10aa2cfc4..0000000000 --- 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 HcmV?d00001 literal 501221 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

H5o`$RtB*%jFd0H|ordEIa#g)?#gAak4t46oDD1 zi{Nx-sNRfKxq;f@rbvmVq3?U-j_w!QR;>R_csdC$9~SkAF59=R_;O$FZ!X?AZT(56 z`S!J3lk0t*Pr&sGhROCeZe3NT5U3KwEg}nd=nZwD&{02^1S%OhGD1qBa^W#6-4n~d z!ENB{%v5xAd$;k12oGuP51^kFO-_VO${-7 zUP^NW5o~Jh#5`y(eBMJ>iZOe%qF_q%3?+0#Y7;caguK3vmXeMo)E;rtKYv!o$&FPn zv%ya%jE>SFQ9698c^e8Zc7)#(!-92Xwb`&{CBK4JRNJ-LPyiAMfp4t{DDj>Q1puBB z!E|^^MO>|ssZiOSy^3F4%XGPUg}fq}%UJNo1D-X(Ijmrv7F(K%XHS7znY)6KE6PXj zjOZX`#&;)2##e@I`REmx#rw3l0dJj4tru1BCmfzN*+L9{Q}N75);My$lyC2iv|OTw zVvlUuMdM19uJ6v(WcXMS3*f8@e&eO2o;Nh@&ymQW3};cCpLyzt^m(Iv6%P zT-ZZjKHi@T`K$n_q-=@bRRS;aNmolFTVghB?Ik3h*=+?}P)f68zKw|#L_t;Jng(T( z^5U9!iKGDR)RVq?hhnMK5m()gvN|*8Nu>mCo%(9u%B@r3T?bQsG!y24$|el5H`3uS zDyOtUiYbr5wBMSMNU1q7l|;FcTPE$Pxe!TWCH`2LY>H-6N(R-e1D)>q9cJIc{Vy=_ zxtfPae91#%?OFFwTFEcEE;Ljjt80RW zG*^zq4;jSd4Q~CfGe;18k$j!mus67CwHM0^hpAUjgpta9#CN!03M1a&Hal1*5Ll<4 zGQ+r(W;jQp2kp7PH_UFwg`)IRUpOpfdOWEWR~n0Ewx=!n%9H)0-e#&Mo@Gh!ICc21rW@NzwwtakT6|@~0Vj4A|7U ziD=*@eQ=Tt*uKNH>9^=Tg&JVX4l3uJB+s2{(QMkHCQ{O%s_>eqXrkNiN}evWUf_*CC* zz0PHYo8>G&{bzi9eKbkpw!3jgRcwye=3C zKtk#>rk>ckIlEz_306p%L)hk+VO(g1;*Iu(&DzaCSjdLWc7KW~Vws_;0#9fK|K{v< zo9P#!)+$i)ZjmPV*@zX?kYdQfpIEF6WYP#(dFC|On(H)LVVy>GNb^KDkn?f`1x!3k zIUvQs2@@bF0;(rKP~b;hECsLq!>-Nwb(?3@HLiz)y-hRfQm*aVjN1B+DB)Q~JYr)G z+#UFmcWwS5LBeg*#@L274C-Y&>7M0agFj`KKc#RvvYb7TaxFT8kVW}SRofBZ`OzSe z6WDC;L;{3-C=@TJ!?GTJ#PGEc$qa9$Ho*^zoQ}q&Na8 z>!JS%3MPVELW}UZ*KKB`3CB*Pc$RUpvh_v&uiG5i&L3MmORFmRDK6OwEeLmh|K=R@ z@sP6K+mtQMQO(j?@Jzr>Ebzu7e>->h`@jFiUFwaDTM*63?=RVZ*Y)cc-f~ENR8WFu z<0&-Pm(@G(`~8!9cVu(3lUz&C_%+&U6YA%|fcB?80Ky)6<3?w9<@Ga77bbqyH(hl! zfvWoc3Mr?z69fixs-86P^X{e};s`nK~$MPmo;L@|%2}O>7 z^)og8)+5wUWNJ9J=puQ76a6o+njnRlr8f;Vp)Hhfn zb#@=y<{p}Ny&(r_2p3EyUES7vjRdtn6pcfk;Yh2inSDH+gK#-TV)sJ z|L&yjeFG`t0sMdUNLk7tcq==`2=H&b-VlG(ct$JBYQkLu!T**qRxrerxJ*m}KOfH@ zzm){HsNQ+$&jD(e0&_di`nT>Zzy1){w#@ZG=TrN_Au@!cv_ioICQjsU%y^UEXL@O;Sct#>_ zgmS0D?GUwDnNDn+043wZg|~Wbu$IOc*m+`JI@CmL5!=`kZ>2G&p%kIGQ5y=axlloB zURq^k@FyakadA)4;e-FL#2CJT6Ra%*XMFV;tJV;PJ#s~8K~Sk4D5Zj_f0TdJ(yYEF zY-uAVJQiC@X1<327Hd+fA&sO=53nelNZH#90)#a+?h^5|8B~=zp1iLrtTuwCWEIy# z&yxzskOhX;8>t>(%_KllKCtkcyNHnKMt^zifaM(=3BHrqR1llGhY&B+B@f+)X+L(!{egI?w zOXP<;pR~DsHpGaqxbrP;ifLKU<_5Mo)Esor%z*9Nz~&Cxij9~xGYCq}K(Y>=iRpbE zib@ZO8}*ICGlXXVK+MjjK+S+RXmbR?41i!x_t57|Kr+|xMnp&a;91(uGQDx*eHr;o z?lx0>gYYbkNvB2*8ExE%WiL32t)U*Tf_dh=;kYB?Ab~mHF0ToWSv{ zzAb1iZAhBpwZcDJDF5*BtO?Fqz|TiJjeqJKXLwdNl<00edtW4~5 z{;{UXyHpRWgQhuSol4P{^fs05vX%s!N??D`TC&SJIdh{M(NL5D!o9s|a;w#mYJ<#+ z0|e}MXKsY&64aI&l4)~aY?>UfPNT>iy-m~T8I{k0rgRnSsHv|q9Ni|ewEkfcgK3mV z3{XExk{UFP5YD6wwplzg=(0{dLoERaZwOJE#dey8!865&9Yx{U0TB*|Q|<5}(*gtq zU~5S$yC{^AOy5<Gg>`y!RJT*j^X#bH3jMU$3+W`N&Xti=H_rHxzfBdesEZkkxD zpJxyK#mRJK!zYNf`r#5qwP*0D@7I#qIQZ1pgq|VwHJM8ru_hpDV{HuekoS$TW8!cj zcp0{|_vibp&cu=5KuL$dZ=f-w!YU7cmY2ITDdOx-`e7g-9y{cHd}9ti%2<1U%pn9z zgvpmJVq_X?ZSJ@5K;sC+nHT}fD^uzdd33RJ2MTnepJRM4?^{O17mt2o&#eXG&EwYqSExS@xIGK zJ!N_Fm=C0ogn2L1CiCPy7Y*CRM*WbwF>c|j|I_Z=pVCf?vB*YFkFUPoSpx{+ZcDb_ z@rI1^$Z#=V{jiBW-yJ@_Y~4Vxdt*wB8++%H4~L0oLPzkP;bj8>n^C9F4P!-?eHkyc z^0k`%D+7!`8s(8N=YF(ZEweuL`qrEGJIXYrm;!t9H)O+BmFz5v@X%^ zjcDr|&}wY`M$_Y3(QG3mN{~jRzLKwMzzFSF6bY;Y%^Eq7oLMWBlu4j_0WC%&Au*u$ zi~fu)N?V6R*WRM;jY?B$kV^Zj!BQ#If>b~#7(M`oyQwp5T*@B-&+>;&{+7Zh4YyKF z_#Mc!wJ&Xc+1{^|EGumzSWgrko)Prek>wOwFmt2@Hj*y!7`kEGGvZ6CC(DBT ze+Q)P?^N$4fO%z0ZlV9bJfY{8mBxP8JXIN|q&%xmowy7=2HzKQc_&@-*X*^S7=}s`h6M)2-ZVJw% zM{e691@rNNlu&pUXd!Pk3eJ41LGZij#iPw^g8BGXi#eX9FfQAt4g5Or%r}jCJD4%j zf;RKNYTVD%Im1tGfB5#SO?_D_D%}WL;nKyCPd|-rt3mLq&YDkiibLy2i{#6^6rldZM;l6y`r$i>R-?y~o|wp+U61;_ z;fdZHQa@4;=9^z~AyN@##}9d5)-(xqL$IS^OFra%Y*P(FLess!Bd(2Ry83ageY_Q~ z80JZPwjr%8Y6qz>6A?u@6vQy|78yNDo2iBdEdpuJ`nd-+)7E}PXZ&F&9L`GMj}v#9 zDaN1!zb{S8dy#nHf67b`Xjr%5Vua&4oJOH%2>kK4MM=7=GwnNuJVJT+`jY&M_-IFn zXGz=1bq;|)c0LE0ZKZd;{-w71U7i=J(5Qz$dmp2*NLIMPF!($_xTVcvb$N^uAqKN;X1&R*ZV_SeR>rzL9Okn=&fm+u;$Sl8iB$2aXma z$84Z+8}1`42s6W;RRm!8&Ef~QkXUPZuQI-LxnN0aMaoUvyD9C3OXI)-d(kb8k1tvy z;#*m~%5NJNBt{x14k?^ji?L%v+tplU;6ZBUm9#k1KCXCE1VSV&3J0P}53vwS&ZNb? zjmm=Ex@%K)N9Z8=7xCT>*vB3-)cIYcvFs9!TNwD076(-DBZaP{g(~O`zm17!b%Wl) z1G85A#vc4D1|r!<)U6}sEpF5|2>eN7!*Lx3e$Fta;ThPyYTI}uc-Dk}Q@|fnJahiT zX$%7J4>V8A$Jsul;H(zs$J(D4FKANSV2~d|cm@Q*XQ%zn%$B?LZQ57twfV^_;n*vi zd{^v<8_iR|%?<>Yp+_D5>QDxMh(+Sy83*$mO=5#Tgl8iB!9vhOER>9ol4`-rI}X>M zKCtYi9K@{n%IcSI|9S1v`qQuc_rBYIUJX`!`O32I2f$s2*PK4^-&eb)S0AcN`{9z8 z;H|^;ClCDhh0|Mer#(L6B{-a@KHLHu?|rZp-a2jd{^g(CD_>o6GVAaAZl4O!6m~xv z1^WImYMX0n^`Yk9bSz5`OrwckVrZ7V)b>jaVO~)%^`Ya1Z8f43DY_nPmp|Ppt5F5~ zE5F*-$0Fz%vE6uFw@kW8;qLLmU-jKuHT7`ct?2-ss8-d~X(R8cni>F}o2MQIUfAcb z5z`O%t-RR{PukP$bleJlyyG)@fm&;3+2onMm%6 zLKtB&w&=zmj1PBg@0JY+r)m4e$gdJzZmpmqy9yDq38N2p+&Hy<$=2$=eK}H1Qo1`f zz3F#E*Y`CSNEHi5Tb?M3L!yXXv8KNi5ep-<$-%V6Gv6BZ?_G+pj1K-t<+X7k=ikrV zC=rZ}O_(!6vy1*>(NkE{L&AUYa%^atEGvw)ko^e8{@)A43_NQUPZPaK;FmR!CgIE{ z9s<9zjm^Mw(`0S?v$BMG@9u&FhrloUsgNiOI9$$S0ePhaaFz^qi4wOu@DfNxkwvu_ zDrU^`DTDY(XSS01gbqvm3r|l>2ol+>PMESvWw1)=g&!aAD;Qyc*(sY`#-`=Q&2;+c z!vkC&JvnApr<4(5-DgB#h%_N(4J%g;KVZ_7h5ai&BJ5BK9&ebCwui4VsYGmObY-VC zWq;5Y!(r2f2-G*g>R$cPO{tGuB*7yt10XO-$ZEF*V#M&gcbRNphhp8EVM zl2w*tPCxpA_MG~7KS*g2xA%|6wJ~&Kd&&W!Gx?Y6{dpQ#738jurpZV{CwrjWHCt#1 zSqA)4;&+3nT?1$m{l$sO(1ITEZH&Kufu4KR=ea7=)o(ueAKtTCsazSW;w2Z78Z zfkR>-UYH(fs`_NOo4KW(e>N9dv*XEE)wlQ>HFkvD|Jcr=i)t>iiW8R_K zF&*tG&?x)c^EwLhI^elIWnW|7fyTTy8%gxv`e0UREovak6~HmsA~1U_g5AMXJR@w= z80Me5T`T-Kj}^G~L9|Ec6+WCvq%fshceV!DaQKmIn1JUU`2q*Xidw6|I?&KO@He`` z?MiPm=uB@d5{7pXY$tRM(XCs;Aq}e-{;h{R7U0Wz zywV!O@y;^G}jE+AYLs^@@$o_cTB@iP+2OQIhpltcxJAU_yn6dDz7z{-$~LrpnVl5(x)Zaw%Gxf7Yc7MS*U@p zKJS_Ko4%DyKI&V`(PQ;jR+x{9Y!|rM8kp9DhyzJq^l+)D46%d=(|)U%0&9TDFH}vF zn3oopyD>cgr6*zM=T+`Nr{P&<=|CovQkb%~;2m?qZGO?;YQ(<@(bu8h_os;Rz68m) zGjIYpowc&bqe7LHlj-!+0*_JxtB@~kcDy&Z@uSiLqw$9=n2#e`I&eJCCg0Y=CSWWD zKRORH%AqFg1>UXIye32%MO*H;XXIPfX^7TB(3!k;P``wM;-;x9;4mI4NnV@RJhO5% zUv?bdONHLTL$pQ)?XjYxXP^w1A74H3s?o<6%%8F2scozHO;WlWqxa)LI5&)8QbN$f zo-J@JUb8aWxR>)W%tNI#U-PWUDB)^cc2M80S8Tb4GT_G1M_hsF%?0UqOtb+?BMU*9 z6?kUs;58v%kPq$t&eiZ+pYL%$p8~(&*~+*8Aa8VU^Sv2#{n8gQ<#xw$$)nTpOP}Et zmcnaxdALfB(wn73uUAE^eR3tUV%~3H&8|J2X?r_W3=vUnJ`;>J=&Ch_+eit{q0fCG zsJ)7A97ww@|ZF2*RA^JSdQGP~SddYl9FLAyA3#jvU=c$IYQ|w+KuoTZC z3_TZFgn{6Pix#R1wSoZqzzxCdJl`2w)ol>)&;;HL2o@TXA9OlL!8Yo2 zLW}eTod`#n&R6_MR+@&p%ej&6=ZHV?F&usm*9*<6!O1kd2&6PU9DWY^!|VJ6f_l62 z_mI-3{w`%&hqjWvlh?3yefO~Y=!hmg{)4P2+0l>aFtHfEIWJj z=|$#bI<{lQtLkFy?l@(eV`fqvA7=qQp7NCM|% zL|C)Gf7OrbxXX}OO#M=tJ>n;vsPr||$I}6d#$ASPV6{k=4Hk8X`0}c!A=0EA9vo#(odu^u+)n!`S|lZ-T)mf@&fxrBIUpgUl|dmffy5yqJf#^Kkj5f}T2Hnh z16T@b2*PM)c^DwaKo>+nfETpqe!WqQ*;DX>@>0u4F{L@sGwNM$%Z#1vj@8BUMjO#g zzRo~qlw|)Dn1EN2SkeRLr!=Get$z!(D0RZ%O!K7KGLNc1hRy(mIDcz5UMREvm)N%p}0C*@du_ zwD=4>6#b^=v_&i?QDdOFioH}-lBQS3vzh>ciDbcVJf4%5U`i$|r7Mpe1F&fV_%GV; z#?&*mWC(X;qjT2S_taCSe-hhxIRnG}2shA-Nf_n`e*1NtP? zIn!K)4gnJu-BREeu}CmHiyW3}zg5%&T0=2Mk}Y5=⋘}Me9%RJAL)?pZf}_YNaSA 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 - - - - -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.40.0