postgresql/src/backend/parser
Tom Lane 4be058fe9e In the planner, replace an empty FROM clause with a dummy RTE.
The fact that "SELECT expression" has no base relations has long been a
thorn in the side of the planner.  It makes it hard to flatten a sub-query
that looks like that, or is a trivial VALUES() item, because the planner
generally uses relid sets to identify sub-relations, and such a sub-query
would have an empty relid set if we flattened it.  prepjointree.c contains
some baroque logic that works around this in certain special cases --- but
there is a much better answer.  We can replace an empty FROM clause with a
dummy RTE that acts like a table of one row and no columns, and then there
are no such corner cases to worry about.  Instead we need some logic to
get rid of useless dummy RTEs, but that's simpler and covers more cases
than what was there before.

For really trivial cases, where the query is just "SELECT expression" and
nothing else, there's a hazard that adding the extra RTE makes for a
noticeable slowdown; even though it's not much processing, there's not
that much for the planner to do overall.  However testing says that the
penalty is very small, close to the noise level.  In more complex queries,
this is able to find optimizations that we could not find before.

The new RTE type is called RTE_RESULT, since the "scan" plan type it
gives rise to is a Result node (the same plan we produced for a "SELECT
expression" query before).  To avoid confusion, rename the old ResultPath
path type to GroupResultPath, reflecting that it's only used in degenerate
grouping cases where we know the query produces just one grouped row.
(It wouldn't work to unify the two cases, because there are different
rules about where the associated quals live during query_planner.)

Note: although this touches readfuncs.c, I don't think a catversion
bump is required, because the added case can't occur in stored rules,
only plans.

Patch by me, reviewed by David Rowley and Mark Dilger

Discussion: https://postgr.es/m/15944.1521127664@sss.pgh.pa.us
2019-01-28 17:54:23 -05:00
..
.gitignore Convert cvsignore to gitignore, and add .gitignore for build targets. 2010-09-22 12:57:04 +02:00
analyze.c In the planner, replace an empty FROM clause with a dummy RTE. 2019-01-28 17:54:23 -05:00
check_keywords.pl Update copyright for 2019 2019-01-02 12:44:25 -05:00
gram.y Allow generalized expression syntax for partition bounds 2019-01-25 11:28:49 +01:00
Makefile Revert MERGE patch 2018-04-12 11:22:56 +01:00
parse_agg.c Allow generalized expression syntax for partition bounds 2019-01-25 11:28:49 +01:00
parse_clause.c Replace uses of heap_open et al with the corresponding table_* function. 2019-01-21 10:51:37 -08:00
parse_coerce.c Update copyright for 2019 2019-01-02 12:44:25 -05:00
parse_collate.c Update copyright for 2019 2019-01-02 12:44:25 -05:00
parse_cte.c Update copyright for 2019 2019-01-02 12:44:25 -05:00
parse_enr.c Update copyright for 2019 2019-01-02 12:44:25 -05:00
parse_expr.c Allow generalized expression syntax for partition bounds 2019-01-25 11:28:49 +01:00
parse_func.c Allow generalized expression syntax for partition bounds 2019-01-25 11:28:49 +01:00
parse_node.c Replace uses of heap_open et al with the corresponding table_* function. 2019-01-21 10:51:37 -08:00
parse_oper.c Update copyright for 2019 2019-01-02 12:44:25 -05:00
parse_param.c Update copyright for 2019 2019-01-02 12:44:25 -05:00
parse_relation.c In the planner, replace an empty FROM clause with a dummy RTE. 2019-01-28 17:54:23 -05:00
parse_target.c In the planner, replace an empty FROM clause with a dummy RTE. 2019-01-28 17:54:23 -05:00
parse_type.c Update copyright for 2019 2019-01-02 12:44:25 -05:00
parse_utilcmd.c Allow generalized expression syntax for partition bounds 2019-01-25 11:28:49 +01:00
parser.c Replace the data structure used for keyword lookup. 2019-01-06 17:02:57 -05:00
README Move keywords.c/kwlookup.c into src/common/. 2016-03-23 20:22:08 -04:00
scan.l Replace the data structure used for keyword lookup. 2019-01-06 17:02:57 -05:00
scansup.c Update copyright for 2019 2019-01-02 12:44:25 -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
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)

See also src/common/keywords.c, which contains the table of standard
keywords and the keyword lookup function.  We separated that out because
various frontend code wants to use it too.