On Mon, Apr 12, 2021 at 02:56:59PM +0800, Julien Rouhaud wrote: > I think we should simply document that %Q is not compatible with > log_statements.
Hearing no objection I documented that limitation. > > > While making the feature run on some test server, I have noticed that > > %Q would log some garbage query ID for autovacuum workers that's kept > > around. That looks wrong. > > I've not been able to reproduce it, do you have some hint on how to do it? > > Maybe setting a zero queryid at the beginning of AutoVacWorkerMain() could fix > the problem? It turns out that the problem was simply that some process can inherit a PgBackendStatus for which a previous backend reported a queryid. For processes like autovacuum process, they will never report a new identifier so they reported the previous one. Resetting the field like the other ones in pgstat_bestart() fixes the problem for autovacuum and any similar process.
>From eb8a90b88d8572b110535c6350830cf58632fecd Mon Sep 17 00:00:00 2001 From: Julien Rouhaud <julien.rouh...@free.fr> Date: Thu, 15 Apr 2021 15:28:03 +0800 Subject: [PATCH v1] Additional fixes for compute_query_id. Statements logged by log_statement parameter always get a zero queryid. This is a limitation due to how log_statement is implemented, as it logs all wanted synctatically valid statements before an indentifier can be calculated, including invalid statements such as SELECT not_a_column; for which an identifier can't be calculated, so document that limitation. It was also possible that a new process ends up emitting logs with an incorrect query identifier if the previous PgBackendStatus user reported an identifier as the pgstat field wasn't correctly reset. Author: Julien Rouhaud Reported-by: Fuji Masao Reported-by: Michael Paquier Discussion: https://postgr.es/m/yhpku8hfi4no4...@paquier.xyz --- doc/src/sgml/config.sgml | 10 ++++++++++ src/backend/utils/activity/backend_status.c | 1 + 2 files changed, 11 insertions(+) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 776ab1a8c8..d5735b72c8 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -7139,6 +7139,16 @@ log_line_prefix = '%m [%p] %q%u@%d/%a ' </programlisting> </para> </tip> + + <note> + <para> + The <literal>%Q</literal> escape will always report a zero identifier + when used together with <xref linkend="guc-log-statement"/> as this + parameter logs statements before an identifier can be calculated, + including invalid statements for which an identifier cannot be + calculated. + </para> + </note> </listitem> </varlistentry> diff --git a/src/backend/utils/activity/backend_status.c b/src/backend/utils/activity/backend_status.c index 6110113e56..80ffcdf6de 100644 --- a/src/backend/utils/activity/backend_status.c +++ b/src/backend/utils/activity/backend_status.c @@ -398,6 +398,7 @@ pgstat_bestart(void) lbeentry.st_state = STATE_UNDEFINED; lbeentry.st_progress_command = PROGRESS_COMMAND_INVALID; lbeentry.st_progress_command_target = InvalidOid; + lbeentry.st_queryid = UINT64CONST(0); /* * we don't zero st_progress_param here to save cycles; nobody should -- 2.30.1