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 1vL2sl-001lan-0d for pgsql-hackers@arkaria.postgresql.org; Mon, 17 Nov 2025 17:19:15 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vL2sj-001BDh-2f for pgsql-hackers@arkaria.postgresql.org; Mon, 17 Nov 2025 17:19:14 +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 1vL2sj-001BDX-1d for pgsql-hackers@lists.postgresql.org; Mon, 17 Nov 2025 17:19:13 +0000 Received: from mail-il1-x134.google.com ([2607:f8b0:4864:20::134]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vL2sh-00020x-28 for pgsql-hackers@lists.postgresql.org; Mon, 17 Nov 2025 17:19:13 +0000 Received: by mail-il1-x134.google.com with SMTP id e9e14a558f8ab-4330eb0f232so22940665ab.0 for ; Mon, 17 Nov 2025 09:19:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1763399949; x=1764004749; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=CzPqy7kjcg7ESQ/HYjtVhs53n3+faD/u41M3bnd+gOU=; b=jeM4nYhEYndG2R3uetI907BAI+/6afuVAA+tTgNy+rybRwKxx8k3y+YOPtJnX6wJIc 2UA/M1aM8xGNBablGXtojHmfyf5xIRzqtQY2zdKvA6X4/YDQKI8bBFSFAVJMB8uDdjmT MQv+PlMB1SnogXLHFcvusvxlgmUfDm4WhvaRctpo4hxSedkQDMFU73qHDBKCWlFd9c3I Uun0WAocXgenuj6BbC+DOOguDudu2c7iRXHikSbaVHsXrHlG+72d0PUsqNvPxGdgxf5z 0uHMOkob8fcpKO4Jy/wUNldXN67D1wm+5HzptuMbjGDcaI2NPY28MR5E4KNkp/XZ9ouB frtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763399949; x=1764004749; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=CzPqy7kjcg7ESQ/HYjtVhs53n3+faD/u41M3bnd+gOU=; b=mevMl5BnCtYpaLujxDmK4cGwRFii+ZZSnOlZ+KMHTVPWFVuJcxYErIKZ03xvvTo4Zr oVIElX2MXCXfgEaqE9oVlM0gkmxzVKtqEQ+PvA8KP7v7xBy9/GiI6ETkwU4L8J3aV5p8 5kFLBp3g9KwANTLmQtDZCIEmqPFBe/vbTkSTZ6hlApuguQX/hmcTofoLro6qQqFlu9Ev f9MR/bZKVtLF8C2VZvkqe6+EmOBjy2IIe26I2lqMFWbovc7X53qcKUsASo4YLYVhdBXC oyBxihNyiPqWTqbeZQS23A6C1dJ3KwVr/Fw9fFPwkG4zdauoPzY90ieN+Z9NExzpZse6 ynoQ== X-Forwarded-Encrypted: i=1; AJvYcCXLvESTcI1J9ImoPE7Y/exRB7OdrGoSS0t7ecV4Voblrxn3372NH/WJzYFRx048X+ezk1prqDBR726GieTe@lists.postgresql.org X-Gm-Message-State: AOJu0YxFzrYRyYG+WowQrP9SzfWPVnwlquZwrNgYgqKAPzyp4PqOU87W xMgH9t6/Sx55uLbvUDeq4lWYeUjGSBkuS3xh8CUbRWt1CmrAGlJMsVYshiHy7kJxC3bfnXpfH3O pnmkN0GftwECrBYGbsUJWJX2s0I0MfDI= X-Gm-Gg: ASbGncvun2pcb+oTxKiBfsUQIw1JmXQVm/By9g/lFEma4gbinQ5gOuByMzH0LUP1XFy +FP0ma1qxLEcHHNtzqyXxkm9xRGTTo88XN21rp8eacMiw7K1ejTDHIxZBBml6uYkQpVTt+LA82t dtcK8rqM07LO4VUU5yJcAsGAtBJjGfgqwoGCdCGcentoFnXLogvZbv5ShobpoSHyTWtt6MukLoG Ck5WF75b4bfH+Xtmr9tfaW8ti2H5Cp4VLvLp8fuwkyWap5DuuSjUq8lTZG6Uc0lJ+wh5FDl20xT 2iWNkmqqO06+/89yKkz2tk4G0IE= X-Google-Smtp-Source: AGHT+IEoG5nCPw6IDkGIZ1nLKL1jTGoUh0rygdzBTCm1E9BgJ0y+nPZt/WzP1bAENiJGmZnYY5iHr235K7UKXUXYV14= X-Received: by 2002:a05:6e02:188a:b0:433:7929:e7a8 with SMTP id e9e14a558f8ab-43592df3873mr956405ab.12.1763399948707; Mon, 17 Nov 2025 09:19:08 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Corey Huinker Date: Mon, 17 Nov 2025 12:18:55 -0500 X-Gm-Features: AWmQ_bnEAv6XK5fjHapynilTF9u6lduPwV_fZiV7UaXAtBO-6TiVEgIWAGzle2E Message-ID: Subject: Re: Extended Statistics set/restore/clear functions. To: Michael Paquier Cc: jian he , Tomas Vondra , pgsql-hackers@lists.postgresql.org, tgl@sss.pgh.pa.us Content-Type: multipart/alternative; boundary="0000000000008a2c1e0643cd8bef" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000008a2c1e0643cd8bef Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Nov 17, 2025 at 1:56=E2=80=AFAM Michael Paquier wrote: > On Fri, Nov 14, 2025 at 03:25:27PM +0900, Michael Paquier wrote: > > Thanks for the new versions, I'll also look at all these across the > > next couple of days. Probably not at 0005~ for now. > > 0001 and 0002 from series v13 have been applied to change the output > functions. > Thanks! Though, I was thinking some more about the output format. Using jsonb_pretty() makes it readable in one way, and very clumsy in other ways. Instead, I'm going to try doing the following: replace (ndist_string_value, '},', E'}\n,') This will result in the output value being formatted in exactly the way described in the commit messages. Of course, we could make the the actual default format by changing appendStringInfoString(&str, ", ") instead. One might argue that the output shouldn't get too flowery, but we're already adding spaces between items and array elements, and we've already made extensive changes favoring readability over compactness. Review of changes to input function patches: I'm curious about the re-parameterization of error messages involving PG_NDISTINCT_KEY_ATTRIBUTES, PG_NDISTINCT_KEY_NDISTINCT, and similar keys in dependencies. I like the parameterized version better, and was confused as to why it was removed. Did you change your mind, or was it done for ease of translation? Wording changes all look good. Use of pg_input_error_info() makes sense. > > There is an extra thing that bugs me as incorrect for the pg_ndistinct > input, something I have not tackled myself yet. Your patch checks > that subsets of attributes are included in the longest set found, but > it does not match the guarantees we have in mvndistinct.c: we have to > check that *all* the combinations generated by generator_init() are > satisfied based on the longest of attributes detected. For example, > this is thought as correct in the input function: > SELECT '[{"attributes" : [-1,2], "ndistinct" : 1}, > {"attributes" : [-1,2,3], "ndistinct" : 3}]'::pg_ndistinct; > > However it is obviously not correct as we are missing an element for > the attributes [-1, 3]. The simplest solution would be to export the > routines that generate the groups now in mvndistinct.c. Also we > should make sure that the number of elements in the arrays match with > the number of groups we expect, not only the elements. I don't think > that we need to care much about the values, but we ought to provide > stronger guarantees for the attributes listed in these elements. > I had a feeling that was going to be requested. My question would be if that we want to stick to modeling the other combinations after the first longest combination, last longest, or if we want to defer those checks altogether until we have to validate against an actual stats object? > > Except for this argument, the input of pg_ndistinct feels OK in terms > of the guarantees that we'd want to enforce on an import. The same > argument applies in terms of attribute number guarantees for > pg_dependencies, based on DependencyGenerator_init() & friends in > dependencies.c. Could you look at that? > Yes. I had already looked at it to verify that _all_ combinations were always generated (they are), because I had some vague memory of the generator dropping combinations that were statistically insignificant. In retrospect, I have no idea where I got that idea. > > For pg_dependencies, we also require some checks on the value for > "dependency", of course, making sure that this matches with what's > expected with the "largest" sets of attributes. In this case, we need > to track the union of "dependency" and "attributes", with "attributes" > having at least one element. > This is fairly simple to do. The dependency attnum is just appended to the list of attnums, and the combinations are generated the same as ndistinct, though obviously there are no single elements. There's probably some common code between the lists to be shared, differing only in how they report missing combinations. > The tests of pg_dependencies need also to be extended more (begun that > a bit, far from being complete and I'm lacking of time this week due > to a conference). One thing that I would add are nested JSON objects > in the paths where we expect values, for example. Please note that I > have done a brush of 0004, while on it, cleaning up typos, > inconsistencies and making the error codes consistent with the > ndistinct case where possible. This is not ready, but that's at least > it's a start to rely on. > > > In terms of committable bits, it would be better to apply the input > functions once both parts are ready to go. For now I am attached a > v14 with the work I've put into them. 0005~ are not reviewed yet, as > mentioned previously. The changes in pg_dependencies are actually > straight-forward to figure out (well, mostly) once the pg_ndistinct > changes are OK in shape. > -- > Michael +1 --0000000000008a2c1e0643cd8bef Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
On Mon, Nov 17, 2025 at 1:56=E2=80=AFAM Micha= el Paquier <michael@paquier.xyz> wrote:
On= Fri, Nov 14, 2025 at 03:25:27PM +0900, Michael Paquier wrote:
> Thanks for the new versions, I'll also look at all these across th= e
> next couple of days.=C2=A0 Probably not at 0005~ for now.

0001 and 0002 from series v13 have been applied to change the output
functions.






I'm curious about the re-parameterization of error messages invo= lving PG_NDISTINCT_KEY_ATTRIBUTES,=C2=A0PG_NDISTINCT_KEY_NDISTINCT, and sim= ilar keys in dependencies. I like the parameterized version better, and was= confused as to why it was removed. Did you change your mind, or was it don= e for ease of translation?

Wording changes all loo= k good. Use of=C2=A0pg_input_error_info() makes sense.

=
=C2=A0

There is an extra thing that bugs me as incorrect for the pg_ndistinct
input, something I have not tackled myself yet.=C2=A0 Your patch checks
that subsets of attributes are included in the longest set found, but
it does not match the guarantees we have in mvndistinct.c: we have to
check that *all* the combinations generated by generator_init() are
satisfied based on the longest of attributes detected.=C2=A0 For example, this is thought as correct in the input function:
SELECT '[{"attributes" : [-1,2], "ndistinct" : 1},<= br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{"attributes" : [-1,2,3], "= ;ndistinct" : 3}]'::pg_ndistinct;

However it is obviously not correct as we are missing an element for
the attributes [-1, 3].=C2=A0 The simplest solution would be to export the<= br> routines that generate the groups now in mvndistinct.c.=C2=A0 Also we
should make sure that the number of elements in the arrays match with
the number of groups we expect, not only the elements.=C2=A0 I don't th= ink
that we need to care much about the values, but we ought to provide
stronger guarantees for the attributes listed in these elements.

I had a feeling that was going to be requested. M= y question would be if that we want to stick to modeling the other combinat= ions=C2=A0after the first longest combination, last longest, or if we want = to defer those checks altogether until we have to validate against an actua= l stats object?
=C2=A0

Except for this argument, the input of pg_ndistinct feels OK in terms
of the guarantees that we'd want to enforce on an import.=C2=A0 The sam= e
argument applies in terms of attribute number guarantees for
pg_dependencies, based on DependencyGenerator_init() & friends in
dependencies.c.=C2=A0 Could you look at that?

Yes. I had already looked at it to verify that _all_ combinations we= re always generated (they are), because I had some vague memory of the gene= rator dropping combinations that were statistically insignificant. In retro= spect, I have no idea where I got that idea.

=C2=A0

For pg_dependencies, we also require some checks on the value for
"dependency", of course, making sure that this matches with what&= #39;s
expected with the "largest" sets of attributes.=C2=A0 In this cas= e, we need
to track the union of "dependency" and "attributes", wi= th "attributes"
having at least one element.

This is fa= irly simple to do. The dependency attnum is just appended to the list of at= tnums, and the combinations are generated the same as ndistinct, though obv= iously there are no single elements.

There's p= robably some common code between the lists to be shared, differing only in = how they report missing combinations.

= =C2=A0
The tests of pg_dependencies need also to be extended more (begun that
a bit, far from being complete and I'm lacking of time this week due to a conference).=C2=A0 One thing that I would add are nested JSON objects<= br> in the paths where we expect values, for example.=C2=A0 Please note that I<= br> have done a brush of 0004, while on it, cleaning up typos,
inconsistencies and making the error codes consistent with the
ndistinct case where possible.=C2=A0 This is not ready, but that's at l= east
it's a start to rely on.

=C2=A0

In terms of committable bits, it would be better to apply the input
functions once both parts are ready to go.=C2=A0 For now I am attached a v14 with the work I've put into them.=C2=A0 0005~ are not reviewed yet,= as
mentioned previously.=C2=A0 The changes in pg_dependencies are actually
straight-forward to figure out (well, mostly) once the pg_ndistinct
changes are OK in shape.
--
Michael

+1=C2=A0
--0000000000008a2c1e0643cd8bef--