Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vhwWD-00AfvR-1f for pgsql-hackers@arkaria.postgresql.org; Mon, 19 Jan 2026 21:10:38 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vhwWA-00EalD-2x for pgsql-hackers@arkaria.postgresql.org; Mon, 19 Jan 2026 21:10:35 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vhwWA-00Eakz-04 for pgsql-hackers@lists.postgresql.org; Mon, 19 Jan 2026 21:10:34 +0000 Received: from fhigh-a3-smtp.messagingengine.com ([103.168.172.154]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vhwW7-001Olr-0g for pgsql-hackers@postgresql.org; Mon, 19 Jan 2026 21:10:33 +0000 Received: from phl-compute-03.internal (phl-compute-03.internal [10.202.2.43]) by mailfhigh.phl.internal (Postfix) with ESMTP id A929F14003B0; Mon, 19 Jan 2026 16:10:28 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-03.internal (MEProxy); Mon, 19 Jan 2026 16:10:28 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kurilemu.de; h= cc:cc:content-transfer-encoding:content-type:content-type:date :date:from:from:in-reply-to:in-reply-to:message-id:mime-version :reply-to:subject:subject:to:to; s=fm1; t=1768857028; x= 1768943428; bh=5n2LPQLvaetKNXMD5F+JMgHvpteT+UReTtF1UCospm4=; b=L kWR7S/okzMkQJlDfDJPuYRl1o+lEIdroLMpKVf11K/lSJyrF12gYguFahpbdBg1f qKnfghhqXScR0zBsDMlhW62MCLrRMpmdW/L4hCP0qs+9j4Np7kpQziJ7s+1mEUx5 eD3N0ml+YsyxVZOKeVzDJDZiClX4ogD0gGuc9BAb8LZU3Ie1NM5T0eWdJ2+J7Hik Yr08PcN9hsVaLh6pLd6E1U0IcsxH/77DB0kko50TLAUWEgI7C17wtrFgdhTXwblo yP2ZLYER4upaS5uwz41cJoIgBLkT3OLUKg6Sd81kZquC4u3rgk6JtYgc8MPdrdzh LZTmmWndpbghcSPev1dVw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1768857028; x=1768943428; bh=5 n2LPQLvaetKNXMD5F+JMgHvpteT+UReTtF1UCospm4=; b=ff8VBADhBdeGED/F/ jvKT6PgER8yczH3atfyQrJTwHplNX+wvs/dEBRe22vWaYvs+0/rjmISU2wwlE+7K TRhqbadwxqos8J8hL8N8EVT6dF2191FwW4c6vPGY+9kGWrmSpWR1f1/7eKLUSoj+ GPQAj8Xw6LnLx6yWSSFEMQ9163EhOol7Mw21sKiKN6deUU6lVJ1VgGtUUFwRI9Wi xv4khJ1qgMwkKld/OFrxYWgiptkU3AmsXOO+Wz6Y7bjILD4Nm8OKfn24yTWRjRrp Nl5GOW9jkquBPRHdn9HVFHXFAbDIWWTfqxSY6LJkvZWCE8t+fQu68+S11sIzHOzM Oswsg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgddufeekiedtucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhepfffhvfevuffkgggtugfgjgesmhekreertddtjeenucfhrhhomheplmhlvhgrrhho ucfjvghrrhgvrhgruceorghlvhhhvghrrhgvsehkuhhrihhlvghmuhdruggvqeenucggtf frrghtthgvrhhnpeekgedtuedufeejiedttdejffdtgfffvdetteelhfevheevhfejgfet ueelgedvveenucffohhmrghinhepphhoshhtghhrrdgvshdpvghnthgvrhhprhhishgvug gsrdgtohhmnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhho mheprghlvhhhvghrrhgvsehkuhhrihhlvghmuhdruggvpdhnsggprhgtphhtthhopedvpd hmohguvgepshhmthhpohhuthdprhgtphhtthhopehpvghtvghrsegvihhsvghnthhrrghu thdrohhrghdprhgtphhtthhopehpghhsqhhlqdhhrggtkhgvrhhssehpohhsthhgrhgvsh hqlhdrohhrgh X-ME-Proxy: Feedback-ID: ie3de48e3:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 19 Jan 2026 16:10:28 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kurilemu.de; s=schmee; t=1768857025; bh=YYWGFmVjpo0HZdwKZ13SZ2v7RWFp56VTNkNj/E/WqZE=; h=Date:From:To:Cc:Subject:In-Reply-To:From; b=1agBKaBTRIXY4JqaqeHLlhOXGM0zoGVR5vzkQAeRWYMldq8KZNUi0/YQ4Pc4XzxAM ZzKYX/4W21c3AeOuYf1o/NpXZN2okliOPmD0j6bIqzCmnUyG2MHKfqfF20QYUEKF3G iLfJ7GKHeCKkf94XwzEq3ljSDfcIAsjP9hgMxje4EaukUtGSGLkcGqPIUzc7AD/hhm PhnvxpNSOzHvE+9oDNYGLRr1492R0YNEopc8HmpCu9ZuT8HtjER1S8QlLC9zEp0uKf QDKZfZ9QPAl1M3T3U5YAFul0hUsRpD19O7IysmXLq0jqBe2DBXO6Jwi9x1lSRBB0ag j6GJbWRM8Ah1Q== Received: by schmee.kurilemu.internal (Postfix, from userid 1000) id EFD6C7A; Mon, 19 Jan 2026 22:10:25 +0100 (CET) Date: Mon, 19 Jan 2026 22:10:25 +0100 From: =?utf-8?Q?=C3=81lvaro?= Herrera To: Peter Eisentraut Cc: pgsql-hackers Subject: Re: anonymous unions (C11) Message-ID: <202601192106.zcdi3yu2gzti@alvherre.pgsql> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="kiw4bymtmgixtbkr" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --kiw4bymtmgixtbkr Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit On 2025-Sep-23, Peter Eisentraut wrote: > Here is another patch set to sprinkle some C11 features around the > code. My aim is to make a little bit of use of several C11 features > as examples and encouragement for future code, and to test compilers > (although we're not yet at the point where this should really stress > any compiler). I was going over patch [1] today and came across the union in relopt_value. Vaguely remembering this thread, I patched it out (attached) ... and now that I come here to post it, I realize that it's probably identical to your patch 0009 here. Would you push it or can I? [1] https://postgr.es/m/4047390.3Lj2Plt8kZ@thinkpad-pgpro -- Álvaro Herrera PostgreSQL Developer — https://www.EnterpriseDB.com/ --kiw4bymtmgixtbkr Content-Type: text/x-diff; charset=utf-8 Content-Disposition: attachment; filename="0001-Make-some-use-of-anonymous-unions.patch" From 23d94cc1c30aa00d2340c1368b01856b1fe95ecd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Herrera?= Date: Mon, 19 Jan 2026 18:27:13 +0100 Subject: [PATCH] Make some use of anonymous unions 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. --- src/backend/access/common/reloptions.c | 34 +++++++++++++------------- src/include/access/reloptions.h | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 0b83f98ed5f..d9729ebf17f 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -587,7 +587,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) /* @@ -1618,7 +1618,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), @@ -1630,14 +1630,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\"", @@ -1650,14 +1650,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\"", @@ -1676,7 +1676,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; } @@ -1694,14 +1694,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); @@ -1743,7 +1743,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); @@ -1804,28 +1804,28 @@ 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_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 diff --git a/src/include/access/reloptions.h b/src/include/access/reloptions.h index 2f08e1b0cf0..40a1369646b 100644 --- a/src/include/access/reloptions.h +++ b/src/include/access/reloptions.h @@ -84,7 +84,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 */ -- 2.47.3 --kiw4bymtmgixtbkr--