[PATCH] trenary reloption type

From: Nikolay Shaplov <dhyan(at)nataraj(dot)su>
To: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, Álvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, Timur Magomedov <t(dot)magomedov(at)postgrespro(dot)ru>, Chris Travers <chris(dot)travers(at)gmail(dot)com>
Subject: [PATCH] trenary reloption type
Date: 2025-08-31 17:02:27
Message-ID: 3474141.usfYGdeWWP@thinkpad-pgpro
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi, All!

There is ongoing tendency in PostgreSQL to replace boolean reloptions that has
"on" and "off" state, with other option types that has "on", "off" and "use
defaults" states.

Some of these options are implemented as enum options. They are
"vacuum_index_cleanup" and gist's "buffering"

and one recently converted option "vacuum_truncate" that uses extra
"vacuum_truncate_set" flag to indicate it's unset state.

This patch introduce trenary reloptions type, that replaces both
implementation with separate data-type that behaves in the same way as bool
type does, but has one extra state that indicate that option have not been set
to "on" or "off" state.

This third state, I call it "unset" state, can either be only reached by not
setting "true" or "false" value to an option, as it is done in vacuum_truncate
option. Or option designer can assign this third state a custom name, so user
can explicitly set option to the "third" slate. As it is done in
`vacuum_index_cleanup` and gist's `buffering` option, using "auto" keyword.

This patch changes implementation of `vacuum_truncate`, `vacuum_index_cleanup`
and gist's `buffering` to trinary options. This make code more neat and
consistent. I'd suggest to commit it to the master branch.

Possible flaws and drawbacks:

1. I've added trenary enum type to c.h. It might be a bit too global, but I
did not find any better place for it, since it is needed globally and it is
kind of similar to boolean. If you know better place, please speak.

2. `vacuum_index_cleanup` and gist's `buffering` will now accepts all possible
"true" and "false" aliases as in boolean type, the way they did not do it
before. Like "1" or "FAL". I see no great harm in it, but it is still
behaviour change.

3. Error messages for `vacuum_index_cleanup` and gist's `buffering` are now
less informative. It is not right, but I do not see right now a way to improve
that. May be it is a price to pay for code consistency. If you have any idea
how to fix it, please speak.

As for the rest, other behavior should not be changed.

I've added as many tests as I can. local_reloption support is also
implemented.

I've split patch into four part so it can be read and reviewed step by step:
1. Tests that ensures old behaviour
2. Trenary option for `vacuum_truncate` reloption
3. Add "unset_alias" feature to implement "auto" alias for
`vacuum_index_cleanup` and gist's `buffering`
4. More tests

But I guess they should be commit as a single commit.

--
Nikolay Shaplov aka Nataraj
Fuzzing Engineer at Postgres Professional
Matrix IM: @dhyan:nataraj.su

Attachment Content-Type Size
v1-0001-Add-trenary-reloption-type.patch text/x-patch 4.8 KB
v1-0002-Introduce-trenary-reloptions.patch text/x-patch 11.7 KB
v1-0003-Add-alias-to-be-used-as-unset-state.patch text/x-patch 12.0 KB
v1-0004-Extra-tests.patch text/x-patch 12.3 KB

Browse pgsql-hackers by date

  From Date Subject
Next Message Alvaro Herrera 2025-08-31 17:43:17 Re: Adding REPACK [concurrently]
Previous Message Arseniy Mukhin 2025-08-31 16:17:20 Use streaming read I/O in BRIN vacuuming