Throw an error if a DATA() line contains wrong # of attributes.
authorRobert Haas <rhaas@postgresql.org>
Thu, 9 Mar 2017 23:17:58 +0000 (18:17 -0500)
committerRobert Haas <rhaas@postgresql.org>
Thu, 9 Mar 2017 23:17:58 +0000 (18:17 -0500)
David Christensen, reviewed by Dagfinn Ilmari MannsÃ¥ker

Discussion: http://postgr.es/m/20170215154018.fs5vwtqhp5d2sifs@veeddeux.attlocal.net

src/backend/catalog/Catalog.pm

index e1f3c3a5eed2eb93f364fb45af6bc57cf91895d4..767a2ecc00a91b742d870bff38124dbcaf66598e 100644 (file)
@@ -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;