Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w1xQP-000kjX-2P for pgsql-hackers@arkaria.postgresql.org; Mon, 16 Mar 2026 02:11:22 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w1xQM-006tfv-1k for pgsql-hackers@arkaria.postgresql.org; Mon, 16 Mar 2026 02:11:19 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w1xQL-006tfk-3D for pgsql-hackers@lists.postgresql.org; Mon, 16 Mar 2026 02:11:18 +0000 Received: from mail-pl1-x634.google.com ([2607:f8b0:4864:20::634]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w1xQJ-00000000KK4-3PIF for pgsql-hackers@postgresql.org; Mon, 16 Mar 2026 02:11:17 +0000 Received: by mail-pl1-x634.google.com with SMTP id d9443c01a7336-2a8fba3f769so18570225ad.2 for ; Sun, 15 Mar 2026 19:11:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773627075; x=1774231875; darn=postgresql.org; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:from:to:cc:subject:date:message-id:reply-to; bh=8xnWZKi1weopSwoJl0twIU9Yq8O6+dyTTt3LfpqzW+E=; b=jXWTx2gOky/qzQ0WYRNIDRxUek6nSYxe7vJ/UnABHYmyREhzZ6x8TCJ+6a+BExvVjc M6L4vA5TZBw8SPEpEmWXEb0UbgQiCmAu89RJOBQRsrL+cr116vwSfEMafWjC6Vh4WHWb 7h4Ahad01vR7GF02Ux0SaiYFQUhfkS3mac7PE3Tb5ZITIGF8YD9aCS/wkXot00b/H5Kp M+8fy9NZQYUk2P/h2aZbAinvnDdEFbclPnUlm1WIVdNChEwOT67mMhdu7n/QiwSRxgqO fYNUT66Jbi/lI64Mg/gEXB3IbFHElSs0/y9tKkgDoKPtxt/3lV+DsJj8v9vMdDh2x+4Y G+5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773627075; x=1774231875; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=8xnWZKi1weopSwoJl0twIU9Yq8O6+dyTTt3LfpqzW+E=; b=nsyQx7KPxOyA1fS75bfq3Y64TjkNKrEC6KVamiGG0G/li/JmmGPozaSS1Fena6KPTT PxmmvE/93W3jQaneq7xE3f5K4jNs8EzfJ6UliHw00cK9yRQPDkUbSwUMMudSXdGkKSO0 IW9qkjacknkqTMW+DyxOBG6TW2i0CsKBi8bPrfa2n67w4oBtDb0tnI6Tw1w0/BiYUH5P a64caSG9jVhPwclVSvbCtNnX6EyzRqoyCECMX41ma7LbxHclfdsJ1/xgjrbQxC0eLSLB Wds5lyEcsfcxk0RYpZpdrUHgTxMHfRLpzHbGbSGucsoAbQEFi68QBhZoZNQpIYXddWNf /acg== X-Forwarded-Encrypted: i=1; AJvYcCUqfzlqFAZwcLajpU3gdMbEjobp8f9YQExrIjBXfWW6stoOM/n0NwX95HGrKk5uPKneBxYQ+XXdN3+/B7KK@postgresql.org X-Gm-Message-State: AOJu0YzOlsiuD2h29FC8ThnE1CFUVDmZb4NKR6zFt5SIxEJkApl1D31P 7xXfOgx1pKciTQLBByao4l8RBl2Q/jQ8t7Xp48dVn5YXmAHw6k+XTxwa X-Gm-Gg: ATEYQzyy2W9axOwgRjebunkda1nbR9pyLJWFqg0lah+Sb7neCC5jXKn1ukXxeNstm48 /6yEgf4ICxmYgWZYmIKsrqKw4vDnkg+6CKYT8JKgTAkC2KxWS3cQH/e/N/JLSoioxgaKvDMGAKs mmKv0sOWJDELzaETMxrBi2+n5VrEJM0khfeeVIh9NVAFRkfu9hwNHSVoWaZScHy0Sn3EKWZ6Qnx TDOPi1Fc8QBvav8OQeJ7ahGp30AQwYT2xPHmsvcPDtj9jc08KxXJTfrILJZXQaJjcl7pKTr37St 2jdGRJFck+ZNz0FNsTWBViukboCTdqowburOki8xUPpCV6nF8PAiENUaGEcGZyRmVhNIiyQwAGt JgSaUlCm0vQTf8w7Xc2Qm3Ay7FVHYGk0r/O6dzE1Y4WHMMgmxzS1mT8QxBffbuOpgP+HvibvWmC l4WnmDDx3CS+Fj9Mqp/CXM7Mr4ayvhUEeBfskY9C1lGg== X-Received: by 2002:a17:902:da88:b0:2b0:5661:e118 with SMTP id d9443c01a7336-2b05661ecfdmr20907255ad.53.1773627075035; Sun, 15 Mar 2026 19:11:15 -0700 (PDT) Received: from smtpclient.apple ([45.32.121.103]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2aece81afccsm89974725ad.68.2026.03.15.19.11.11 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sun, 15 Mar 2026 19:11:13 -0700 (PDT) From: Chao Li Message-Id: Content-Type: multipart/mixed; boundary="Apple-Mail=_CEB0C1A7-BFFD-4A55-A6BC-DF691D08D9B5" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3864.400.21\)) Subject: Re: Add missing stats_reset column to pg_stat_database_conflicts view Date: Mon, 16 Mar 2026 10:10:34 +0800 In-Reply-To: Cc: Sami Imseih , shihao zhong , Kirill Reshke , PostgreSQL-development To: Fujii Masao References: <7C8AB453-8353-4D79-AA97-62177D631A18@gmail.com> <126F5EBD-16EB-4786-8A65-8D1BCC0F20D7@gmail.com> X-Mailer: Apple Mail (2.3864.400.21) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --Apple-Mail=_CEB0C1A7-BFFD-4A55-A6BC-DF691D08D9B5 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On Mar 13, 2026, at 21:25, Fujii Masao wrote: >=20 > On Fri, Mar 13, 2026 at 5:47=E2=80=AFPM Chao Li = wrote: >>=20 >>=20 >>=20 >>> On Mar 13, 2026, at 04:39, Sami Imseih wrote: >>>=20 >>>> I also made some cosmetic indentation fixes in the docs. >>>> The v6 patch is attached. >>>=20 >>> Just one more minor comment fix I noticed. >>>=20 >>> "Test that reset works for pg_stat_database" >>>=20 >>> to: >>>=20 >>> "Test that reset works for pg_stat_database and = pg_stat_database_conflicts" >>>=20 >>> -- >>> Sami >>> >=20 > I've pushed the patch. Thanks! >=20 >=20 >> I still saw (SELECT current_database()) in v7. Does it have any = special meaning than just current_database()? >=20 > No. I think it was used by the patch simply because the existing tests > for stats reset already use it. >=20 > Regards, >=20 > --=20 > Fujii Masao Hi Fujii-san, If the only reason for using (SELECT current_database()) is to follow = the existing code, would it make sense to update the code to use = current_database() instead? Looking at the execution plans below: ``` evantest=3D# explain select (select current_database()); QUERY PLAN --------------------------------------------------- Result (cost=3D0.01..0.02 rows=3D1 width=3D64) InitPlan expr_1 -> Result (cost=3D0.00..0.01 rows=3D1 width=3D64) (3 rows) evantest=3D# explain select current_database(); QUERY PLAN ------------------------------------------- Result (cost=3D0.00..0.01 rows=3D1 width=3D64) (1 row) ``` The nested SELECT introduces an unnecessary InitPlan, which adds extra = work to execute. Another point is that the nested SELECT may mislead users or code = readers into thinking it is required. For example, I often look at = regression test scripts to check how SQL statements are used in = practice, and I consider them an important source of reference. Because = of that, I think it's better for the test scripts to demonstrate the = simplest and most appropriate usage when possible. I searched through the test scripts, and it looks like only stats.sql = uses this pattern. So I attached a small patch that replaces all (SELECT = current_database()) with current_database(). Best regards, -- Chao Li (Evan) HighGo Software Co., Ltd. https://www.highgo.com/ --Apple-Mail=_CEB0C1A7-BFFD-4A55-A6BC-DF691D08D9B5 Content-Disposition: attachment; filename=v1-0001-regress-remove-unnecessary-subquery-around-curren.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v1-0001-regress-remove-unnecessary-subquery-around-curren.patch" Content-Transfer-Encoding: quoted-printable =46rom=2052891896d06c9ffba01dde369d47cf02f441185f=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Mon,=2016=20Mar=202026=2010:01:11=20+0800=0ASubject:=20[PATCH=20= v1]=20regress:=20remove=20unnecessary=20subquery=20around=0A=20= current_database()=0A=0AReplace=20uses=20of=20(SELECT=20= current_database())=20with=20current_database()=0Ain=20stats.sql=20and=20= the=20corresponding=20expected=20output.=0A=0AAuthor:=20Chao=20Li=20= =0A---=0A=20src/test/regress/expected/stats.out=20|=2012=20= ++++++------=0A=20src/test/regress/sql/stats.sql=20=20=20=20=20=20|=2012=20= ++++++------=0A=202=20files=20changed,=2012=20insertions(+),=2012=20= deletions(-)=0A=0Adiff=20--git=20a/src/test/regress/expected/stats.out=20= b/src/test/regress/expected/stats.out=0Aindex=20981d7c90822..0917d2c1266=20= 100644=0A---=20a/src/test/regress/expected/stats.out=0A+++=20= b/src/test/regress/expected/stats.out=0A@@=20-931,7=20+931,7=20@@=20= SELECT=20(n_tup_ins=20+=20n_tup_upd)=20>=200=20AS=20has_data=20FROM=20= pg_stat_all_tables=0A=20--=20Test=20that=20various=20stats=20views=20are=20= being=20properly=20populated=0A=20-----=0A=20--=20Test=20that=20sessions=20= is=20incremented=20when=20a=20new=20session=20is=20started=20in=20= pg_stat_database=0A-SELECT=20sessions=20AS=20db_stat_sessions=20FROM=20= pg_stat_database=20WHERE=20datname=20=3D=20(SELECT=20current_database())=20= \gset=0A+SELECT=20sessions=20AS=20db_stat_sessions=20FROM=20= pg_stat_database=20WHERE=20datname=20=3D=20current_database()=20\gset=0A=20= \c=0A=20SELECT=20pg_stat_force_next_flush();=0A=20=20= pg_stat_force_next_flush=20=0A@@=20-939,7=20+939,7=20@@=20SELECT=20= pg_stat_force_next_flush();=0A=20=20=0A=20(1=20row)=0A=20=0A-SELECT=20= sessions=20>=20:db_stat_sessions=20FROM=20pg_stat_database=20WHERE=20= datname=20=3D=20(SELECT=20current_database());=0A+SELECT=20sessions=20>=20= :db_stat_sessions=20FROM=20pg_stat_database=20WHERE=20datname=20=3D=20= current_database();=0A=20=20?column?=20=0A=20----------=0A=20=20t=0A@@=20= -1141,8=20+1141,8=20@@=20SELECT=20pg_stat_reset();=0A=20=20=0A=20(1=20= row)=0A=20=0A-SELECT=20stats_reset=20AS=20db_reset_ts=20FROM=20= pg_stat_database=20WHERE=20datname=20=3D=20(SELECT=20current_database())=20= \gset=0A-SELECT=20stats_reset=20AS=20dbc_reset_ts=20FROM=20= pg_stat_database_conflicts=20WHERE=20datname=20=3D=20(SELECT=20= current_database())=20\gset=0A+SELECT=20stats_reset=20AS=20db_reset_ts=20= FROM=20pg_stat_database=20WHERE=20datname=20=3D=20current_database()=20= \gset=0A+SELECT=20stats_reset=20AS=20dbc_reset_ts=20FROM=20= pg_stat_database_conflicts=20WHERE=20datname=20=3D=20current_database()=20= \gset=0A=20SELECT=20:'db_reset_ts'::timestamptz=20=3D=20= :'dbc_reset_ts'::timestamptz;=0A=20=20?column?=20=0A=20----------=0A@@=20= -1155,13=20+1155,13=20@@=20SELECT=20pg_stat_reset();=0A=20=20=0A=20(1=20= row)=0A=20=0A-SELECT=20stats_reset=20>=20:'db_reset_ts'::timestamptz=20= FROM=20pg_stat_database=20WHERE=20datname=20=3D=20(SELECT=20= current_database());=0A+SELECT=20stats_reset=20>=20= :'db_reset_ts'::timestamptz=20FROM=20pg_stat_database=20WHERE=20datname=20= =3D=20current_database();=0A=20=20?column?=20=0A=20----------=0A=20=20t=0A= =20(1=20row)=0A=20=0A-SELECT=20stats_reset=20>=20= :'dbc_reset_ts'::timestamptz=20FROM=20pg_stat_database_conflicts=20WHERE=20= datname=20=3D=20(SELECT=20current_database());=0A+SELECT=20stats_reset=20= >=20:'dbc_reset_ts'::timestamptz=20FROM=20pg_stat_database_conflicts=20= WHERE=20datname=20=3D=20current_database();=0A=20=20?column?=20=0A=20= ----------=0A=20=20t=0Adiff=20--git=20a/src/test/regress/sql/stats.sql=20= b/src/test/regress/sql/stats.sql=0Aindex=2070af96f739f..f782f5f80b5=20= 100644=0A---=20a/src/test/regress/sql/stats.sql=0A+++=20= b/src/test/regress/sql/stats.sql=0A@@=20-432,10=20+432,10=20@@=20SELECT=20= (n_tup_ins=20+=20n_tup_upd)=20>=200=20AS=20has_data=20FROM=20= pg_stat_all_tables=0A=20-----=0A=20=0A=20--=20Test=20that=20sessions=20= is=20incremented=20when=20a=20new=20session=20is=20started=20in=20= pg_stat_database=0A-SELECT=20sessions=20AS=20db_stat_sessions=20FROM=20= pg_stat_database=20WHERE=20datname=20=3D=20(SELECT=20current_database())=20= \gset=0A+SELECT=20sessions=20AS=20db_stat_sessions=20FROM=20= pg_stat_database=20WHERE=20datname=20=3D=20current_database()=20\gset=0A=20= \c=0A=20SELECT=20pg_stat_force_next_flush();=0A-SELECT=20sessions=20>=20= :db_stat_sessions=20FROM=20pg_stat_database=20WHERE=20datname=20=3D=20= (SELECT=20current_database());=0A+SELECT=20sessions=20>=20= :db_stat_sessions=20FROM=20pg_stat_database=20WHERE=20datname=20=3D=20= current_database();=0A=20=0A=20--=20Test=20pg_stat_checkpointer=20= checkpointer-related=20stats,=20together=20with=20pg_stat_wal=0A=20= SELECT=20num_requested=20AS=20rqst_ckpts_before=20FROM=20= pg_stat_checkpointer=20\gset=0A@@=20-529,12=20+529,12=20@@=20SELECT=20= pg_stat_reset_shared('unknown');=0A=20--=20have=20a=20baseline=20for=20= comparison.=20The=20same=20for=20pg_stat_database_conflicts=20as=20it=20= shares=0A=20--=20the=20same=20stats_reset=20as=20pg_stat_database.=0A=20= SELECT=20pg_stat_reset();=0A-SELECT=20stats_reset=20AS=20db_reset_ts=20= FROM=20pg_stat_database=20WHERE=20datname=20=3D=20(SELECT=20= current_database())=20\gset=0A-SELECT=20stats_reset=20AS=20dbc_reset_ts=20= FROM=20pg_stat_database_conflicts=20WHERE=20datname=20=3D=20(SELECT=20= current_database())=20\gset=0A+SELECT=20stats_reset=20AS=20db_reset_ts=20= FROM=20pg_stat_database=20WHERE=20datname=20=3D=20current_database()=20= \gset=0A+SELECT=20stats_reset=20AS=20dbc_reset_ts=20FROM=20= pg_stat_database_conflicts=20WHERE=20datname=20=3D=20current_database()=20= \gset=0A=20SELECT=20:'db_reset_ts'::timestamptz=20=3D=20= :'dbc_reset_ts'::timestamptz;=0A=20SELECT=20pg_stat_reset();=0A-SELECT=20= stats_reset=20>=20:'db_reset_ts'::timestamptz=20FROM=20pg_stat_database=20= WHERE=20datname=20=3D=20(SELECT=20current_database());=0A-SELECT=20= stats_reset=20>=20:'dbc_reset_ts'::timestamptz=20FROM=20= pg_stat_database_conflicts=20WHERE=20datname=20=3D=20(SELECT=20= current_database());=0A+SELECT=20stats_reset=20>=20= :'db_reset_ts'::timestamptz=20FROM=20pg_stat_database=20WHERE=20datname=20= =3D=20current_database();=0A+SELECT=20stats_reset=20>=20= :'dbc_reset_ts'::timestamptz=20FROM=20pg_stat_database_conflicts=20WHERE=20= datname=20=3D=20current_database();=0A=20=0A=20=0A=20----=0A--=20=0A= 2.50.1=20(Apple=20Git-155)=0A=0A= --Apple-Mail=_CEB0C1A7-BFFD-4A55-A6BC-DF691D08D9B5--