diff options
author | Robert Haas <rhaas@postgresql.org> | 2017-03-09 18:17:58 -0500 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2017-03-09 18:17:58 -0500 |
commit | 7666e73a2e9e0e91a9f3b246a4299b44daadcbf8 (patch) | |
tree | 469b84990efdbc7596cc94a2b042501910b72651 /src | |
parent | ccce90b398673d55b0387b3de66639b1b30d451b (diff) | |
download | postgresql-7666e73a2e9e0e91a9f3b246a4299b44daadcbf8.tar.gz postgresql-7666e73a2e9e0e91a9f3b246a4299b44daadcbf8.zip |
Throw an error if a DATA() line contains wrong # of attributes.
David Christensen, reviewed by Dagfinn Ilmari Mannsåker
Discussion: http://postgr.es/m/20170215154018.fs5vwtqhp5d2sifs@veeddeux.attlocal.net
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/catalog/Catalog.pm | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm index e1f3c3a5eed..767a2ecc00a 100644 --- a/src/backend/catalog/Catalog.pm +++ b/src/backend/catalog/Catalog.pm @@ -46,6 +46,9 @@ sub Catalogs open(INPUT_FILE, '<', $input_file) || die "$input_file: $!"; + my ($filename) = ($input_file =~ m/(\w+)\.h$/); + my $natts_pat = "Natts_$filename"; + # Scan the input file. while (<INPUT_FILE>) { @@ -70,8 +73,15 @@ sub Catalogs s/\s+/ /g; # Push the data into the appropriate data structure. - if (/^DATA\(insert(\s+OID\s+=\s+(\d+))?\s+\(\s*(.*)\s*\)\s*\)$/) + if (/$natts_pat\s+(\d+)/) + { + $catalog{natts} = $1; + } + elsif (/^DATA\(insert(\s+OID\s+=\s+(\d+))?\s+\(\s*(.*)\s*\)\s*\)$/) { + check_natts($filename, $catalog{natts}, $3, + $input_file, INPUT_FILE->input_line_number); + push @{ $catalog{data} }, { oid => $2, bki_values => $3 }; } elsif (/^DESCR\(\"(.*)\"\)$/) @@ -216,4 +226,20 @@ sub RenameTempFile rename($temp_name, $final_name) || die "rename: $temp_name: $!"; } +# verify the number of fields in the passed-in bki structure +sub check_natts +{ + my ($catname, $natts, $bki_val, $file, $line) = @_; + die "Could not find definition for Natts_${catname} before start of DATA() in $file\n" + unless defined $natts; + + # we're working with a copy and need to count the fields only, so collapse + $bki_val =~ s/"[^"]*?"/xxx/g; + my @atts = split /\s+/, $bki_val; + + die sprintf + "Wrong number of attributes in DATA() entry at %s:%d (expected %d but got %d)\n", + $file, $line, $natts, scalar @atts + unless $natts == @atts; +} 1; |