Minor cleanup in genbki.pl.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 3 Mar 2018 17:05:28 +0000 (12:05 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 3 Mar 2018 17:05:28 +0000 (12:05 -0500)
Separate out the pg_attribute logic of genbki.pl into its own function.
Drop unnecessary "defined $catalog->{data}" check.  This both narrows
and shortens the data writing loop of the script.  There is no functional
change (the emitted files are the same as before).

John Naylor

Discussion: https://postgr.es/m/CAJVSVGXnLH=BSo0x-aA818f=MyQqGS5nM-GDCWAMdnvQJTRC1A@mail.gmail.com

src/backend/catalog/genbki.pl

index ed90a0230357688ac734b8d2be08c178959a900c..b4abbff101f0ade20488d811f57633a4133bc572 100644 (file)
@@ -156,151 +156,83 @@ foreach my $catname (@{ $catalogs->{names} })
        print $bki "open $catname\n";
    }
 
-   if (defined $catalog->{data})
+   # For pg_attribute.h, we generate data entries ourselves.
+   # NB: pg_type.h must come before pg_attribute.h in the input list
+   # of catalog names, since we use info from pg_type.h here.
+   if ($catname eq 'pg_attribute')
    {
+       gen_pg_attribute($schema, @attnames);
+   }
 
-       # Ordinary catalog with DATA line(s)
-       foreach my $row (@{ $catalog->{data} })
-       {
-
-           # Split line into tokens without interpreting their meaning.
-           my %bki_values;
-           @bki_values{@attnames} =
-             Catalog::SplitDataLine($row->{bki_values});
-
-           # Perform required substitutions on fields
-           foreach my $column (@$schema)
-           {
-               my $attname = $column->{name};
-               my $atttype = $column->{type};
-
-               # Substitute constant values we acquired above.
-               # (It's intentional that this can apply to parts of a field).
-               $bki_values{$attname} =~ s/\bPGUID\b/$BOOTSTRAP_SUPERUSERID/g;
-               $bki_values{$attname} =~ s/\bPGNSP\b/$PG_CATALOG_NAMESPACE/g;
-
-               # Replace regproc columns' values with OIDs.
-               # If we don't have a unique value to substitute,
-               # just do nothing (regprocin will complain).
-               if ($atttype eq 'regproc')
-               {
-                   my $procoid = $regprocoids{ $bki_values{$attname} };
-                   $bki_values{$attname} = $procoid
-                     if defined($procoid) && $procoid ne 'MULTIPLE';
-               }
-           }
+   # Ordinary catalog with DATA line(s)
+   foreach my $row (@{ $catalog->{data} })
+   {
 
-           # Save pg_proc oids for use in later regproc substitutions.
-           # This relies on the order we process the files in!
-           if ($catname eq 'pg_proc')
-           {
-               if (defined($regprocoids{ $bki_values{proname} }))
-               {
-                   $regprocoids{ $bki_values{proname} } = 'MULTIPLE';
-               }
-               else
-               {
-                   $regprocoids{ $bki_values{proname} } = $row->{oid};
-               }
-           }
+       # Split line into tokens without interpreting their meaning.
+       my %bki_values;
+       @bki_values{@attnames} =
+         Catalog::SplitDataLine($row->{bki_values});
 
-           # Save pg_type info for pg_attribute processing below
-           if ($catname eq 'pg_type')
+       # Perform required substitutions on fields
+       foreach my $column (@$schema)
+       {
+           my $attname = $column->{name};
+           my $atttype = $column->{type};
+
+           # Substitute constant values we acquired above.
+           # (It's intentional that this can apply to parts of a field).
+           $bki_values{$attname} =~ s/\bPGUID\b/$BOOTSTRAP_SUPERUSERID/g;
+           $bki_values{$attname} =~ s/\bPGNSP\b/$PG_CATALOG_NAMESPACE/g;
+
+           # Replace regproc columns' values with OIDs.
+           # If we don't have a unique value to substitute,
+           # just do nothing (regprocin will complain).
+           if ($atttype eq 'regproc')
            {
-               my %type = %bki_values;
-               $type{oid} = $row->{oid};
-               $types{ $type{typname} } = \%type;
+               my $procoid = $regprocoids{ $bki_values{$attname} };
+               $bki_values{$attname} = $procoid
+                 if defined($procoid) && $procoid ne 'MULTIPLE';
            }
+       }
 
-           # Write to postgres.bki
-           my $oid = $row->{oid} ? "OID = $row->{oid} " : '';
-           printf $bki "insert %s( %s )\n", $oid,
-             join(' ', @bki_values{@attnames});
-
-           # Write comments to postgres.description and
-           # postgres.shdescription
-           if (defined $row->{descr})
+       # Save pg_proc oids for use in later regproc substitutions.
+       # This relies on the order we process the files in!
+       if ($catname eq 'pg_proc')
+       {
+           if (defined($regprocoids{ $bki_values{proname} }))
            {
-               printf $descr "%s\t%s\t0\t%s\n",
-                 $row->{oid}, $catname, $row->{descr};
+               $regprocoids{ $bki_values{proname} } = 'MULTIPLE';
            }
-           if (defined $row->{shdescr})
+           else
            {
-               printf $shdescr "%s\t%s\t%s\n",
-                 $row->{oid}, $catname, $row->{shdescr};
+               $regprocoids{ $bki_values{proname} } = $row->{oid};
            }
        }
-   }
-   if ($catname eq 'pg_attribute')
-   {
 
-       # For pg_attribute.h, we generate DATA entries ourselves.
-       # NB: pg_type.h must come before pg_attribute.h in the input list
-       # of catalog names, since we use info from pg_type.h here.
-       foreach my $table_name (@{ $catalogs->{names} })
+       # Save pg_type info for pg_attribute processing below
+       if ($catname eq 'pg_type')
        {
-           my $table = $catalogs->{$table_name};
-
-           # Currently, all bootstrapped relations also need schemapg.h
-           # entries, so skip if the relation isn't to be in schemapg.h.
-           next if !$table->{schema_macro};
-
-           $schemapg_entries{$table_name} = [];
-           push @tables_needing_macros, $table_name;
-
-           # Generate entries for user attributes.
-           my $attnum       = 0;
-           my $priornotnull = 1;
-           foreach my $attr (@{ $table->{columns} })
-           {
-               $attnum++;
-               my %row;
-               $row{attnum}   = $attnum;
-               $row{attrelid} = $table->{relation_oid};
-
-               morph_row_for_pgattr(\%row, $schema, $attr, $priornotnull);
-               $priornotnull &= ($row{attnotnull} eq 't');
-
-               # If it's bootstrapped, put an entry in postgres.bki.
-               print_bki_insert(\%row, @attnames) if $table->{bootstrap};
+           my %type = %bki_values;
+           $type{oid} = $row->{oid};
+           $types{ $type{typname} } = \%type;
+       }
 
-               # Store schemapg entries for later.
-               morph_row_for_schemapg(\%row, $schema);
-               push @{ $schemapg_entries{$table_name} },
-                 sprintf "{ %s }",
-                   join(', ', grep { defined $_ } @row{@attnames});
-           }
+       # Write to postgres.bki
+       my $oid = $row->{oid} ? "OID = $row->{oid} " : '';
+       printf $bki "insert %s( %s )\n", $oid,
+         join(' ', @bki_values{@attnames});
 
-           # Generate entries for system attributes.
-           # We only need postgres.bki entries, not schemapg.h entries.
-           if ($table->{bootstrap})
-           {
-               $attnum = 0;
-               my @SYS_ATTRS = (
-                   { name => 'ctid',     type => 'tid' },
-                   { name => 'oid',      type => 'oid' },
-                   { name => 'xmin',     type => 'xid' },
-                   { name => 'cmin',     type => 'cid' },
-                   { name => 'xmax',     type => 'xid' },
-                   { name => 'cmax',     type => 'cid' },
-                   { name => 'tableoid', type => 'oid' });
-               foreach my $attr (@SYS_ATTRS)
-               {
-                   $attnum--;
-                   my %row;
-                   $row{attnum}        = $attnum;
-                   $row{attrelid}      = $table->{relation_oid};
-                   $row{attstattarget} = '0';
-
-                   # Omit the oid column if the catalog doesn't have them
-                   next
-                     if $table->{without_oids}
-                         && $attr->{name} eq 'oid';
-
-                   morph_row_for_pgattr(\%row, $schema, $attr, 1);
-                   print_bki_insert(\%row, @attnames);
-               }
-           }
+       # Write comments to postgres.description and
+       # postgres.shdescription
+       if (defined $row->{descr})
+       {
+           printf $descr "%s\t%s\t0\t%s\n",
+             $row->{oid}, $catname, $row->{descr};
+       }
+       if (defined $row->{shdescr})
+       {
+           printf $shdescr "%s\t%s\t%s\n",
+             $row->{oid}, $catname, $row->{shdescr};
        }
    }
 
@@ -375,6 +307,82 @@ exit 0;
 #################### Subroutines ########################
 
 
+# For each catalog marked as needing a schema macro, generate the
+# per-user-attribute data to be incorporated into schemapg.h.  Also, for
+# bootstrap catalogs, emit pg_attribute entries into the .bki file
+# for both user and system attributes.
+sub gen_pg_attribute
+{
+   my $schema = shift;
+   my @attnames = @_;
+
+   foreach my $table_name (@{ $catalogs->{names} })
+   {
+       my $table = $catalogs->{$table_name};
+
+       # Currently, all bootstrapped relations also need schemapg.h
+       # entries, so skip if the relation isn't to be in schemapg.h.
+       next if !$table->{schema_macro};
+
+       $schemapg_entries{$table_name} = [];
+       push @tables_needing_macros, $table_name;
+
+       # Generate entries for user attributes.
+       my $attnum       = 0;
+       my $priornotnull = 1;
+       foreach my $attr (@{ $table->{columns} })
+       {
+           $attnum++;
+           my %row;
+           $row{attnum}   = $attnum;
+           $row{attrelid} = $table->{relation_oid};
+
+           morph_row_for_pgattr(\%row, $schema, $attr, $priornotnull);
+           $priornotnull &= ($row{attnotnull} eq 't');
+
+           # If it's bootstrapped, put an entry in postgres.bki.
+           print_bki_insert(\%row, @attnames) if $table->{bootstrap};
+
+           # Store schemapg entries for later.
+           morph_row_for_schemapg(\%row, $schema);
+           push @{ $schemapg_entries{$table_name} },
+             sprintf "{ %s }",
+               join(', ', grep { defined $_ } @row{@attnames});
+       }
+
+       # Generate entries for system attributes.
+       # We only need postgres.bki entries, not schemapg.h entries.
+       if ($table->{bootstrap})
+       {
+           $attnum = 0;
+           my @SYS_ATTRS = (
+               { name => 'ctid',     type => 'tid' },
+               { name => 'oid',      type => 'oid' },
+               { name => 'xmin',     type => 'xid' },
+               { name => 'cmin',     type => 'cid' },
+               { name => 'xmax',     type => 'xid' },
+               { name => 'cmax',     type => 'cid' },
+               { name => 'tableoid', type => 'oid' });
+           foreach my $attr (@SYS_ATTRS)
+           {
+               $attnum--;
+               my %row;
+               $row{attnum}        = $attnum;
+               $row{attrelid}      = $table->{relation_oid};
+               $row{attstattarget} = '0';
+
+               # Omit the oid column if the catalog doesn't have them
+               next
+                 if $table->{without_oids}
+                     && $attr->{name} eq 'oid';
+
+               morph_row_for_pgattr(\%row, $schema, $attr, 1);
+               print_bki_insert(\%row, @attnames);
+           }
+       }
+   }
+}
+
 # Given $pgattr_schema (the pg_attribute schema for a catalog sufficient for
 # AddDefaultValues), $attr (the description of a catalog row), and
 # $priornotnull (whether all prior attributes in this catalog are not null),