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 |
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 |