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 1wB4oc-000iGW-0I for pgsql-hackers@arkaria.postgresql.org; Fri, 10 Apr 2026 05:54:02 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wB4oa-009T3S-1D for pgsql-hackers@arkaria.postgresql.org; Fri, 10 Apr 2026 05:54:01 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wB4oa-009T3K-0C for pgsql-hackers@lists.postgresql.org; Fri, 10 Apr 2026 05:54:00 +0000 Received: from mail-pg1-x530.google.com ([2607:f8b0:4864:20::530]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wB4oY-00000000Ilr-1zPm for pgsql-hackers@postgresql.org; Fri, 10 Apr 2026 05:54:00 +0000 Received: by mail-pg1-x530.google.com with SMTP id 41be03b00d2f7-c76d797b180so959485a12.2 for ; Thu, 09 Apr 2026 22:53:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775800435; x=1776405235; darn=postgresql.org; h=to:date:message-id:subject:mime-version:from:from:to:cc:subject :date:message-id:reply-to; bh=XDXk1F5aPVqJN4+1W5xkpjlZ8oUs9CPlXIb+Ak7fE1k=; b=F+BcmEIQx9BxvVMPFZgAcs7rN//ykJZ4dW/kFWoztV4vclXfgIlu/wbx5zBc9q8OIA +4y4q+Pft6k7ONBdG6uBEsSAi7hu2LudKcs/rT/B88Kz2I3dLAqd9QZ2Z+pgmREiOnmz HAVJcGzmxbM1qulrAEo0J2zRwgLFZQGlacT8G5ABBI+ZNi4V+25mQvmvoncsCihSWwYK DLRAVfUlv1QI8PLxAaZuoYEru20SqHSO9g0hPeoVh4WEmiYfxT5h+Ng1x+SmmfqZXF1l tRkYBJAhNQWtirJI1BbWpZnpv3j9/cXvF3YLDb3J7Mfbpr8dM3AGDd7AC/1d5vrEl6oF COng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775800435; x=1776405235; h=to:date:message-id:subject:mime-version:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=XDXk1F5aPVqJN4+1W5xkpjlZ8oUs9CPlXIb+Ak7fE1k=; b=EzssS+SOPkrrUGKrIu/FNkF+ILD7ZAO07h7IWu96y2TEgEh4w6Tbq/b7/g1t9V5gba pJWfgKsL2qtunrtizCmc4agOr1z7vSOwg70Pk/+d/xWCEyFiMnApX4r3AwDZoGoFH2X7 W4+Q8s+VJcHBp/fN8dhgLBvgUHdFVes2xcpfZEOijSx+L0ljVUjiNJs1XmX+Y+/8xsAp V2FGp+IM6vQjyPa3Tm+AvISHFcN1KznBIDLgrP8yOjfS6WhjotVbjS1Twz8p3pp4edwG sdD0lZq3USxf/K8j3MHyiftoqtU5nJDW2C5Hl4yir+wDdfAK2WGBUe5P4kXETt+cwnHX UZKw== X-Gm-Message-State: AOJu0YznDN/nTw9FQ9Rnj4MI6IgDZYXA+1NlpUpSN0O1WLnIUOWOzAmS LhQmtfiTjY5eXrEHWlFwYMg6Np67t1tIsDDpWsi5rKVFazwJeJaVqipDWs8ICkrwjiaD6g== X-Gm-Gg: AeBDiesTyf5leHs2YpsAl6PjzgGFF0KDvXcr9O1TdVKQ5i+6HcdfZCM7QjULY9CDESR PDcc7ph+bMkxV6Cgh+UdnQxnyGIifAib1Uj/IdboAI4c/6MG61luZhv1vE7U0eG1boo9P3VVIld JfN19V6IX0cBEgRy7vwXcVo2tS5jHTut3OaHcrmWjj2C8Remf1b0rsNd9S5HOxrkUjjRlL2B3Zb vGMERwfCC//u+XfYWF1Kjl0QrLSzBoDldW2MRBSKNXUBjjk62Xz+nFuBqCDXPTVdPWFCkqPOEfQ 4AFcDfkhKnzkqNQr3tcERRk8zcaCUWWnwULJzNpV+9zE6prhc07Z6W5R52oFx92DPnOLaK++N+Q qoxCjP6urLvX96zgbhcRUDJlZKnPYJVVUCGO6NVWPZDs7iLMaqvIDPfmhlQdVh0b49S7I7W4z8V 7maETBQNZqwcYy8YKRiyc9+xWbk7hruls= X-Received: by 2002:a17:90a:d610:b0:35b:929f:7e95 with SMTP id 98e67ed59e1d1-35e42769f6bmr1967976a91.4.1775800434928; Thu, 09 Apr 2026 22:53:54 -0700 (PDT) Received: from smtpclient.apple ([45.32.121.103]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35e41336a20sm2394233a91.14.2026.04.09.22.53.52 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 09 Apr 2026 22:53:54 -0700 (PDT) From: Chao Li Content-Type: multipart/mixed; boundary="Apple-Mail=_ED7C8B70-3C71-4374-B5EB-E61F7AE7A0CE" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3864.400.21\)) Subject: Fix pgstat_database.c to honor passed database OIDs Message-Id: Date: Fri, 10 Apr 2026 13:53:15 +0800 To: PostgreSQL-development 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=_ED7C8B70-3C71-4374-B5EB-E61F7AE7A0CE Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Hi, In pgstat_database.c, pgstat_report_connect(), = pgstat_report_disconnect(), and pgstat_reset_database_timestamp() all = take a dboid parameter, but currently ignore it and use MyDatabaseId = instead. While that does not seem to break anything today, it at least = hurts readability. This patch changes those three functions to use the passed dboid. For pgstat_report_connect() and pgstat_report_disconnect(), there is = only one caller, and it passes MyDatabaseId, so this change should be = safe. For pgstat_reset_database_timestamp(), in most paths dboid is also just = MyDatabaseId. However, there is one path where dboid can be InvalidOid: 1 - pg_stat_reset_single_table_counters may pass InvalidOid to = pgstat_reset for a shared relation. ``` Datum pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS) { Oid taboid =3D PG_GETARG_OID(0); Oid dboid =3D (IsSharedRelation(taboid) ? = InvalidOid : MyDatabaseId); pgstat_reset(PGSTAT_KIND_RELATION, dboid, taboid); PG_RETURN_VOID(); } ``` 2 - pgstat_reset only calls pgstat_reset_database_timestamp when = kind_info->accessed_across_databases is false. ``` void pgstat_reset(PgStat_Kind kind, Oid dboid, uint64 objid) { const PgStat_KindInfo *kind_info =3D pgstat_get_kind_info(kind); TimestampTz ts =3D GetCurrentTimestamp(); /* not needed atm, and doesn't make sense with the current = signature */ Assert(!pgstat_get_kind_info(kind)->fixed_amount); /* reset the "single counter" */ pgstat_reset_entry(kind, dboid, objid, ts); if (!kind_info->accessed_across_databases) pgstat_reset_database_timestamp(dboid, ts); } ``` 3 - In this path, kind is PGSTAT_KIND_RELATION, and = accessed_across_databases is false: ``` [PGSTAT_KIND_RELATION] =3D { .name =3D "relation", .fixed_amount =3D false, .write_to_file =3D true, .shared_size =3D sizeof(PgStatShared_Relation), .shared_data_off =3D offsetof(PgStatShared_Relation, = stats), .shared_data_len =3D sizeof(((PgStatShared_Relation *) = 0)->stats), .pending_size =3D sizeof(PgStat_TableStatus), .flush_pending_cb =3D pgstat_relation_flush_cb, .delete_pending_cb =3D = pgstat_relation_delete_pending_cb, .reset_timestamp_cb =3D = pgstat_relation_reset_timestamp_cb, }, ``` So in this case, pgstat_reset_database_timestamp() can receive = InvalidOid as dboid. In the current code, because that function ignores = dboid and uses MyDatabaseId, calling = pg_stat_reset_single_table_counters() on a shared relation can = incorrectly reset the current database's stat_reset_timestamp. That = behavior seems unintended, so this patch makes = pgstat_reset_database_timestamp() return immediately when dboid is = InvalidOid. Please see the attached patch. =E2=80=9CMake check-world=E2=80=9D passed = from my side. Best regards, -- Chao Li (Evan) HighGo Software Co., Ltd. https://www.highgo.com/ --Apple-Mail=_ED7C8B70-3C71-4374-B5EB-E61F7AE7A0CE Content-Disposition: attachment; filename=v1-0001-Fix-pgstat_database.c-to-honor-passed-database-OI.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v1-0001-Fix-pgstat_database.c-to-honor-passed-database-OI.patch" Content-Transfer-Encoding: quoted-printable =46rom=208e965bb55562a675d17e37de8b20fe17fe4ec452=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Fri,=2010=20Apr=202026=2011:21:20=20+0800=0ASubject:=20[PATCH=20= v1]=20Fix=20pgstat_database.c=20to=20honor=20passed=20database=20OIDs=0A=0A= Several=20functions=20in=20pgstat_database.c=20take=20a=20database=20OID=20= argument=0Abut=20then=20ignore=20it=20and=20use=20MyDatabaseId=20= instead.=20That=20is=20confusing,=0Aand=20in=20= pgstat_reset_database_timestamp()=20it=20is=20plainly=20wrong,=20because=0A= the=20function's=20contract=20is=20to=20reset=20the=20timestamp=20for=20= the=20specified=0Adatabase.=0A=0AUse=20the=20passed=20dboid=20in=20= pgstat_report_connect(),=0Apgstat_report_disconnect(),=20and=20= pgstat_reset_database_timestamp().=0A=0AAlso=20make=20= pgstat_reset_database_timestamp()=20return=20immediately=20when=0Acalled=20= with=20an=20invalid=20OID,=20avoiding=20an=20unnecessary=20stats=20= lookup.=0A=0AAuthor:=20Chao=20Li=20=0AReviewed-by:=0A= Discussion:=20https://postgr.es/m/=0A---=0A=20= src/backend/utils/activity/pgstat_database.c=20|=209=20++++++---=0A=201=20= file=20changed,=206=20insertions(+),=203=20deletions(-)=0A=0Adiff=20= --git=20a/src/backend/utils/activity/pgstat_database.c=20= b/src/backend/utils/activity/pgstat_database.c=0Aindex=20= f1846d3236c..36a84d1f0a4=20100644=0A---=20= a/src/backend/utils/activity/pgstat_database.c=0A+++=20= b/src/backend/utils/activity/pgstat_database.c=0A@@=20-243,7=20+243,7=20= @@=20pgstat_report_connect(Oid=20dboid)=0A=20=0A=20=09= pgLastSessionReportTime=20=3D=20MyStartTimestamp;=0A=20=0A-=09dbentry=20= =3D=20pgstat_prep_database_pending(MyDatabaseId);=0A+=09dbentry=20=3D=20= pgstat_prep_database_pending(dboid);=0A=20=09dbentry->sessions++;=0A=20}=0A= =20=0A@@=20-258,7=20+258,7=20@@=20pgstat_report_disconnect(Oid=20dboid)=0A= =20=09if=20(!pgstat_should_report_connstat())=0A=20=09=09return;=0A=20=0A= -=09dbentry=20=3D=20pgstat_prep_database_pending(MyDatabaseId);=0A+=09= dbentry=20=3D=20pgstat_prep_database_pending(dboid);=0A=20=0A=20=09= switch=20(pgStatSessionEndCause)=0A=20=09{=0A@@=20-419,7=20+419,10=20@@=20= pgstat_reset_database_timestamp(Oid=20dboid,=20TimestampTz=20ts)=0A=20=09= PgStat_EntryRef=20*dbref;=0A=20=09PgStatShared_Database=20*dbentry;=0A=20= =0A-=09dbref=20=3D=20pgstat_get_entry_ref_locked(PGSTAT_KIND_DATABASE,=20= MyDatabaseId,=20InvalidOid,=0A+=09if=20(!OidIsValid(dboid))=0A+=09=09= return;=0A+=0A+=09dbref=20=3D=20= pgstat_get_entry_ref_locked(PGSTAT_KIND_DATABASE,=20dboid,=20InvalidOid,=0A= =20=09=09=09=09=09=09=09=09=09=09false);=0A=20=0A=20=09dbentry=20=3D=20= (PgStatShared_Database=20*)=20dbref->shared_stats;=0A--=20=0A2.50.1=20= (Apple=20Git-155)=0A=0A= --Apple-Mail=_ED7C8B70-3C71-4374-B5EB-E61F7AE7A0CE--