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:
@@ -280,6 +280,10 @@ expand_partitioned_rtentry(PlannerInfo *root, RangeTblEntry *parentrte,
|
||||
if (!root->partColsUpdated)
|
||||
root->partColsUpdated =
|
||||
has_partition_attrs(parentrel, parentrte->updatedCols, NULL);
|
||||
/*
|
||||
* There shouldn't be any generated columns in the partition key.
|
||||
*/
|
||||
Assert(!has_partition_attrs(parentrel, parentrte->extraUpdatedCols, NULL));
|
||||
|
||||
/*
|
||||
* If the partitioned table has no partitions, treat this as the
|
||||
@@ -415,6 +419,8 @@ expand_single_inheritance_child(PlannerInfo *root, RangeTblEntry *parentrte,
|
||||
appinfo->translated_vars);
|
||||
childrte->updatedCols = translate_col_privs(parentrte->updatedCols,
|
||||
appinfo->translated_vars);
|
||||
childrte->extraUpdatedCols = translate_col_privs(parentrte->extraUpdatedCols,
|
||||
appinfo->translated_vars);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -2083,6 +2083,25 @@ has_row_triggers(PlannerInfo *root, Index rti, CmdType event)
|
||||
return result;
|
||||
}
|
||||
|
||||
bool
|
||||
has_stored_generated_columns(PlannerInfo *root, Index rti)
|
||||
{
|
||||
RangeTblEntry *rte = planner_rt_fetch(rti, root);
|
||||
Relation relation;
|
||||
TupleDesc tupdesc;
|
||||
bool result = false;
|
||||
|
||||
/* Assume we already have adequate lock */
|
||||
relation = heap_open(rte->relid, NoLock);
|
||||
|
||||
tupdesc = RelationGetDescr(relation);
|
||||
result = tupdesc->constr && tupdesc->constr->has_generated_stored;
|
||||
|
||||
heap_close(relation, NoLock);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* set_relation_partition_info
|
||||
*
|
||||
|
Reference in New Issue
Block a user