postgresql/src/backend/parser
Tom Lane 404db8f9ed Execute foreign key constraints in CREATE SCHEMA at the end.
The previous patch simplified CREATE SCHEMA's behavior to "execute all
subcommands in the order they are written".  However, that's a bit too
simple, as the spec clearly requires forward references in foreign key
constraint clauses to work, see feature F311-01.  (Most other SQL
implementations seem to read more into the spec than that, but it's
not clear that there's justification for more in the text, and this is
the only case that doesn't introduce unresolvable issues.)  We never
implemented that before, but let's do so now.

To fix it, transform FOREIGN KEY clauses into ALTER TABLE ... ADD
FOREIGN KEY commands and append them to the end of the CREATE SCHEMA's
subcommand list.  This works because the foreign key constraints are
independent and don't affect any other DDL that might be in CREATE
SCHEMA.  For simplicity, we do this for all FOREIGN KEY clauses even
if they would have worked where they were.

Author: Jian He <jian.universality@gmail.com>
Co-authored-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/1075425.1732993688@sss.pgh.pa.us
2026-04-06 15:16:25 -04:00
..
.gitignore Convert cvsignore to gitignore, and add .gitignore for build targets. 2010-09-22 12:57:04 +02:00
analyze.c Add UPDATE/DELETE FOR PORTION OF 2026-04-01 19:06:03 +02:00
check_keywords.pl Update copyright for 2026 2026-01-01 13:24:10 -05:00
gram.y Add UPDATE/DELETE FOR PORTION OF 2026-04-01 19:06:03 +02:00
gramparse.h Update copyright for 2026 2026-01-01 13:24:10 -05:00
Makefile SQL Property Graph Queries (SQL/PGQ) 2026-03-16 10:14:18 +01:00
meson.build SQL Property Graph Queries (SQL/PGQ) 2026-03-16 10:14:18 +01:00
parse_agg.c Add UPDATE/DELETE FOR PORTION OF 2026-04-01 19:06:03 +02:00
parse_clause.c SQL Property Graph Queries (SQL/PGQ) 2026-03-16 10:14:18 +01:00
parse_coerce.c Update copyright for 2026 2026-01-01 13:24:10 -05:00
parse_collate.c Add UPDATE/DELETE FOR PORTION OF 2026-04-01 19:06:03 +02:00
parse_cte.c Update copyright for 2026 2026-01-01 13:24:10 -05:00
parse_enr.c Update copyright for 2026 2026-01-01 13:24:10 -05:00
parse_expr.c Add UPDATE/DELETE FOR PORTION OF 2026-04-01 19:06:03 +02:00
parse_func.c Add UPDATE/DELETE FOR PORTION OF 2026-04-01 19:06:03 +02:00
parse_graphtable.c Fix cross variable references in graph pattern causing segfault 2026-03-31 11:47:19 +02:00
parse_jsontable.c Use fallthrough attribute instead of comment 2026-02-19 08:51:12 +01:00
parse_merge.c Add UPDATE/DELETE FOR PORTION OF 2026-04-01 19:06:03 +02:00
parse_node.c Update copyright for 2026 2026-01-01 13:24:10 -05:00
parse_oper.c Don't include storage/lock.h in so many headers 2026-03-24 17:11:12 +01:00
parse_param.c Update copyright for 2026 2026-01-01 13:24:10 -05:00
parse_relation.c SQL Property Graph Queries (SQL/PGQ) 2026-03-16 10:14:18 +01:00
parse_target.c SQL Property Graph Queries (SQL/PGQ) 2026-03-16 10:14:18 +01:00
parse_type.c Update copyright for 2026 2026-01-01 13:24:10 -05:00
parse_utilcmd.c Execute foreign key constraints in CREATE SCHEMA at the end. 2026-04-06 15:16:25 -04:00
parser.c Update copyright for 2026 2026-01-01 13:24:10 -05:00
README Update parser README to include parse_jsontable.c 2025-09-08 10:07:14 +09:00
scan.l SQL Property Graph Queries (SQL/PGQ) 2026-03-16 10:14:18 +01:00
scansup.c Update copyright for 2026 2026-01-01 13:24:10 -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_enr.c	handle ephemeral named rels (trigger transition tables, ...)
parse_func.c	handle functions, table.column and column identifiers
parse_jsontable.c handle JSON_TABLE
parse_merge.c	handle MERGE
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.