mirror of
https://github.com/postgres/postgres.git
synced 2025-11-06 07:49:08 +03:00
Implement SQL-standard LATERAL subqueries.
This patch implements the standard syntax of LATERAL attached to a sub-SELECT in FROM, and also allows LATERAL attached to a function in FROM, since set-returning function calls are expected to be one of the principal use-cases. The main change here is a rewrite of the mechanism for keeping track of which relations are visible for column references while the FROM clause is being scanned. The parser "namespace" lists are no longer lists of bare RTEs, but are lists of ParseNamespaceItem structs, which carry an RTE pointer as well as some visibility-controlling flags. Aside from supporting LATERAL correctly, this lets us get rid of the ancient hacks that required rechecking subqueries and JOIN/ON and function-in-FROM expressions for invalid references after they were initially parsed. Invalid column references are now always correctly detected on sight. In passing, remove assorted parser error checks that are now dead code by virtue of our having gotten rid of add_missing_from, as well as some comments that are obsolete for the same reason. (It was mainly add_missing_from that caused so much fudging here in the first place.) The planner support for this feature is very minimal, and will be improved in future patches. It works well enough for testing purposes, though. catversion bump forced due to new field in RangeTblEntry.
This commit is contained in:
@@ -451,6 +451,7 @@ typedef struct WindowDef
|
||||
typedef struct RangeSubselect
|
||||
{
|
||||
NodeTag type;
|
||||
bool lateral; /* does it have LATERAL prefix? */
|
||||
Node *subquery; /* the untransformed sub-select clause */
|
||||
Alias *alias; /* table alias & optional column aliases */
|
||||
} RangeSubselect;
|
||||
@@ -461,6 +462,7 @@ typedef struct RangeSubselect
|
||||
typedef struct RangeFunction
|
||||
{
|
||||
NodeTag type;
|
||||
bool lateral; /* does it have LATERAL prefix? */
|
||||
Node *funccallnode; /* untransformed function call tree */
|
||||
Alias *alias; /* table alias & optional column aliases */
|
||||
List *coldeflist; /* list of ColumnDef nodes to describe result
|
||||
@@ -706,7 +708,7 @@ typedef struct RangeTblEntry
|
||||
* Fields valid for a subquery RTE (else NULL):
|
||||
*/
|
||||
Query *subquery; /* the sub-query */
|
||||
bool security_barrier; /* subquery from security_barrier view */
|
||||
bool security_barrier; /* is from security_barrier view? */
|
||||
|
||||
/*
|
||||
* Fields valid for a join RTE (else NULL/zero):
|
||||
@@ -756,6 +758,7 @@ typedef struct RangeTblEntry
|
||||
*/
|
||||
Alias *alias; /* user-written alias clause, if any */
|
||||
Alias *eref; /* expanded reference names */
|
||||
bool lateral; /* subquery or function is marked LATERAL? */
|
||||
bool inh; /* inheritance requested? */
|
||||
bool inFromCl; /* present in FROM clause? */
|
||||
AclMode requiredPerms; /* bitmask of required access permissions */
|
||||
@@ -1752,7 +1755,7 @@ typedef struct AlterEventTrigStmt
|
||||
{
|
||||
NodeTag type;
|
||||
char *trigname; /* TRIGGER's name */
|
||||
char tgenabled; /* trigger's firing configuration WRT
|
||||
char tgenabled; /* trigger's firing configuration WRT
|
||||
* session_replication_role */
|
||||
} AlterEventTrigStmt;
|
||||
|
||||
@@ -2046,7 +2049,7 @@ typedef struct FetchStmt
|
||||
*
|
||||
* This represents creation of an index and/or an associated constraint.
|
||||
* If isconstraint is true, we should create a pg_constraint entry along
|
||||
* with the index. But if indexOid isn't InvalidOid, we are not creating an
|
||||
* with the index. But if indexOid isn't InvalidOid, we are not creating an
|
||||
* index, just a UNIQUE/PKEY constraint using an existing index. isconstraint
|
||||
* must always be true in this case, and the fields describing the index
|
||||
* properties are empty.
|
||||
|
||||
Reference in New Issue
Block a user