diff options
author | Michael Paquier <michael@paquier.xyz> | 2024-10-25 12:02:04 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2024-10-25 12:02:04 +0900 |
commit | 248c2d19238c7616531caa8b3101cca4f656185c (patch) | |
tree | 2d4a32495c904f7d16f2fb97e904c82abe6fbabe /src/backend/replication/logical/tablesync.c | |
parent | 1564339bfe23b2d1aa6403d6a08a7eaae0373cf9 (diff) | |
download | postgresql-248c2d19238c7616531caa8b3101cca4f656185c.tar.gz postgresql-248c2d19238c7616531caa8b3101cca4f656185c.zip |
Refactor code converting a publication name List to a StringInfo
The existing get_publications_str() is renamed to GetPublicationsStr()
and is moved to pg_subscription.c, so as it is possible to reuse it at
two locations of the tablesync code where the same logic was duplicated.
fetch_remote_table_info() was doing two List->StringInfo conversions
when dealing with a server of version 15 or newer. The conversion
happens only once now.
This refactoring leads to less code overall.
Author: Peter Smith
Reviewed-by: Michael Paquier, Masahiko Sawada
Discussion: https://postgr.es/m/CAHut+PtJMk4bKXqtpvqVy9ckknCgK9P6=FeG8zHF=6+Em_Snpw@mail.gmail.com
Diffstat (limited to 'src/backend/replication/logical/tablesync.c')
-rw-r--r-- | src/backend/replication/logical/tablesync.c | 35 |
1 files changed, 9 insertions, 26 deletions
diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index e03e7613926..d4b5d210e3e 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -802,7 +802,7 @@ fetch_remote_table_info(char *nspname, char *relname, Oid qualRow[] = {TEXTOID}; bool isnull; int natt; - ListCell *lc; + StringInfo pub_names = NULL; Bitmapset *included_cols = NULL; lrel->nspname = nspname; @@ -856,15 +856,10 @@ fetch_remote_table_info(char *nspname, char *relname, WalRcvExecResult *pubres; TupleTableSlot *tslot; Oid attrsRow[] = {INT2VECTOROID}; - StringInfoData pub_names; - initStringInfo(&pub_names); - foreach(lc, MySubscription->publications) - { - if (foreach_current_index(lc) > 0) - appendStringInfoString(&pub_names, ", "); - appendStringInfoString(&pub_names, quote_literal_cstr(strVal(lfirst(lc)))); - } + /* Build the pub_names comma-separated string. */ + pub_names = makeStringInfo(); + GetPublicationsStr(MySubscription->publications, pub_names, true); /* * Fetch info about column lists for the relation (from all the @@ -881,7 +876,7 @@ fetch_remote_table_info(char *nspname, char *relname, " WHERE gpt.relid = %u AND c.oid = gpt.relid" " AND p.pubname IN ( %s )", lrel->remoteid, - pub_names.data); + pub_names->data); pubres = walrcv_exec(LogRepWorkerWalRcvConn, cmd.data, lengthof(attrsRow), attrsRow); @@ -936,8 +931,6 @@ fetch_remote_table_info(char *nspname, char *relname, ExecDropSingleTupleTableSlot(tslot); walrcv_clear_result(pubres); - - pfree(pub_names.data); } /* @@ -1039,19 +1032,8 @@ fetch_remote_table_info(char *nspname, char *relname, */ if (walrcv_server_version(LogRepWorkerWalRcvConn) >= 150000) { - StringInfoData pub_names; - - /* Build the pubname list. */ - initStringInfo(&pub_names); - foreach_node(String, pubstr, MySubscription->publications) - { - char *pubname = strVal(pubstr); - - if (foreach_current_index(pubstr) > 0) - appendStringInfoString(&pub_names, ", "); - - appendStringInfoString(&pub_names, quote_literal_cstr(pubname)); - } + /* Reuse the already-built pub_names. */ + Assert(pub_names != NULL); /* Check for row filters. */ resetStringInfo(&cmd); @@ -1062,7 +1044,7 @@ fetch_remote_table_info(char *nspname, char *relname, " WHERE gpt.relid = %u" " AND p.pubname IN ( %s )", lrel->remoteid, - pub_names.data); + pub_names->data); res = walrcv_exec(LogRepWorkerWalRcvConn, cmd.data, 1, qualRow); @@ -1101,6 +1083,7 @@ fetch_remote_table_info(char *nspname, char *relname, ExecDropSingleTupleTableSlot(slot); walrcv_clear_result(res); + destroyStringInfo(pub_names); } pfree(cmd.data); |