postgresql/src/backend/parser
Tom Lane f0fedfe82c Allow polymorphic aggregates to have non-polymorphic state data types.
Before 9.4, such an aggregate couldn't be declared, because its final
function would have to have polymorphic result type but no polymorphic
argument, which CREATE FUNCTION would quite properly reject.  The
ordered-set-aggregate patch found a workaround: allow the final function
to be declared as accepting additional dummy arguments that have types
matching the aggregate's regular input arguments.  However, we failed
to notice that this problem applies just as much to regular aggregates,
despite the fact that we had a built-in regular aggregate array_agg()
that was known to be undeclarable in SQL because its final function
had an illegal signature.  So what we should have done, and what this
patch does, is to decouple the extra-dummy-arguments behavior from
ordered-set aggregates and make it generally available for all aggregate
declarations.  We have to put this into 9.4 rather than waiting till
later because it slightly alters the rules for declaring ordered-set
aggregates.

The patch turned out a bit bigger than I'd hoped because it proved
necessary to record the extra-arguments option in a new pg_aggregate
column.  I'd thought we could just look at the final function's pronargs
at runtime, but that didn't work well for variadic final functions.
It's probably just as well though, because it simplifies life for pg_dump
to record the option explicitly.

While at it, fix array_agg() to have a valid final-function signature,
and add an opr_sanity test to notice future deviations from polymorphic
consistency.  I also marked the percentile_cont() aggregates as not
needing extra arguments, since they don't.
2014-04-23 19:17:41 -04:00
..
.gitignore Convert cvsignore to gitignore, and add .gitignore for build targets. 2010-09-22 12:57:04 +02:00
Makefile Refactor flex and bison make rules 2012-10-11 06:57:04 -04:00
README Revise collation derivation method and expression-tree representation. 2011-03-19 20:30:08 -04:00
analyze.c Disallow LATERAL references to the target table of an UPDATE/DELETE. 2014-01-11 19:03:12 -05:00
check_keywords.pl Update copyright for 2014 2014-01-07 16:05:30 -05:00
gram.y Make a dedicated AlterTblSpcStmt production 2014-04-13 01:02:44 -04:00
keywords.c Update copyright for 2014 2014-01-07 16:05:30 -05:00
kwlookup.c Update copyright for 2014 2014-01-07 16:05:30 -05:00
parse_agg.c Allow polymorphic aggregates to have non-polymorphic state data types. 2014-04-23 19:17:41 -04:00
parse_clause.c Update copyright for 2014 2014-01-07 16:05:30 -05:00
parse_coerce.c Update copyright for 2014 2014-01-07 16:05:30 -05:00
parse_collate.c Update copyright for 2014 2014-01-07 16:05:30 -05:00
parse_cte.c Update copyright for 2014 2014-01-07 16:05:30 -05:00
parse_expr.c Update copyright for 2014 2014-01-07 16:05:30 -05:00
parse_func.c Fix non-equivalence of VARIADIC and non-VARIADIC function call formats. 2014-04-03 22:02:24 -04:00
parse_node.c Update copyright for 2014 2014-01-07 16:05:30 -05:00
parse_oper.c Add new to_reg* functions for error-free OID lookups. 2014-04-08 10:27:56 -04:00
parse_param.c Update copyright for 2014 2014-01-07 16:05:30 -05:00
parse_relation.c Disallow LATERAL references to the target table of an UPDATE/DELETE. 2014-01-11 19:03:12 -05:00
parse_target.c Update copyright for 2014 2014-01-07 16:05:30 -05:00
parse_type.c Add new to_reg* functions for error-free OID lookups. 2014-04-08 10:27:56 -04:00
parse_utilcmd.c Avoid repeated name lookups during table and index DDL. 2014-02-17 09:33:31 -05:00
parser.c Update copyright for 2014 2014-01-07 16:05:30 -05:00
scan.l Fix length checking for Unicode identifiers containing escapes (U&"..."). 2014-02-13 14:24:42 -05:00
scansup.c Update copyright for 2014 2014-01-07 16:05:30 -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
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)