aboutsummaryrefslogtreecommitdiff
path: root/contrib/postgres_fdw/connection.c
diff options
context:
space:
mode:
authorFujii Masao <fujii@postgresql.org>2021-12-24 16:55:11 +0900
committerFujii Masao <fujii@postgresql.org>2021-12-24 16:55:11 +0900
commit6e0cb3dec10e460288d68a128e3d79d16a230cdb (patch)
tree5d106381fe2fa91fb9b0dbf3a81061c7d9356764 /contrib/postgres_fdw/connection.c
parent94226d4506e66d6e7cbf4b391f1e7393c1962841 (diff)
downloadpostgresql-6e0cb3dec10e460288d68a128e3d79d16a230cdb.tar.gz
postgresql-6e0cb3dec10e460288d68a128e3d79d16a230cdb.zip
postgres_fdw: Allow postgres_fdw.application_name to include escape sequences.
application_name that used when postgres_fdw establishes a connection to a foreign server can be specified in either or both a connection parameter of a server object and GUC postgres_fdw.application_name. This commit allows those parameters to include escape sequences that begins with % character. Then postgres_fdw replaces those escape sequences with status information. For example, %d and %u are replaced with user name and database name in local server, respectively. This feature enables us to add information more easily to track remote transactions or queries, into application_name of a remote connection. Author: Hayato Kuroda Reviewed-by: Kyotaro Horiguchi, Masahiro Ikeda, Hou Zhijie, Fujii Masao Discussion: https://postgr.es/m/TYAPR01MB5866FAE71C66547C64616584F5EB9@TYAPR01MB5866.jpnprd01.prod.outlook.com Discussion: https://postgr.es/m/TYCPR01MB5870D1E8B949DAF6D3B84E02F5F29@TYCPR01MB5870.jpnprd01.prod.outlook.com
Diffstat (limited to 'contrib/postgres_fdw/connection.c')
-rw-r--r--contrib/postgres_fdw/connection.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c
index 6bac4ad23eb..80db19e401c 100644
--- a/contrib/postgres_fdw/connection.c
+++ b/contrib/postgres_fdw/connection.c
@@ -348,6 +348,7 @@ connect_pg_server(ForeignServer *server, UserMapping *user)
{
const char **keywords;
const char **values;
+ char *appname = NULL;
int n;
/*
@@ -383,6 +384,39 @@ connect_pg_server(ForeignServer *server, UserMapping *user)
n++;
}
+ /*
+ * Search the parameter arrays to find application_name setting, and
+ * replace escape sequences in it with status information if found.
+ * The arrays are searched backwards because the last value is used if
+ * application_name is repeatedly set.
+ */
+ for (int i = n - 1; i >= 0; i--)
+ {
+ if (strcmp(keywords[i], "application_name") == 0 &&
+ *(values[i]) != '\0')
+ {
+ /*
+ * Use this application_name setting if it's not empty string
+ * even after any escape sequences in it are replaced.
+ */
+ appname = process_pgfdw_appname(values[i]);
+ if (appname[0] != '\0')
+ {
+ values[i] = appname;
+ break;
+ }
+
+ /*
+ * This empty application_name is not used, so we set
+ * values[i] to NULL and keep searching the array to find the
+ * next one.
+ */
+ values[i] = NULL;
+ pfree(appname);
+ appname = NULL;
+ }
+ }
+
/* Use "postgres_fdw" as fallback_application_name */
keywords[n] = "fallback_application_name";
values[n] = "postgres_fdw";
@@ -452,6 +486,8 @@ connect_pg_server(ForeignServer *server, UserMapping *user)
/* Prepare new session for use */
configure_remote_session(conn);
+ if (appname != NULL)
+ pfree(appname);
pfree(keywords);
pfree(values);
}