0002-gen_guc_tables-reject-type-inappropriate-fields-in-g.patch
application/octet-stream
Filename: 0002-gen_guc_tables-reject-type-inappropriate-fields-in-g.patch
Type: application/octet-stream
Part: 1
Message:
gen_guc_tables improvements
Patch
Format: format-patch
Series: patch 0002
Subject: gen_guc_tables: reject type-inappropriate fields in guc_parameters.dat
| File | + | − |
|---|---|---|
| src/backend/utils/misc/gen_guc_tables.pl | 24 | 8 |
From 33634107d72866cb85544f274a217ad592f61fe0 Mon Sep 17 00:00:00 2001
From: Zsolt Parragi <zsolt.parragi@percona.com>
Date: Sun, 15 Mar 2026 11:22:00 +0000
Subject: [PATCH 2/4] gen_guc_tables: reject type-inappropriate fields in
guc_parameters.dat
Detect when a GUC entry has fields that don't apply to its type, such
as "min" or "max" on a bool or string, or "options" on an int. These
would be silently ignored, likely indicating a copy-paste mistake.
The existing required_by_type structure is replaced with a single
type_specific_fields hash that drives both the required-field and
inappropriate-field checks.
---
src/backend/utils/misc/gen_guc_tables.pl | 32 ++++++++++++++++++------
1 file changed, 24 insertions(+), 8 deletions(-)
diff --git a/src/backend/utils/misc/gen_guc_tables.pl b/src/backend/utils/misc/gen_guc_tables.pl
index ba2e6f001f1..b1c1b7afc6c 100644
--- a/src/backend/utils/misc/gen_guc_tables.pl
+++ b/src/backend/utils/misc/gen_guc_tables.pl
@@ -45,12 +45,12 @@ sub validate_guc_entry
my @required_common =
qw(name type context group short_desc variable boot_val);
- my %required_by_type = (
- int => [qw(min max)],
- real => [qw(min max)],
- enum => [qw(options)],
- bool => [], # no extra required fields
- string => [], # no extra required fields
+ my %type_specific_fields = (
+ int => { map { $_ => 1 } qw(min max) },
+ real => { map { $_ => 1 } qw(min max) },
+ enum => { map { $_ => 1 } qw(options) },
+ bool => {},
+ string => {},
);
# All fields recognized by the generator. "line_number" is injected
@@ -83,7 +83,7 @@ sub validate_guc_entry
}
}
- unless (exists $required_by_type{ $entry->{type} })
+ unless (exists $type_specific_fields{ $entry->{type} })
{
die sprintf(
qq{%s:%d: error: entry "%s" has unrecognized GUC type "%s"\n},
@@ -91,7 +91,9 @@ sub validate_guc_entry
$entry->{name}, $entry->{type} // '<unknown>');
}
- for my $f (@{ $required_by_type{ $entry->{type} } })
+ my $fields_for_type = $type_specific_fields{ $entry->{type} };
+
+ for my $f (sort keys %$fields_for_type)
{
unless (defined $entry->{$f})
{
@@ -101,6 +103,20 @@ sub validate_guc_entry
$entry->{type}, $f);
}
}
+
+ my %all_type_specific;
+ $all_type_specific{$_} = 1
+ for map { keys %$_ } values %type_specific_fields;
+ for my $f (sort keys %$entry)
+ {
+ if ($all_type_specific{$f} && !$fields_for_type->{$f})
+ {
+ die sprintf(
+ qq{%s:%d: error: entry "%s" of type "%s" must not have field "%s"\n},
+ $input_fname, $entry->{line_number}, $entry->{name},
+ $entry->{type}, $f);
+ }
+ }
}
# Print GUC table.
--
2.43.0