23
23
#include "catalog/namespace.h"
24
24
#include "catalog/objectaccess.h"
25
25
#include "catalog/objectaddress.h"
26
+ #include "catalog/partition.h"
26
27
#include "catalog/pg_inherits.h"
27
28
#include "catalog/pg_publication.h"
28
29
#include "catalog/pg_publication_rel.h"
@@ -56,20 +57,21 @@ static void PublicationDropTables(Oid pubid, List *rels, bool missing_ok);
56
57
static void
57
58
parse_publication_options (List * options ,
58
59
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 )
63
63
{
64
64
ListCell * lc ;
65
65
66
66
* publish_given = false;
67
+ * publish_via_partition_root_given = false;
67
68
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;
73
75
74
76
/* Parse options */
75
77
foreach (lc , options )
@@ -91,10 +93,10 @@ parse_publication_options(List *options,
91
93
* If publish option was given only the explicitly listed actions
92
94
* should be published.
93
95
*/
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;
98
100
99
101
* publish_given = true;
100
102
publish = defGetString (defel );
@@ -110,19 +112,28 @@ parse_publication_options(List *options,
110
112
char * publish_opt = (char * ) lfirst (lc );
111
113
112
114
if (strcmp (publish_opt , "insert" ) == 0 )
113
- * publish_insert = true;
115
+ pubactions -> pubinsert = true;
114
116
else if (strcmp (publish_opt , "update" ) == 0 )
115
- * publish_update = true;
117
+ pubactions -> pubupdate = true;
116
118
else if (strcmp (publish_opt , "delete" ) == 0 )
117
- * publish_delete = true;
119
+ pubactions -> pubdelete = true;
118
120
else if (strcmp (publish_opt , "truncate" ) == 0 )
119
- * publish_truncate = true;
121
+ pubactions -> pubtruncate = true;
120
122
else
121
123
ereport (ERROR ,
122
124
(errcode (ERRCODE_SYNTAX_ERROR ),
123
125
errmsg ("unrecognized \"publish\" value: \"%s\"" , publish_opt )));
124
126
}
125
127
}
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
+ }
126
137
else
127
138
ereport (ERROR ,
128
139
(errcode (ERRCODE_SYNTAX_ERROR ),
@@ -143,10 +154,9 @@ CreatePublication(CreatePublicationStmt *stmt)
143
154
Datum values [Natts_pg_publication ];
144
155
HeapTuple tup ;
145
156
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 ;
150
160
AclResult aclresult ;
151
161
152
162
/* must have CREATE privilege on database */
@@ -183,23 +193,25 @@ CreatePublication(CreatePublicationStmt *stmt)
183
193
values [Anum_pg_publication_pubowner - 1 ] = ObjectIdGetDatum (GetUserId ());
184
194
185
195
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 );
189
199
190
200
puboid = GetNewOidWithIndex (rel , PublicationObjectIndexId ,
191
201
Anum_pg_publication_oid );
192
202
values [Anum_pg_publication_oid - 1 ] = ObjectIdGetDatum (puboid );
193
203
values [Anum_pg_publication_puballtables - 1 ] =
194
204
BoolGetDatum (stmt -> for_all_tables );
195
205
values [Anum_pg_publication_pubinsert - 1 ] =
196
- BoolGetDatum (publish_insert );
206
+ BoolGetDatum (pubactions . pubinsert );
197
207
values [Anum_pg_publication_pubupdate - 1 ] =
198
- BoolGetDatum (publish_update );
208
+ BoolGetDatum (pubactions . pubupdate );
199
209
values [Anum_pg_publication_pubdelete - 1 ] =
200
- BoolGetDatum (publish_delete );
210
+ BoolGetDatum (pubactions . pubdelete );
201
211
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 );
203
215
204
216
tup = heap_form_tuple (RelationGetDescr (rel ), values , nulls );
205
217
@@ -251,17 +263,16 @@ AlterPublicationOptions(AlterPublicationStmt *stmt, Relation rel,
251
263
bool replaces [Natts_pg_publication ];
252
264
Datum values [Natts_pg_publication ];
253
265
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 ;
258
269
ObjectAddress obj ;
259
270
Form_pg_publication pubform ;
260
271
261
272
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 );
265
276
266
277
/* Everything ok, form a new tuple. */
267
278
memset (values , 0 , sizeof (values ));
@@ -270,19 +281,25 @@ AlterPublicationOptions(AlterPublicationStmt *stmt, Relation rel,
270
281
271
282
if (publish_given )
272
283
{
273
- values [Anum_pg_publication_pubinsert - 1 ] = BoolGetDatum (publish_insert );
284
+ values [Anum_pg_publication_pubinsert - 1 ] = BoolGetDatum (pubactions . pubinsert );
274
285
replaces [Anum_pg_publication_pubinsert - 1 ] = true;
275
286
276
- values [Anum_pg_publication_pubupdate - 1 ] = BoolGetDatum (publish_update );
287
+ values [Anum_pg_publication_pubupdate - 1 ] = BoolGetDatum (pubactions . pubupdate );
277
288
replaces [Anum_pg_publication_pubupdate - 1 ] = true;
278
289
279
- values [Anum_pg_publication_pubdelete - 1 ] = BoolGetDatum (publish_delete );
290
+ values [Anum_pg_publication_pubdelete - 1 ] = BoolGetDatum (pubactions . pubdelete );
280
291
replaces [Anum_pg_publication_pubdelete - 1 ] = true;
281
292
282
- values [Anum_pg_publication_pubtruncate - 1 ] = BoolGetDatum (publish_truncate );
293
+ values [Anum_pg_publication_pubtruncate - 1 ] = BoolGetDatum (pubactions . pubtruncate );
283
294
replaces [Anum_pg_publication_pubtruncate - 1 ] = true;
284
295
}
285
296
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
+
286
303
tup = heap_modify_tuple (tup , RelationGetDescr (rel ), values , nulls ,
287
304
replaces );
288
305
0 commit comments