summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2025-11-25 16:50:34 +0100
committerPeter Eisentraut <peter@eisentraut.org>2025-11-25 16:50:34 +0100
commit7169c0b96bb8929c939c8e96a52b42571085efe9 (patch)
treea8e573cd739f9d8f7d2e4f4854ace8b3adff7825
parent2256af4ba223e114d08208fd17a27cbce30cda9e (diff)
gen_guc_tables.pl: Validate required GUC fields before code generation
Previously, gen_guc_tables.pl would emit "Use of uninitialized value" warnings if required fields were missing in guc_parameters.dat (for example, when an integer or real GUC omitted the 'max' value). The resulting error messages were unclear and did not identify which GUC entry was problematic. Add explicit validation of required fields depending on the parameter type, and fail with a clear and specific message such as: guc_parameters.dat:1909: error: entry "max_index_keys" of type "int" is missing required field "max" No changes to generated guc_tables.c. Author: Chao Li <lic@highgo.com> Reviewed-by: Dagfinn Ilmari Mannsåker <ilmari@ilmari.org> Reviewed-by: Peter Eisentraut <peter@eisentraut.org> Discussion: https://www.postgresql.org/message-id/flat/CAEoWx2%3DoP4LgHi771_OKhPPUS7B-CTqCs%3D%3DuQcNXWrwBoAm5Vg%40mail.gmail.com
-rw-r--r--src/backend/utils/misc/gen_guc_tables.pl48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/backend/utils/misc/gen_guc_tables.pl b/src/backend/utils/misc/gen_guc_tables.pl
index 601c34ec30b..562819b7832 100644
--- a/src/backend/utils/misc/gen_guc_tables.pl
+++ b/src/backend/utils/misc/gen_guc_tables.pl
@@ -38,6 +38,52 @@ sub dquote
return q{"} . $s =~ s/"/\\"/gr . q{"};
}
+sub validate_guc_entry
+{
+ my ($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
+ );
+
+ for my $f (@required_common)
+ {
+ unless (defined $entry->{$f})
+ {
+ die sprintf(
+ qq{%s:%d: error: entry "%s" is missing required field "%s"\n},
+ $input_fname, $entry->{line_number},
+ $entry->{name} // '<unknown>', $f);
+ }
+ }
+
+ unless (exists $required_by_type{ $entry->{type} })
+ {
+ die sprintf(
+ qq{%s:%d: error: entry "%s" has unrecognized GUC type "%s"\n},
+ $input_fname, $entry->{line_number},
+ $entry->{name}, $entry->{type} // '<unknown>');
+ }
+
+ for my $f (@{ $required_by_type{ $entry->{type} } })
+ {
+ unless (defined $entry->{$f})
+ {
+ die sprintf(
+ qq{%s:%d: error: entry "%s" of type "%s" is missing required field "%s"\n},
+ $input_fname, $entry->{line_number}, $entry->{name},
+ $entry->{type}, $f);
+ }
+ }
+}
+
# Print GUC table.
sub print_table
{
@@ -50,6 +96,8 @@ sub print_table
foreach my $entry (@{$parse})
{
+ validate_guc_entry($entry);
+
if (defined($prev_name) && lc($prev_name) ge lc($entry->{name}))
{
die sprintf(