mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
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
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user