Dear Vignesh, Thanks for working the project. Here are my comments only for 0001 and 0002. Sorry if my points have already been discussed, this thread is too huge to catchup for me :-(.
01. Do we have to document the function and open to users? Previously it was not. Another example is pg_get_publication_tables, which is used only by the backend. 02. ``` SELECT last_value, is_called, log_cnt FROM pg_get_sequence_data('test_seq1'); ``` I came up with the way that the function returns page_lsn, how do you feel? ``` SELECT last_value, is_called, log_cnt, page_lsn <= pg_current_wal_lsn() as lsn FROM pg_get_sequence_data('test_seq1'); ``` 03. Regarding the tab completion on psql. When I input till "CREATE PUBLICATION pub FOR ALL TABLES" and push the tab, the word "WITH" was completed. But I'm afraid it may be too much because users can input like "FOR ALL TABLES, ALL SEQUENCES". Should we suggest the word ", ALL SEQUENCES" here or we can ignore? Same point can be said when "FOR ALL SEQUENCES" was input. 04. Same as above, "WITH" could be completed when I input till "FOR ALL SEQUENCES". However, current patch rejects the WITH clause for ALL SEQUENCE publication. How do you feel? I'm wondering we should stop the suggestion. 05. is_publishable_class() has a comment atop the function: ``` * Does same checks as check_publication_add_relation() above, but does not * need relation to be opened and also does not throw errors. ``` But this is not correct becasue check_publication_add_relation() does not allow sequences. Can you modify the comment accordingly? 06. ``` values[Anum_pg_publication_puballtables - 1] = stmt->for_all_tables; values[Anum_pg_publication_puballsequences - 1] = stmt->for_all_sequences; ``` They should be passed as Datum like others. 07. ``` + /* + * indicates that this is special publication which should encompass all + * sequences in the database (except for the unlogged and temp ones) + */ + bool puballsequences; ``` Let me my thought here. I initially wondered whether we should synchronize unlogged sequences, because it is actually possible. However, I found the article[1] that primal use-case of the unlogged sequence is to associate with the unlogged table. Based on the point, I agree not to include such sequences - they might be a leaked sequence. 08. ``` @@ -1902,6 +1952,13 @@ PublicationDropTables(Oid pubid, List *rels, bool missing_ok) errcode(ERRCODE_SYNTAX_ERROR), errmsg("column list must not be specified in ALTER PUBLICATION ... DROP")); + if (RelationGetForm(rel)->relkind == RELKIND_SEQUENCE) + ereport(ERROR, + errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("relation \"%s\" is not part of the publication", + RelationGetRelationName(rel)), + errdetail_relkind_not_supported(RelationGetForm(rel)->relkind)); + ``` Hmm, I feel this is not needed because in the first place sequences cannot be specified as the target. Other objects like view is not handled here. 09. ``` + StringInfo pub_type; + Form_pg_publication pubform = (Form_pg_publication) GETSTRUCT(tup); ``` I feel this blank is not needed. 10. ``` /* * Process all_objects_list to set all_tables/all_sequences. * Also, checks if the pub_object_type has been specified more than once. */ static void preprocess_pub_all_objtype_list(List *all_objects_list, bool *all_tables, bool *all_sequences, core_yyscan_t yyscanner) ``` I'm not a native speaker, but I feel object list is "process"'d here, not "preprocess"'d. Can we rename to process_pub_all_objtype_list? 11. ``` + /* The WITH clause is not applicable to FOR ALL SEQUENCES publications */ + if (!pubinfo->puballsequences || pubinfo->puballtables) ``` This meant that FOR ALL TABLES/SEQUENCES publication without any options can be dumped like: ``` CREATE PUBLICATION pub FOR ALL TABLES, ALL SEQUENCES WITH (publish = 'insert, update, delete, truncate') ``` However, since the WITH clause is set with ALL SEQUENCE, generated script could raise the WARNING, which may be confusing for users: ``` $ psql -U postgres -f dump.sql ... psql:dump.sql:24: WARNING: WITH clause parameters do not affect sequence synchronization ``` One workaround for it is not to output WITH cause for default setting. Thought? [1]: https://www.crunchydata.com/blog/postgresql-unlogged-sequences#unlogged-sequences-in-postgres-have-no-performance-gain Best regards, Hayato Kuroda FUJITSU LIMITED