mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Generated columns
This is an SQL-standard feature that allows creating columns that are computed from expressions rather than assigned, similar to a view or materialized view but on a column basis. This implements one kind of generated column: stored (computed on write). Another kind, virtual (computed on read), is planned for the future, and some room is left for it. Reviewed-by: Michael Paquier <michael@paquier.xyz> Reviewed-by: Pavel Stehule <pavel.stehule@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/b151f851-4019-bdb1-699e-ebab07d2f40a@2ndquadrant.com
This commit is contained in:
@ -731,6 +731,17 @@ scanRTEForColumn(ParseState *pstate, RangeTblEntry *rte, const char *colname,
|
||||
colname),
|
||||
parser_errposition(pstate, location)));
|
||||
|
||||
/*
|
||||
* In generated column, no system column is allowed except tableOid.
|
||||
*/
|
||||
if (pstate->p_expr_kind == EXPR_KIND_GENERATED_COLUMN &&
|
||||
attnum < InvalidAttrNumber && attnum != TableOidAttributeNumber)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
|
||||
errmsg("cannot use system column \"%s\" in column generation expression",
|
||||
colname),
|
||||
parser_errposition(pstate, location)));
|
||||
|
||||
if (attnum != InvalidAttrNumber)
|
||||
{
|
||||
/* now check to see if column actually is defined */
|
||||
@ -1257,6 +1268,7 @@ addRangeTableEntry(ParseState *pstate,
|
||||
rte->selectedCols = NULL;
|
||||
rte->insertedCols = NULL;
|
||||
rte->updatedCols = NULL;
|
||||
rte->extraUpdatedCols = NULL;
|
||||
|
||||
/*
|
||||
* Add completed RTE to pstate's range table list, but not to join list
|
||||
@ -1328,6 +1340,7 @@ addRangeTableEntryForRelation(ParseState *pstate,
|
||||
rte->selectedCols = NULL;
|
||||
rte->insertedCols = NULL;
|
||||
rte->updatedCols = NULL;
|
||||
rte->extraUpdatedCols = NULL;
|
||||
|
||||
/*
|
||||
* Add completed RTE to pstate's range table list, but not to join list
|
||||
@ -1407,6 +1420,7 @@ addRangeTableEntryForSubquery(ParseState *pstate,
|
||||
rte->selectedCols = NULL;
|
||||
rte->insertedCols = NULL;
|
||||
rte->updatedCols = NULL;
|
||||
rte->extraUpdatedCols = NULL;
|
||||
|
||||
/*
|
||||
* Add completed RTE to pstate's range table list, but not to join list
|
||||
@ -1670,6 +1684,7 @@ addRangeTableEntryForFunction(ParseState *pstate,
|
||||
rte->selectedCols = NULL;
|
||||
rte->insertedCols = NULL;
|
||||
rte->updatedCols = NULL;
|
||||
rte->extraUpdatedCols = NULL;
|
||||
|
||||
/*
|
||||
* Add completed RTE to pstate's range table list, but not to join list
|
||||
@ -1733,6 +1748,7 @@ addRangeTableEntryForTableFunc(ParseState *pstate,
|
||||
rte->selectedCols = NULL;
|
||||
rte->insertedCols = NULL;
|
||||
rte->updatedCols = NULL;
|
||||
rte->extraUpdatedCols = NULL;
|
||||
|
||||
/*
|
||||
* Add completed RTE to pstate's range table list, but not to join list
|
||||
@ -1811,6 +1827,7 @@ addRangeTableEntryForValues(ParseState *pstate,
|
||||
rte->selectedCols = NULL;
|
||||
rte->insertedCols = NULL;
|
||||
rte->updatedCols = NULL;
|
||||
rte->extraUpdatedCols = NULL;
|
||||
|
||||
/*
|
||||
* Add completed RTE to pstate's range table list, but not to join list
|
||||
@ -1881,6 +1898,7 @@ addRangeTableEntryForJoin(ParseState *pstate,
|
||||
rte->selectedCols = NULL;
|
||||
rte->insertedCols = NULL;
|
||||
rte->updatedCols = NULL;
|
||||
rte->extraUpdatedCols = NULL;
|
||||
|
||||
/*
|
||||
* Add completed RTE to pstate's range table list, but not to join list
|
||||
@ -1983,6 +2001,7 @@ addRangeTableEntryForCTE(ParseState *pstate,
|
||||
rte->selectedCols = NULL;
|
||||
rte->insertedCols = NULL;
|
||||
rte->updatedCols = NULL;
|
||||
rte->extraUpdatedCols = NULL;
|
||||
|
||||
/*
|
||||
* Add completed RTE to pstate's range table list, but not to join list
|
||||
|
Reference in New Issue
Block a user