postgresql/src/backend/parser
Tom Lane 14a158f9bf Fix interaction of CASE and ArrayCoerceExpr.
An array-type coercion appearing within a CASE that has a constant
(after const-folding) test expression was mangled by the planner, causing
all the elements of the resulting array to be equal to the coerced value
of the CASE's test expression.  This is my oversight in commit c12d570fa:
that changed ArrayCoerceExpr to use a subexpression involving a
CaseTestExpr, and I didn't notice that eval_const_expressions needed an
adjustment to keep from folding such a CaseTestExpr to a constant when
it's inside a suitable CASE.

This is another in what's getting to be a depressingly long line of bugs
associated with misidentification of the referent of a CaseTestExpr.
We're overdue to redesign that mechanism; but any such fix is unlikely
to be back-patchable into v11.  As a stopgap, fix eval_const_expressions
to do what it must here.  Also add a bunch of comments pointing out the
restrictions and assumptions that are needed to make this work at all.

Also fix a related oversight: contain_context_dependent_node() was not
aware of the relationship of ArrayCoerceExpr to CaseTestExpr.  That was
somewhat fail-soft, in that the outcome of a wrong answer would be to
prevent optimizations that could have been made, but let's fix it while
we're at it.

Per bug #15471 from Matt Williams.  Back-patch to v11 where the faulty
logic came in.

Discussion: https://postgr.es/m/15471-1117f49271989bad@postgresql.org
2018-10-30 15:26:11 -04:00
..
.gitignore Convert cvsignore to gitignore, and add .gitignore for build targets. 2010-09-22 12:57:04 +02:00
Makefile Revert MERGE patch 2018-04-12 11:22:56 +01:00
README Move keywords.c/kwlookup.c into src/common/. 2016-03-23 20:22:08 -04:00
analyze.c Create an RTE field to record the query's lock mode for each relation. 2018-09-30 13:55:51 -04:00
check_keywords.pl Don't fall off the end of perl functions 2018-05-27 09:08:42 -04:00
gram.y Add option SKIP_LOCKED to VACUUM and ANALYZE 2018-10-04 09:00:33 +09:00
parse_agg.c Revert MERGE patch 2018-04-12 11:22:56 +01:00
parse_clause.c Create an RTE field to record the query's lock mode for each relation. 2018-09-30 13:55:51 -04:00
parse_coerce.c Fix interaction of CASE and ArrayCoerceExpr. 2018-10-30 15:26:11 -04:00
parse_collate.c Revert MERGE patch 2018-04-12 11:22:56 +01:00
parse_cte.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
parse_enr.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
parse_expr.c Revert MERGE patch 2018-04-12 11:22:56 +01:00
parse_func.c Fix misc typos, mostly in comments. 2018-07-18 16:17:32 +03:00
parse_node.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
parse_oper.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
parse_param.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
parse_relation.c Correct constness of system attributes in heap.c & prerequisites. 2018-10-16 09:44:43 -07:00
parse_target.c Fix interaction of CASE and ArrayCoerceExpr. 2018-10-30 15:26:11 -04:00
parse_type.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
parse_utilcmd.c Remove get_attidentity() 2018-10-23 14:47:14 +02:00
parser.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
scan.l Fix lexing of standard multi-character operators in edge cases. 2018-08-23 21:42:40 +01:00
scansup.c Update copyright for 2018 2018-01-02 23:30:12 -05:00

README

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.