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;