Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit248c2d1

Browse files
committed
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 attwo locations of the tablesync code where the same logic was duplicated.fetch_remote_table_info() was doing two List->StringInfo conversionswhen dealing with a server of version 15 or newer. The conversionhappens only once now.This refactoring leads to less code overall.Author: Peter SmithReviewed-by: Michael Paquier, Masahiko SawadaDiscussion:https://postgr.es/m/CAHut+PtJMk4bKXqtpvqVy9ckknCgK9P6=FeG8zHF=6+Em_Snpw@mail.gmail.com
1 parent1564339 commit248c2d1

File tree

4 files changed

+58
-73
lines changed

4 files changed

+58
-73
lines changed

‎src/backend/catalog/pg_subscription.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,37 @@
3434

3535
staticList*textarray_to_stringlist(ArrayType*textarray);
3636

37+
/*
38+
* Add a comma-separated list of publication names to the 'dest' string.
39+
*/
40+
void
41+
GetPublicationsStr(List*publications,StringInfodest,boolquote_literal)
42+
{
43+
ListCell*lc;
44+
boolfirst= true;
45+
46+
Assert(publications!=NIL);
47+
48+
foreach(lc,publications)
49+
{
50+
char*pubname=strVal(lfirst(lc));
51+
52+
if (first)
53+
first= false;
54+
else
55+
appendStringInfoString(dest,", ");
56+
57+
if (quote_literal)
58+
appendStringInfoString(dest,quote_literal_cstr(pubname));
59+
else
60+
{
61+
appendStringInfoChar(dest,'"');
62+
appendStringInfoString(dest,pubname);
63+
appendStringInfoChar(dest,'"');
64+
}
65+
}
66+
}
67+
3768
/*
3869
* Fetch the subscription from the syscache.
3970
*/

‎src/backend/commands/subscriptioncmds.c

Lines changed: 14 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -439,37 +439,6 @@ parse_subscription_options(ParseState *pstate, List *stmt_options,
439439
}
440440
}
441441

442-
/*
443-
* Add publication names from the list to a string.
444-
*/
445-
staticvoid
446-
get_publications_str(List*publications,StringInfodest,boolquote_literal)
447-
{
448-
ListCell*lc;
449-
boolfirst= true;
450-
451-
Assert(publications!=NIL);
452-
453-
foreach(lc,publications)
454-
{
455-
char*pubname=strVal(lfirst(lc));
456-
457-
if (first)
458-
first= false;
459-
else
460-
appendStringInfoString(dest,", ");
461-
462-
if (quote_literal)
463-
appendStringInfoString(dest,quote_literal_cstr(pubname));
464-
else
465-
{
466-
appendStringInfoChar(dest,'"');
467-
appendStringInfoString(dest,pubname);
468-
appendStringInfoChar(dest,'"');
469-
}
470-
}
471-
}
472-
473442
/*
474443
* Check that the specified publications are present on the publisher.
475444
*/
@@ -486,7 +455,7 @@ check_publications(WalReceiverConn *wrconn, List *publications)
486455
appendStringInfoString(cmd,"SELECT t.pubname FROM\n"
487456
" pg_catalog.pg_publication t WHERE\n"
488457
" t.pubname IN (");
489-
get_publications_str(publications,cmd, true);
458+
GetPublicationsStr(publications,cmd, true);
490459
appendStringInfoChar(cmd,')');
491460

492461
res=walrcv_exec(wrconn,cmd->data,1,tableRow);
@@ -523,7 +492,7 @@ check_publications(WalReceiverConn *wrconn, List *publications)
523492
/* Prepare the list of non-existent publication(s) for error message. */
524493
StringInfopubnames=makeStringInfo();
525494

