mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +03:00
Replicate generated columns when 'publish_generated_columns' is set.
This patch builds on the work done in commit 745217a051
by enabling the
replication of generated columns alongside regular column changes through
a new publication parameter: publish_generated_columns.
Example usage:
CREATE PUBLICATION pub1 FOR TABLE tab_gencol WITH (publish_generated_columns = true);
The column list takes precedence. If the generated columns are specified
in the column list, they will be replicated even if
'publish_generated_columns' is set to false. Conversely, if generated
columns are not included in the column list (assuming the user specifies a
column list), they will not be replicated even if
'publish_generated_columns' is true.
Author: Vignesh C, Shubham Khanna
Reviewed-by: Peter Smith, Amit Kapila, Hayato Kuroda, Shlok Kyal, Ajin Cherian, Hou Zhijie, Masahiko Sawada
Discussion: https://postgr.es/m/B80D17B2-2C8E-4C7D-87F2-E5B4BE3C069E@gmail.com
This commit is contained in:
@@ -78,12 +78,15 @@ parse_publication_options(ParseState *pstate,
|
||||
bool *publish_given,
|
||||
PublicationActions *pubactions,
|
||||
bool *publish_via_partition_root_given,
|
||||
bool *publish_via_partition_root)
|
||||
bool *publish_via_partition_root,
|
||||
bool *publish_generated_columns_given,
|
||||
bool *publish_generated_columns)
|
||||
{
|
||||
ListCell *lc;
|
||||
|
||||
*publish_given = false;
|
||||
*publish_via_partition_root_given = false;
|
||||
*publish_generated_columns_given = false;
|
||||
|
||||
/* defaults */
|
||||
pubactions->pubinsert = true;
|
||||
@@ -91,6 +94,7 @@ parse_publication_options(ParseState *pstate,
|
||||
pubactions->pubdelete = true;
|
||||
pubactions->pubtruncate = true;
|
||||
*publish_via_partition_root = false;
|
||||
*publish_generated_columns = false;
|
||||
|
||||
/* Parse options */
|
||||
foreach(lc, options)
|
||||
@@ -151,6 +155,13 @@ parse_publication_options(ParseState *pstate,
|
||||
*publish_via_partition_root_given = true;
|
||||
*publish_via_partition_root = defGetBoolean(defel);
|
||||
}
|
||||
else if (strcmp(defel->defname, "publish_generated_columns") == 0)
|
||||
{
|
||||
if (*publish_generated_columns_given)
|
||||
errorConflictingDefElem(defel, pstate);
|
||||
*publish_generated_columns_given = true;
|
||||
*publish_generated_columns = defGetBoolean(defel);
|
||||
}
|
||||
else
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
@@ -737,6 +748,8 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt)
|
||||
PublicationActions pubactions;
|
||||
bool publish_via_partition_root_given;
|
||||
bool publish_via_partition_root;
|
||||
bool publish_generated_columns_given;
|
||||
bool publish_generated_columns;
|
||||
AclResult aclresult;
|
||||
List *relations = NIL;
|
||||
List *schemaidlist = NIL;
|
||||
@@ -776,7 +789,9 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt)
|
||||
stmt->options,
|
||||
&publish_given, &pubactions,
|
||||
&publish_via_partition_root_given,
|
||||
&publish_via_partition_root);
|
||||
&publish_via_partition_root,
|
||||
&publish_generated_columns_given,
|
||||
&publish_generated_columns);
|
||||
|
||||
puboid = GetNewOidWithIndex(rel, PublicationObjectIndexId,
|
||||
Anum_pg_publication_oid);
|
||||
@@ -793,6 +808,8 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt)
|
||||
BoolGetDatum(pubactions.pubtruncate);
|
||||
values[Anum_pg_publication_pubviaroot - 1] =
|
||||
BoolGetDatum(publish_via_partition_root);
|
||||
values[Anum_pg_publication_pubgencols - 1] =
|
||||
BoolGetDatum(publish_generated_columns);
|
||||
|
||||
tup = heap_form_tuple(RelationGetDescr(rel), values, nulls);
|
||||
|
||||
@@ -878,6 +895,8 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt,
|
||||
PublicationActions pubactions;
|
||||
bool publish_via_partition_root_given;
|
||||
bool publish_via_partition_root;
|
||||
bool publish_generated_columns_given;
|
||||
bool publish_generated_columns;
|
||||
ObjectAddress obj;
|
||||
Form_pg_publication pubform;
|
||||
List *root_relids = NIL;
|
||||
@@ -887,7 +906,9 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt,
|
||||
stmt->options,
|
||||
&publish_given, &pubactions,
|
||||
&publish_via_partition_root_given,
|
||||
&publish_via_partition_root);
|
||||
&publish_via_partition_root,
|
||||
&publish_generated_columns_given,
|
||||
&publish_generated_columns);
|
||||
|
||||
pubform = (Form_pg_publication) GETSTRUCT(tup);
|
||||
|
||||
@@ -997,6 +1018,12 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt,
|
||||
replaces[Anum_pg_publication_pubviaroot - 1] = true;
|
||||
}
|
||||
|
||||
if (publish_generated_columns_given)
|
||||
{
|
||||
values[Anum_pg_publication_pubgencols - 1] = BoolGetDatum(publish_generated_columns);
|
||||
replaces[Anum_pg_publication_pubgencols - 1] = true;
|
||||
}
|
||||
|
||||
tup = heap_modify_tuple(tup, RelationGetDescr(rel), values, nulls,
|
||||
replaces);
|
||||
|
||||
|
Reference in New Issue
Block a user