Make some use of anonymous unions [reloptions]
authorÁlvaro Herrera <alvherre@kurilemu.de>
Thu, 22 Jan 2026 16:04:59 +0000 (17:04 +0100)
committerÁlvaro Herrera <alvherre@kurilemu.de>
Thu, 22 Jan 2026 16:04:59 +0000 (17:04 +0100)
In the spirit of commit 4b7e6c73b0df and following, which see for more
details; it appears to have been quite an uncontroversial C11 feature to
use and it makes the code nicer to read.

This commit changes the relopt_value struct.

Author: Peter Eisentraut <peter@eisentraut.org>
Author: Álvaro Herrera <alvherre@kurilemu.de>
Note: Yes, this was written twice independently.
Discussion: https://postgr.es/m/202601192106.zcdi3yu2gzti@alvherre.pgsql

src/backend/access/common/reloptions.c
src/include/access/reloptions.h

index 83feaaba7f135ea58139098c5b597fb32a24f248..237ab8d0ed9ea38b427a1784638ae954785df7fa 100644 (file)
@@ -600,7 +600,7 @@ static void parse_one_reloption(relopt_value *option, char *text_str,
  * relation options.
  */
 #define GET_STRING_RELOPTION_LEN(option) \
-   ((option).isset ? strlen((option).values.string_val) : \
+   ((option).isset ? strlen((option).string_val) : \
     ((relopt_string *) (option).gen)->default_len)
 
 /*
@@ -1698,7 +1698,7 @@ parse_one_reloption(relopt_value *option, char *text_str, int text_len,
    {
        case RELOPT_TYPE_BOOL:
            {
-               parsed = parse_bool(value, &option->values.bool_val);
+               parsed = parse_bool(value, &option->bool_val);
                if (validate && !parsed)
                    ereport(ERROR,
                            (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
@@ -1711,7 +1711,7 @@ parse_one_reloption(relopt_value *option, char *text_str, int text_len,
                bool        b;
 
                parsed = parse_bool(value, &b);
-               option->values.ternary_val = b ? PG_TERNARY_TRUE :
+               option->ternary_val = b ? PG_TERNARY_TRUE :
                    PG_TERNARY_FALSE;
                if (validate && !parsed)
                    ereport(ERROR,
@@ -1724,14 +1724,14 @@ parse_one_reloption(relopt_value *option, char *text_str, int text_len,
            {
                relopt_int *optint = (relopt_int *) option->gen;
 
-               parsed = parse_int(value, &option->values.int_val, 0, NULL);
+               parsed = parse_int(value, &option->int_val, 0, NULL);
                if (validate && !parsed)
                    ereport(ERROR,
                            (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                             errmsg("invalid value for integer option \"%s\": %s",
                                    option->gen->name, value)));
-               if (validate && (option->values.int_val < optint->min ||
-                                option->values.int_val > optint->max))
+               if (validate && (option->int_val < optint->min ||
+                                option->int_val > optint->max))
                    ereport(ERROR,
                            (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                             errmsg("value %s out of bounds for option \"%s\"",
@@ -1744,14 +1744,14 @@ parse_one_reloption(relopt_value *option, char *text_str, int text_len,
            {
                relopt_real *optreal = (relopt_real *) option->gen;
 
-               parsed = parse_real(value, &option->values.real_val, 0, NULL);
+               parsed = parse_real(value, &option->real_val, 0, NULL);
                if (validate && !parsed)
                    ereport(ERROR,
                            (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                             errmsg("invalid value for floating point option \"%s\": %s",
                                    option->gen->name, value)));
-               if (validate && (option->values.real_val < optreal->min ||
-                                option->values.real_val > optreal->max))
+               if (validate && (option->real_val < optreal->min ||
+                                option->real_val > optreal->max))
                    ereport(ERROR,
                            (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                             errmsg("value %s out of bounds for option \"%s\"",
@@ -1770,7 +1770,7 @@ parse_one_reloption(relopt_value *option, char *text_str, int text_len,
                {
                    if (pg_strcasecmp(value, elt->string_val) == 0)
                    {
-                       option->values.enum_val = elt->symbol_val;
+                       option->enum_val = elt->symbol_val;
                        parsed = true;
                        break;
                    }
@@ -1788,14 +1788,14 @@ parse_one_reloption(relopt_value *option, char *text_str, int text_len,
                 * not asked to validate, just use the default numeric value.
                 */
                if (!parsed)
-                   option->values.enum_val = optenum->default_val;
+                   option->enum_val = optenum->default_val;
            }
            break;
        case RELOPT_TYPE_STRING:
            {
                relopt_string *optstring = (relopt_string *) option->gen;
 
-               option->values.string_val = value;
+               option->string_val = value;
                nofree = true;
                if (validate && optstring->validate_cb)
                    (optstring->validate_cb) (value);
@@ -1837,7 +1837,7 @@ allocateReloptStruct(Size base, relopt_value *options, int numoptions)
 
            if (optstr->fill_cb)
            {
-               const char *val = optval->isset ? optval->values.string_val :
+               const char *val = optval->isset ? optval->string_val :
                    optstr->default_isnull ? NULL : optstr->default_val;
 
                size += optstr->fill_cb(val, NULL);
@@ -1887,32 +1887,32 @@ fillRelOptions(void *rdopts, Size basesize,
                {
                    case RELOPT_TYPE_BOOL:
                        *(bool *) itempos = options[i].isset ?
-                           options[i].values.bool_val :
+                           options[i].bool_val :
                            ((relopt_bool *) options[i].gen)->default_val;
                        break;
                    case RELOPT_TYPE_TERNARY:
                        *(pg_ternary *) itempos = options[i].isset ?
-                           options[i].values.ternary_val : PG_TERNARY_UNSET;
+                           options[i].ternary_val : PG_TERNARY_UNSET;
                        break;
                    case RELOPT_TYPE_INT:
                        *(int *) itempos = options[i].isset ?
-                           options[i].values.int_val :
+                           options[i].int_val :
                            ((relopt_int *) options[i].gen)->default_val;
                        break;
                    case RELOPT_TYPE_REAL:
                        *(double *) itempos = options[i].isset ?
-                           options[i].values.real_val :
+                           options[i].real_val :
                            ((relopt_real *) options[i].gen)->default_val;
                        break;
                    case RELOPT_TYPE_ENUM:
                        *(int *) itempos = options[i].isset ?
-                           options[i].values.enum_val :
+                           options[i].enum_val :
                            ((relopt_enum *) options[i].gen)->default_val;
                        break;
                    case RELOPT_TYPE_STRING:
                        optstring = (relopt_string *) options[i].gen;
                        if (options[i].isset)
-                           string_val = options[i].values.string_val;
+                           string_val = options[i].string_val;
                        else if (!optstring->default_isnull)
                            string_val = optstring->default_val;
                        else
index a3f6f5a3990b95f89f18023cce91ae604f58a40f..0bd17b30ca71adb4e26bf439d93a9af701fc9286 100644 (file)
@@ -86,7 +86,7 @@ typedef struct relopt_value
        double      real_val;
        int         enum_val;
        char       *string_val; /* allocated separately */
-   }           values;
+   };
 } relopt_value;
 
 /* reloptions records for specific variable types */