2323#include "catalog/namespace.h"
2424#include "catalog/objectaccess.h"
2525#include "catalog/objectaddress.h"
26+ #include "catalog/partition.h"
2627#include "catalog/pg_inherits.h"
2728#include "catalog/pg_publication.h"
2829#include "catalog/pg_publication_rel.h"
@@ -56,20 +57,21 @@ static void PublicationDropTables(Oid pubid, List *rels, bool missing_ok);
5657static void
5758parse_publication_options (List * options ,
5859 bool * publish_given ,
59- bool * publish_insert ,
60- bool * publish_update ,
61- bool * publish_delete ,
62- bool * publish_truncate )
60+ PublicationActions * pubactions ,
61+ bool * publish_via_partition_root_given ,
62+ bool * publish_via_partition_root )
6363{
6464 ListCell * lc ;
6565
6666 * publish_given = false;
67+ * publish_via_partition_root_given = false;
6768
68- /* Defaults are true */
69- * publish_insert = true;
70- * publish_update = true;
71- * publish_delete = true;
72- * publish_truncate = true;
69+ /* defaults */
70+ pubactions -> pubinsert = true;
71+ pubactions -> pubupdate = true;
72+ pubactions -> pubdelete = true;
73+ pubactions -> pubtruncate = true;
74+ * publish_via_partition_root = false;
7375
7476 /* Parse options */
7577 foreach (lc , options )
@@ -91,10 +93,10 @@ parse_publication_options(List *options,
9193 * If publish option was given only the explicitly listed actions
9294 * should be published.
9395 */
94- * publish_insert = false;
95- * publish_update = false;
96- * publish_delete = false;
97- * publish_truncate = false;
96+ pubactions -> pubinsert = false;
97+ pubactions -> pubupdate = false;
98+ pubactions -> pubdelete = false;
99+ pubactions -> pubtruncate = false;
98100
99101 * publish_given = true;
100102 publish = defGetString (defel );
@@ -110,19 +112,28 @@ parse_publication_options(List *options,
110112 char * publish_opt = (char * ) lfirst (lc );
111113
112114 if (strcmp (publish_opt , "insert" ) == 0 )
113- * publish_insert = true;
115+ pubactions -> pubinsert = true;
114116 else if (strcmp (publish_opt , "update" ) == 0 )
115- * publish_update = true;
117+ pubactions -> pubupdate = true;
116118 else if (strcmp (publish_opt , "delete" ) == 0 )
117- * publish_delete = true;
119+ pubactions -> pubdelete = true;
118120 else if (strcmp (publish_opt , "truncate" ) == 0 )
119- * publish_truncate = true;
121+ pubactions -> pubtruncate = true;
120122 else
121123 ereport (ERROR ,
122124 (errcode (ERRCODE_SYNTAX_ERROR ),
123125 errmsg ("unrecognized \"publish\" value: \"%s\"" , publish_opt )));
124126 }
125127 }
128+ else if (strcmp (defel -> defname , "publish_via_partition_root" ) == 0 )
129+ {
130+ if (* publish_via_partition_root_given )
131+ ereport (ERROR ,
132+ (errcode (ERRCODE_SYNTAX_ERROR ),
133+ errmsg ("conflicting or redundant options" )));
134+ * publish_via_partition_root_given = true;
135+ * publish_via_partition_root = defGetBoolean (defel );
136+ }
126137 else
127138 ereport (ERROR ,
128139 (errcode (ERRCODE_SYNTAX_ERROR ),
@@ -143,10 +154,9 @@ CreatePublication(CreatePublicationStmt *stmt)
143154 Datum values [Natts_pg_publication ];
144155 HeapTuple tup ;
145156 bool publish_given ;
146- bool publish_insert ;
147- bool publish_update ;
148- bool publish_delete ;
149- bool publish_truncate ;
157+ PublicationActions pubactions ;
158+ bool publish_via_partition_root_given ;
159+ bool publish_via_partition_root ;
150160 AclResult aclresult ;
151161
152162 /* must have CREATE privilege on database */
@@ -183,23 +193,25 @@ CreatePublication(CreatePublicationStmt *stmt)
183193 values [Anum_pg_publication_pubowner - 1 ] = ObjectIdGetDatum (GetUserId ());
184194
185195 parse_publication_options (stmt -> options ,
186- & publish_given , & publish_insert ,
187- & publish_update , & publish_delete ,
188- & publish_truncate );
196+ & publish_given , & pubactions ,
197+ & publish_via_partition_root_given ,
198+ & publish_via_partition_root );
189199
190200 puboid = GetNewOidWithIndex (rel , PublicationObjectIndexId ,
191201 Anum_pg_publication_oid );
192202 values [Anum_pg_publication_oid - 1 ] = ObjectIdGetDatum (puboid );
193203 values [Anum_pg_publication_puballtables - 1 ] =
194204 BoolGetDatum (stmt -> for_all_tables );
195205 values [Anum_pg_publication_pubinsert - 1 ] =
196- BoolGetDatum (publish_insert );
206+ BoolGetDatum (pubactions . pubinsert );
197207 values [Anum_pg_publication_pubupdate - 1 ] =
198- BoolGetDatum (publish_update );
208+ BoolGetDatum (pubactions . pubupdate );
199209 values [Anum_pg_publication_pubdelete - 1 ] =
200- BoolGetDatum (publish_delete );
210+ BoolGetDatum (pubactions . pubdelete );
201211 values [Anum_pg_publication_pubtruncate - 1 ] =
202- BoolGetDatum (publish_truncate );
212+ BoolGetDatum (pubactions .pubtruncate );
213+ values [Anum_pg_publication_pubviaroot - 1 ] =
214+ BoolGetDatum (publish_via_partition_root );
203215
204216 tup = heap_form_tuple (RelationGetDescr (rel ), values , nulls );
205217
@@ -251,17 +263,16 @@ AlterPublicationOptions(AlterPublicationStmt *stmt, Relation rel,
251263 bool replaces [Natts_pg_publication ];
252264 Datum values [Natts_pg_publication ];
253265 bool publish_given ;
254- bool publish_insert ;
255- bool publish_update ;
256- bool publish_delete ;
257- bool publish_truncate ;
266+ PublicationActions pubactions ;
267+ bool publish_via_partition_root_given ;
268+ bool publish_via_partition_root ;
258269 ObjectAddress obj ;
259270 Form_pg_publication pubform ;
260271
261272 parse_publication_options (stmt -> options ,
262- & publish_given , & publish_insert ,
263- & publish_update , & publish_delete ,
264- & publish_truncate );
273+ & publish_given , & pubactions ,
274+ & publish_via_partition_root_given ,
275+ & publish_via_partition_root );
265276
266277 /* Everything ok, form a new tuple. */
267278 memset (values , 0 , sizeof (values ));
@@ -270,19 +281,25 @@ AlterPublicationOptions(AlterPublicationStmt *stmt, Relation rel,
270281
271282 if (publish_given )
272283 {
273- values [Anum_pg_publication_pubinsert - 1 ] = BoolGetDatum (publish_insert );
284+ values [Anum_pg_publication_pubinsert - 1 ] = BoolGetDatum (pubactions . pubinsert );
274285 replaces [Anum_pg_publication_pubinsert - 1 ] = true;
275286
276- values [Anum_pg_publication_pubupdate - 1 ] = BoolGetDatum (publish_update );
287+ values [Anum_pg_publication_pubupdate - 1 ] = BoolGetDatum (pubactions . pubupdate );
277288 replaces [Anum_pg_publication_pubupdate - 1 ] = true;
278289
279- values [Anum_pg_publication_pubdelete - 1 ] = BoolGetDatum (publish_delete );
290+ values [Anum_pg_publication_pubdelete - 1 ] = BoolGetDatum (pubactions . pubdelete );
280291 replaces [Anum_pg_publication_pubdelete - 1 ] = true;
281292
282- values [Anum_pg_publication_pubtruncate - 1 ] = BoolGetDatum (publish_truncate );
293+ values [Anum_pg_publication_pubtruncate - 1 ] = BoolGetDatum (pubactions . pubtruncate );
283294 replaces [Anum_pg_publication_pubtruncate - 1 ] = true;
284295 }
285296
297+ if (publish_via_partition_root_given )
298+ {
299+ values [Anum_pg_publication_pubviaroot - 1 ] = BoolGetDatum (publish_via_partition_root );
300+ replaces [Anum_pg_publication_pubviaroot - 1 ] = true;
301+ }
302+
286303 tup = heap_modify_tuple (tup , RelationGetDescr (rel ), values , nulls ,
287304 replaces );
288305
0 commit comments