Re: Reorganize GUC structs
Chao Li <li.evan.chao@gmail.com>
From: Chao Li <li.evan.chao@gmail.com>
To: Peter Eisentraut <peter@eisentraut.org>
Cc: pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2025-10-09T07:15:24Z
Lists: pgsql-hackers
> On Oct 3, 2025, at 14:55, Peter Eisentraut <peter@eisentraut.org> wrote:
>
>
> The patches in the series are arranged so that they can be considered and applied incrementally.
> <v1-0001-Modernize-some-for-loops.patch><v1-0002-Add-some-const-qualifiers.patch><v1-0003-Change-reset_extra-into-a-config_generic-common-f.patch><v1-0004-Use-designated-initializers-for-guc_tables.patch><v1-0005-Change-config_generic.vartype-to-be-initialized-a.patch><v1-0006-Reorganize-GUC-structs.patch><v1-0007-Sort-guc_parameters.dat-alphabetically-by-name.patch><v1-0008-Enforce-alphabetical-order-in-guc_parameters.dat.patch>
0001 - looks good to me. Basically it only moves for loop’s loop variable type definition into for(), it isn’t tied to rest commits, I guess it can be pushed independently.
0002 - also looks good. It just add “const” where possible. I think it can be pushed together with 0001.
0003 - also looks good. It moves “reset_extra” from individual typed config structure to “config_generic”, which dramatically eliminates unnecessary switch-cases. Just a small comment:
```
@@ -6244,29 +6217,11 @@ RestoreGUCState(void *gucstate)
switch (gconf->vartype)
{
case PGC_BOOL:
- {
- struct config_bool *conf = (struct config_bool *) gconf;
-
- if (conf->reset_extra && conf->reset_extra != gconf->extra)
- guc_free(conf->reset_extra);
- break;
- }
case PGC_INT:
- {
- struct config_int *conf = (struct config_int *) gconf;
-
- if (conf->reset_extra && conf->reset_extra != gconf->extra)
- guc_free(conf->reset_extra);
- break;
- }
case PGC_REAL:
- {
- struct config_real *conf = (struct config_real *) gconf;
-
- if (conf->reset_extra && conf->reset_extra != gconf->extra)
- guc_free(conf->reset_extra);
- break;
- }
+ case PGC_ENUM:
+ /* no need to do anything */
+ break;
case PGC_STRING:
{
struct config_string *conf = (struct config_string *) gconf;
@@ -6274,19 +6229,11 @@ RestoreGUCState(void *gucstate)
guc_free(*conf->variable);
if (conf->reset_val && conf->reset_val != *conf->variable)
guc_free(conf->reset_val);
- if (conf->reset_extra && conf->reset_extra != gconf->extra)
- guc_free(conf->reset_extra);
- break;
- }
- case PGC_ENUM:
- {
- struct config_enum *conf = (struct config_enum *) gconf;
-
- if (conf->reset_extra && conf->reset_extra != gconf->extra)
- guc_free(conf->reset_extra);
break;
}
}
```
Do we still need this switch-case? As only PGC_STRING needs to do something, why not just do:
```
If (gconf-vartype == PGC_STRING)
{
…
}
if (gconf->reset_extra && gconf->reset_extra != gconf->extra)
guc_free(gconf->reset_extra);
```
0004 - Also looks good to me. But I am not an expert of perl programming, so I cannot comment much.
0005 - Also looks good to me. This is a small change. It updates the perl script to set vartype so that vartype gets set at compile time, which further simplifies the c code.
0006 - Comes to the most interesting part of this patch. It moves all typed config into “config_generic” as a unnamed union, then replaces typed config with config_generic everywhere. Though this commit touches a lot of lines of code, but all changes are straightforward. Also looks good to me.
0007 needs a rebase. I guess you may split 0007 and 0008 to a separate patch once 0001-0006 are pushed. As they only re-order GUC variables without real logic change, so they can be quickly reviewed and pushed, otherwise it would be painful where every commit the touches GUC would lead to a rebase.
0008 - I don’t review it as 0007 needs a rebase.
Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/
Commits
-
Remove extraneous newlines from guc_parameters.dat
- a7f59b252a8e 19 (unreleased) landed
-
Fix NLS for incorrect GUC enum value hint message
- 0fc33b00536c 19 (unreleased) landed
-
Clean up qsort comparison function for GUC entries
- d2f24df19b7a 19 (unreleased) landed
-
Sort guc_parameters.dat alphabetically by name
- fce7c73fba4e 19 (unreleased) landed
-
Reorganize GUC structs
- a13833c35f9e 19 (unreleased) landed
-
Change config_generic.vartype to be initialized at compile time
- e1a912c86d52 19 (unreleased) landed
-
Use designated initializers for guc_tables
- 0a7bde461016 19 (unreleased) landed
-
Change reset_extra into a config_generic common field
- 5f4c3b33a976 19 (unreleased) landed
-
Add some const qualifiers
- 29dc7a668753 19 (unreleased) landed
-
Modernize some for loops
- 1a795188889c 19 (unreleased) landed