mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +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:
@@ -453,7 +453,7 @@ logicalrep_write_tuple(StringInfo out, Relation rel, HeapTuple tuple)
|
||||
|
||||
for (i = 0; i < desc->natts; i++)
|
||||
{
|
||||
if (TupleDescAttr(desc, i)->attisdropped)
|
||||
if (TupleDescAttr(desc, i)->attisdropped || TupleDescAttr(desc, i)->attgenerated)
|
||||
continue;
|
||||
nliveatts++;
|
||||
}
|
||||
@@ -473,8 +473,7 @@ logicalrep_write_tuple(StringInfo out, Relation rel, HeapTuple tuple)
|
||||
Form_pg_attribute att = TupleDescAttr(desc, i);
|
||||
char *outputstr;
|
||||
|
||||
/* skip dropped columns */
|
||||
if (att->attisdropped)
|
||||
if (att->attisdropped || att->attgenerated)
|
||||
continue;
|
||||
|
||||
if (isnull[i])
|
||||
@@ -573,7 +572,7 @@ logicalrep_write_attrs(StringInfo out, Relation rel)
|
||||
/* send number of live attributes */
|
||||
for (i = 0; i < desc->natts; i++)
|
||||
{
|
||||
if (TupleDescAttr(desc, i)->attisdropped)
|
||||
if (TupleDescAttr(desc, i)->attisdropped || TupleDescAttr(desc, i)->attgenerated)
|
||||
continue;
|
||||
nliveatts++;
|
||||
}
|
||||
@@ -591,7 +590,7 @@ logicalrep_write_attrs(StringInfo out, Relation rel)
|
||||
Form_pg_attribute att = TupleDescAttr(desc, i);
|
||||
uint8 flags = 0;
|
||||
|
||||
if (att->attisdropped)
|
||||
if (att->attisdropped || att->attgenerated)
|
||||
continue;
|
||||
|
||||
/* REPLICA IDENTITY FULL means all columns are sent as part of key. */
|
||||
|
@@ -276,7 +276,7 @@ logicalrep_rel_open(LogicalRepRelId remoteid, LOCKMODE lockmode)
|
||||
int attnum;
|
||||
Form_pg_attribute attr = TupleDescAttr(desc, i);
|
||||
|
||||
if (attr->attisdropped)
|
||||
if (attr->attisdropped || attr->attgenerated)
|
||||
{
|
||||
entry->attrmap[i] = -1;
|
||||
continue;
|
||||
|
@@ -697,10 +697,12 @@ fetch_remote_table_info(char *nspname, char *relname,
|
||||
" LEFT JOIN pg_catalog.pg_index i"
|
||||
" ON (i.indexrelid = pg_get_replica_identity_index(%u))"
|
||||
" WHERE a.attnum > 0::pg_catalog.int2"
|
||||
" AND NOT a.attisdropped"
|
||||
" AND NOT a.attisdropped %s"
|
||||
" AND a.attrelid = %u"
|
||||
" ORDER BY a.attnum",
|
||||
lrel->remoteid, lrel->remoteid);
|
||||
lrel->remoteid,
|
||||
(walrcv_server_version(wrconn) >= 120000 ? "AND a.attgenerated = ''" : ""),
|
||||
lrel->remoteid);
|
||||
res = walrcv_exec(wrconn, cmd.data, 4, attrRow);
|
||||
|
||||
if (res->status != WALRCV_OK_TUPLES)
|
||||
|
@@ -236,7 +236,7 @@ slot_fill_defaults(LogicalRepRelMapEntry *rel, EState *estate,
|
||||
{
|
||||
Expr *defexpr;
|
||||
|
||||
if (TupleDescAttr(desc, attnum)->attisdropped)
|
||||
if (TupleDescAttr(desc, attnum)->attisdropped || TupleDescAttr(desc, attnum)->attgenerated)
|
||||
continue;
|
||||
|
||||
if (rel->attrmap[attnum] >= 0)
|
||||
|
Reference in New Issue
Block a user