526-
get_publications_str(publicationsCopy,pubnames, false);
495+
GetPublicationsStr(publicationsCopy,pubnames, false);
527496
ereport(WARNING,
528497
errcode(ERRCODE_UNDEFINED_OBJECT),
529498
errmsg_plural("publication %s does not exist on the publisher",
@@ -2151,7 +2120,7 @@ check_publications_origin(WalReceiverConn *wrconn, List *publications,
21512120
" JOIN pg_subscription_rel PS ON (GPT.relid = PS.srrelid),\n"
21522121
" pg_class C JOIN pg_namespace N ON (N.oid = C.relnamespace)\n"
21532122
"WHERE C.oid = GPT.relid AND P.pubname IN (");
2154-
get_publications_str(publications,&cmd, true);
2123+
GetPublicationsStr(publications,&cmd, true);
21552124
appendStringInfoString(&cmd,")\n");
21562125

21572126
/*
@@ -2208,7 +2177,7 @@ check_publications_origin(WalReceiverConn *wrconn, List *publications,
22082177
StringInfopubnames=makeStringInfo();
22092178

22102179
/* Prepare the list of publication(s) for warning message. */
2211-
get_publications_str(publist,pubnames, false);
2180+
GetPublicationsStr(publist,pubnames, false);
22122181
ereport(WARNING,
22132182
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
22142183
errmsg("subscription \"%s\" requested copy_data with origin = NONE but might copy data that had a different origin",
@@ -2243,17 +2212,17 @@ fetch_table_list(WalReceiverConn *wrconn, List *publications)
22432212
List*tablelist=NIL;
22442213
intserver_version=walrcv_server_version(wrconn);
22452214
boolcheck_columnlist= (server_version >=150000);
2215+
StringInfopub_names=makeStringInfo();
22462216

22472217
initStringInfo(&cmd);
22482218

2219+
/* Build the pub_names comma-separated string. */
2220+
GetPublicationsStr(publications,pub_names, true);
2221+
22492222
/* Get the list of tables from the publisher. */
22502223
if (server_version >=160000)
22512224
{
2252-
StringInfoDatapub_names;
2253-
22542225
tableRow[2]=INT2VECTOROID;
2255-
initStringInfo(&pub_names);
2256-
get_publications_str(publications,&pub_names, true);
22572226

22582227
/*
22592228
* From version 16, we allowed passing multiple publications to the
@@ -2275,9 +2244,7 @@ fetch_table_list(WalReceiverConn *wrconn, List *publications)
22752244
" FROM pg_publication\n"
22762245
" WHERE pubname IN ( %s )) AS gpt\n"
22772246
" ON gpt.relid = c.oid\n",
2278-
pub_names.data);
2279-
2280-
pfree(pub_names.data);
2247+
pub_names->data);
22812248
}
22822249
else
22832250
{
@@ -2288,12 +2255,13 @@ fetch_table_list(WalReceiverConn *wrconn, List *publications)
22882255
if (check_columnlist)
22892256
appendStringInfoString(&cmd,", t.attnames\n");
22902257

2291-
appendStringInfoString(&cmd,"FROM pg_catalog.pg_publication_tables t\n"
2292-
" WHERE t.pubname IN (");
2293-
get_publications_str(publications,&cmd, true);
2294-
appendStringInfoChar(&cmd,')');
2258+
appendStringInfo(&cmd,"FROM pg_catalog.pg_publication_tables t\n"
2259+
" WHERE t.pubname IN ( %s )",
2260+
pub_names->data);
22952261
}
22962262

2263+
destroyStringInfo(pub_names);
2264+
22972265
res=walrcv_exec(wrconn,cmd.data,check_columnlist ?3 :2,tableRow);
22982266
pfree(cmd.data);
22992267

‎src/backend/replication/logical/tablesync.c

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,7 @@ fetch_remote_table_info(char *nspname, char *relname,
802802
OidqualRow[]= {TEXTOID};
803803
boolisnull;
804804
intnatt;
805-
ListCell*lc;
805+
StringInfopub_names=NULL;
806806
Bitmapset*included_cols=NULL;
807807

808808
lrel->nspname=nspname;
@@ -856,15 +856,10 @@ fetch_remote_table_info(char *nspname, char *relname,
856856
WalRcvExecResult*pubres;
857857
TupleTableSlot*tslot;
858858
OidattrsRow[]= {INT2VECTOROID};
859-
StringInfoDatapub_names;
860859

861-
initStringInfo(&pub_names);
862-
foreach(lc,MySubscription->publications)
863-
{
864-
if (foreach_current_index(lc)>0)
865-
appendStringInfoString(&pub_names,", ");
866-
appendStringInfoString(&pub_names,quote_literal_cstr(strVal(lfirst(lc))));
867-
}
860+
/* Build the pub_names comma-separated string. */
861+
pub_names=makeStringInfo();
862+
GetPublicationsStr(MySubscription->publications,pub_names, true);
868863

869864
/*
870865
* Fetch info about column lists for the relation (from all the
@@ -881,7 +876,7 @@ fetch_remote_table_info(char *nspname, char *relname,
881876
" WHERE gpt.relid = %u AND c.oid = gpt.relid"
882877
" AND p.pubname IN ( %s )",
883878
lrel->remoteid,
884-
pub_names.data);
879+
pub_names->data);
885880

886881
pubres=walrcv_exec(LogRepWorkerWalRcvConn,cmd.data,
887882
lengthof(attrsRow),attrsRow);
@@ -936,8 +931,6 @@ fetch_remote_table_info(char *nspname, char *relname,
936931
ExecDropSingleTupleTableSlot(tslot);
937932

938933
walrcv_clear_result(pubres);
939-
940-
pfree(pub_names.data);
941934
}
942935

943936
/*
@@ -1039,19 +1032,8 @@ fetch_remote_table_info(char *nspname, char *relname,
10391032
*/
10401033
if (walrcv_server_version(LogRepWorkerWalRcvConn) >=150000)
10411034
{
1042-
StringInfoDatapub_names;
1043-
1044-
/* Build the pubname list. */
1045-
initStringInfo(&pub_names);
1046-
foreach_node(String,pubstr,MySubscription->publications)
1047-
{
1048-
char*pubname=strVal(pubstr);
1049-
1050-
if (foreach_current_index(pubstr)>0)
1051-
appendStringInfoString(&pub_names,", ");
1052-
1053-
appendStringInfoString(&pub_names,quote_literal_cstr(pubname));
1054-
}
1035+
/* Reuse the already-built pub_names. */
1036+
Assert(pub_names!=NULL);
10551037

10561038
/* Check for row filters. */
10571039
resetStringInfo(&cmd);
@@ -1062,7 +1044,7 @@ fetch_remote_table_info(char *nspname, char *relname,
10621044
" WHERE gpt.relid = %u"
10631045
" AND p.pubname IN ( %s )",
10641046
lrel->remoteid,
1065-
pub_names.data);
1047+
pub_names->data);
10661048

10671049
res=walrcv_exec(LogRepWorkerWalRcvConn,cmd.data,1,qualRow);
10681050

@@ -1101,6 +1083,7 @@ fetch_remote_table_info(char *nspname, char *relname,
11011083
ExecDropSingleTupleTableSlot(slot);
11021084

11031085
walrcv_clear_result(res);
1086+
destroyStringInfo(pub_names);
11041087
}
11051088

11061089
pfree(cmd.data);

‎src/include/catalog/pg_subscription.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#include"access/xlogdefs.h"
2121
#include"catalog/genbki.h"
2222
#include"catalog/pg_subscription_d.h"
23-
23+
#include"lib/stringinfo.h"
2424
#include"nodes/pg_list.h"
2525

2626
/*
@@ -180,4 +180,7 @@ extern void DisableSubscription(Oid subid);
180180

181181
externintCountDBSubscriptions(Oiddbid);
182182

183+
externvoidGetPublicationsStr(List*publications,StringInfodest,
184+
boolquote_literal);
185+
183186
#endif/* PG_SUBSCRIPTION_H */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp