Hi,
Thank you for developing this great feature. I have tested the committed 
feature. 
The manual for the pg_set_relation_stats function says the following:
  "The value of relpages must be greater than or equal to 0"

However, this function seems to accept -1 for the relpages parameter. Below is 
an example of execution:
---
postgres=> CREATE TABLE data1(c1 INT PRIMARY KEY, c2 VARCHAR(10));
CREATE TABLE
postgres=> SELECT pg_set_relation_stats('data1', relpages=>-1);
 pg_set_relation_stats
-----------------------
 t
(1 row)
postgres=> SELECT relname, relpages FROM pg_class WHERE relname='data1';
 relname | relpages
---------+----------
 data1   |       -1
(1 row)
---

The attached patch modifies the pg_set_relation_stats function to work as 
described in the manual.

Regards,
Noriyoshi Shinoda

-----Original Message-----
From: Jeff Davis <[email protected]> 
Sent: Saturday, October 12, 2024 8:11 AM
To: jian he <[email protected]>; Corey Huinker 
<[email protected]>
Cc: Matthias van de Meent <[email protected]>; Bruce Momjian 
<[email protected]>; Tom Lane <[email protected]>; Nathan Bossart 
<[email protected]>; Magnus Hagander <[email protected]>; Stephen 
Frost <[email protected]>; Ashutosh Bapat <[email protected]>; 
Peter Smith <[email protected]>; PostgreSQL Hackers 
<[email protected]>; Tomas Vondra 
<[email protected]>; [email protected]
Subject: Re: Statistics Import and Export

On Mon, 2024-09-23 at 08:57 +0800, jian he wrote:
>     newtup = heap_modify_tuple_by_cols(ctup, tupdesc, ncols, replaces, 
> nulls);
> 
> you just directly declared "bool nulls[3]    = {false, false, false};"

Those must be false (not NULL), because in pg_class those are non-NULL 
attributes. They must be set to something whenever we update.

> if any of (RELPAGES_ARG, RELTUPLES_ARG, RELALLVISIBLE_ARG) is null, 
> should you set that null[position] to true?

If the corresponding SQL argument is NULL, we leave the existing value 
unchanged, we don't set it to NULL.

> otherwise, i am confused with the variable nulls.
> 
> Looking at other usage of heap_modify_tuple_by_cols, "ncols" cannot be 
> dynamic, it should be a fixed value?
> The current implementation works, because the (bool[3] nulls) is 
> always false, never changed.
> if nulls becomes {false, false, true} then "ncols" must be 3, cannot 
> be 2.

heap_modify_tuple_by_cols() uses ncols to specify the length of the 
values/isnull arrays. The "replaces" is an array of attribute numbers to 
replace (in contrast to plain heap_modify_tuple(), which uses an array of 
booleans).

We are going to replace a maximum of 3 attributes, so the arrays have a maximum 
size of 3. Predeclaring the arrays to be 3 elements is just fine even if we 
only use the first 1-2 elements -- it avoids a needless heap allocation/free.

Regards,
        Jeff Davis



Attachment: relpages_stat_update_v1.diff
Description: relpages_stat_update_v1.diff

Reply via email to