postgresql/src/backend/parser
Robert Haas 2ad36c4e44 Improve table locking behavior in the face of current DDL.
In the previous coding, callers were faced with an awkward choice:
look up the name, do permissions checks, and then lock the table; or
look up the name, lock the table, and then do permissions checks.
The first choice was wrong because the results of the name lookup
and permissions checks might be out-of-date by the time the table
lock was acquired, while the second allowed a user with no privileges
to interfere with access to a table by users who do have privileges
(e.g. if a malicious backend queues up for an AccessExclusiveLock on
a table on which AccessShareLock is already held, further attempts
to access the table will be blocked until the AccessExclusiveLock
is obtained and the malicious backend's transaction rolls back).

To fix, allow callers of RangeVarGetRelid() to pass a callback which
gets executed after performing the name lookup but before acquiring
the relation lock.  If the name lookup is retried (because
invalidation messages are received), the callback will be re-executed
as well, so we get the best of both worlds.  RangeVarGetRelid() is
renamed to RangeVarGetRelidExtended(); callers not wishing to supply
a callback can continue to invoke it as RangeVarGetRelid(), which is
now a macro.  Since the only one caller that uses nowait = true now
passes a callback anyway, the RangeVarGetRelid() macro defaults nowait
as well.  The callback can also be used for supplemental locking - for
example, REINDEX INDEX needs to acquire the table lock before the index
lock to reduce deadlock possibilities.

There's a lot more work to be done here to fix all the cases where this
can be a problem, but this commit provides the general infrastructure
and fixes the following specific cases: REINDEX INDEX, REINDEX TABLE,
LOCK TABLE, and and DROP TABLE/INDEX/SEQUENCE/VIEW/FOREIGN TABLE.

Per discussion with Noah Misch and Alvaro Herrera.
2011-11-30 10:27:00 -05:00
..
.gitignore Convert cvsignore to gitignore, and add .gitignore for build targets. 2010-09-22 12:57:04 +02:00
analyze.c Fix unsupported options in CREATE TABLE ... AS EXECUTE. 2011-11-24 23:21:45 -05:00
gram.y Fix unsupported options in CREATE TABLE ... AS EXECUTE. 2011-11-24 23:21:45 -05:00
keywords.c Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
kwlookup.c Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
Makefile Add makefile rules to check for backtracking in backend and psql lexers. 2011-08-25 14:44:17 -04:00
parse_agg.c Remove unnecessary #include references, per pgrminclude script. 2011-09-01 10:04:27 -04:00
parse_clause.c Clean up the #include mess a little. 2011-09-04 01:13:16 -04:00
parse_coerce.c Further code review for range types patch. 2011-11-20 23:50:27 -05:00
parse_collate.c pgindent run before PG 9.1 beta 1. 2011-04-10 11:42:00 -04:00
parse_cte.c Make a code-cleanup pass over the collations patch. 2011-04-22 17:43:18 -04:00
parse_expr.c Ensure that whole-row junk Vars are always of composite type. 2011-11-27 22:27:24 -05:00
parse_func.c Extend the unknowns-are-same-as-known-inputs type resolution heuristic. 2011-11-17 18:28:41 -05:00
parse_node.c Move Timestamp/Interval typedefs and basic macros into datatype/timestamp.h. 2011-09-09 13:23:41 -04:00
parse_oper.c Remove unnecessary #include references, per pgrminclude script. 2011-09-01 10:04:27 -04:00
parse_param.c pgindent run before PG 9.1 beta 1. 2011-04-10 11:42:00 -04:00
parse_relation.c Improve table locking behavior in the face of current DDL. 2011-11-30 10:27:00 -05:00
parse_target.c Improve generated column names for cases involving sub-SELECTs. 2011-10-01 14:01:46 -04:00
parse_type.c Improve table locking behavior in the face of current DDL. 2011-11-30 10:27:00 -05:00
parse_utilcmd.c Remove unnecessary #include references, per pgrminclude script. 2011-09-01 10:04:27 -04:00
parser.c Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
README Revise collation derivation method and expression-tree representation. 2011-03-19 20:30:08 -04:00
scan.l Add makefile rules to check for backtracking in backend and psql lexers. 2011-08-25 14:44:17 -04:00
scansup.c Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00

src/backend/parser/README

Parser
======

This directory does more than tokenize and parse SQL queries.  It also
creates Query structures for the various complex queries that are passed
to the optimizer and then executor.

parser.c	things start here
scan.l		break query into tokens
scansup.c	handle escapes in input strings
kwlookup.c	turn keywords into specific tokens
keywords.c	table of standard keywords (passed to kwlookup.c)
gram.y		parse the tokens and produce a "raw" parse tree
analyze.c	top level of parse analysis for optimizable queries
parse_agg.c	handle aggregates, like SUM(col1),  AVG(col2), ...
parse_clause.c	handle clauses like WHERE, ORDER BY, GROUP BY, ...
parse_coerce.c	handle coercing expressions to different data types
parse_collate.c	assign collation information in completed expressions
parse_cte.c	handle Common Table Expressions (WITH clauses)
parse_expr.c	handle expressions like col, col + 3, x = 3 or x = 4
parse_func.c	handle functions, table.column and column identifiers
parse_node.c	create nodes for various structures
parse_oper.c	handle operators in expressions
parse_param.c	handle Params (for the cases used in the core backend)
parse_relation.c support routines for tables and column handling
parse_target.c	handle the result list of the query
parse_type.c	support routines for data type handling
parse_utilcmd.c	parse analysis for utility commands (done at execution time)