mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +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:
@@ -2287,6 +2287,7 @@ transformUpdateTargetList(ParseState *pstate, List *origTlist)
|
||||
RangeTblEntry *target_rte;
|
||||
ListCell *orig_tl;
|
||||
ListCell *tl;
|
||||
TupleDesc tupdesc = pstate->p_target_relation->rd_att;
|
||||
|
||||
tlist = transformTargetList(pstate, origTlist,
|
||||
EXPR_KIND_UPDATE_SOURCE);
|
||||
@@ -2345,6 +2346,32 @@ transformUpdateTargetList(ParseState *pstate, List *origTlist)
|
||||
if (orig_tl != NULL)
|
||||
elog(ERROR, "UPDATE target count mismatch --- internal error");
|
||||
|
||||
/*
|
||||
* Record in extraUpdatedCols generated columns referencing updated base
|
||||
* columns.
|
||||
*/
|
||||
if (tupdesc->constr &&
|
||||
tupdesc->constr->has_generated_stored)
|
||||
{
|
||||
for (int i = 0; i < tupdesc->constr->num_defval; i++)
|
||||
{
|
||||
AttrDefault defval = tupdesc->constr->defval[i];
|
||||
Node *expr;
|
||||
Bitmapset *attrs_used = NULL;
|
||||
|
||||
/* skip if not generated column */
|
||||
if (!TupleDescAttr(tupdesc, defval.adnum - 1)->attgenerated)
|
||||
continue;
|
||||
|
||||
expr = stringToNode(defval.adbin);
|
||||
pull_varattnos(expr, 1, &attrs_used);
|
||||
|
||||
if (bms_overlap(target_rte->updatedCols, attrs_used))
|
||||
target_rte->extraUpdatedCols = bms_add_member(target_rte->extraUpdatedCols,
|
||||
defval.adnum - FirstLowInvalidHeapAttributeNumber);
|
||||
}
|
||||
}
|
||||
|
||||
return tlist;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user