From a5b8e34bfab6a687d6b13293c27f1f1246bffacb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dagfinn=20Ilmari=20Manns=C3=A5ker?= <ilmari@ilmari.org>
Date: Mon, 17 Apr 2017 15:19:33 +0100
Subject: [PATCH 3/4] Hashify bki values in Catlog::Catalogs

Both callers werere doing the same conversion of the bki_values array
into a hash, so do it just once in Catalog.pm
---
 src/backend/catalog/Catalog.pm   |  5 ++++-
 src/backend/catalog/genbki.pl    | 23 +++++++++++------------
 src/backend/utils/Gen_fmgrtab.pl | 18 ++++++------------
 3 files changed, 21 insertions(+), 25 deletions(-)

diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm
index 81513c7..9c06ec1 100644
--- a/src/backend/catalog/Catalog.pm
+++ b/src/backend/catalog/Catalog.pm
@@ -87,7 +87,10 @@ sub Catalogs
 				check_natts($filename, $catalog{natts}, scalar(@bki_values),
 							$input_file, $input_line_number);
 
-				push @{ $catalog{data} }, { oid => $1, bki_values => \@bki_values };
+				my %bki_values;
+				@bki_values{map $_->{name}, @{$catalog{columns}}} = @bki_values;
+
+				push @{ $catalog{data} }, { oid => $oid, bki_values => \%bki_values };
 			}
 			elsif (/^DESCR\(\"(.*)\"\)$/)
 			{
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index 8875f6c..fba157e 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -161,24 +161,23 @@ foreach my $catname (@{ $catalogs->{names} })
 		foreach my $row (@{ $catalog->{data} })
 		{
 
-			my %bki_values;
-			@bki_values{@attnames} = @{$row->{bki_values}};
+			my $bki_values = $row->{bki_values};
 
 			# Perform required substitutions on fields
-			foreach my $att (keys %bki_values)
+			foreach my $att (keys %$bki_values)
 			{
 				# Substitute constant values we acquired above.
 				# (It's intentional that this can apply to parts of a field).
-				$bki_values{$att} =~ s/\bPGUID\b/$BOOTSTRAP_SUPERUSERID/g;
-				$bki_values{$att} =~ s/\bPGNSP\b/$PG_CATALOG_NAMESPACE/g;
+				$bki_values->{$att} =~ s/\bPGUID\b/$BOOTSTRAP_SUPERUSERID/g;
+				$bki_values->{$att} =~ 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 ($bki_attr{$att}->{type} eq 'regproc')
 				{
-					my $procoid = $regprocoids{$bki_values{$att}};
-					$bki_values{$att} = $procoid
+					my $procoid = $regprocoids{$bki_values->{$att}};
+					$bki_values->{$att} = $procoid
 						if defined($procoid) && $procoid ne 'MULTIPLE';
 				}
 			}
@@ -187,20 +186,20 @@ foreach my $catname (@{ $catalogs->{names} })
 			# This relies on the order we process the files in!
 			if ($catname eq 'pg_proc')
 			{
-				if (defined($regprocoids{$bki_values{proname}}))
+				if (defined($regprocoids{$bki_values->{proname}}))
 				{
-					$regprocoids{$bki_values{proname}} = 'MULTIPLE';
+					$regprocoids{$bki_values->{proname}} = 'MULTIPLE';
 				}
 				else
 				{
-					$regprocoids{$bki_values{proname}} = $row->{oid};
+					$regprocoids{$bki_values->{proname}} = $row->{oid};
 				}
 			}
 
 			# Save pg_type info for pg_attribute processing below
 			if ($catname eq 'pg_type')
 			{
-				my %type = %bki_values;
+				my %type = %$bki_values;
 				$type{oid} = $row->{oid};
 				push @types, \%type;
 			}
@@ -208,7 +207,7 @@ foreach my $catname (@{ $catalogs->{names} })
 			# Write to postgres.bki
 			my $oid = $row->{oid} ? "OID = $row->{oid} " : '';
 			printf $bki "insert %s( %s )\n", $oid,
-			  join(' ', @bki_values{@attnames});
+			  join(' ', @{$bki_values}{@attnames});
 
 			# Write comments to postgres.description and postgres.shdescription
 			if (defined $row->{descr})
diff --git a/src/backend/utils/Gen_fmgrtab.pl b/src/backend/utils/Gen_fmgrtab.pl
index d2c4617..03a2ed5 100644
--- a/src/backend/utils/Gen_fmgrtab.pl
+++ b/src/backend/utils/Gen_fmgrtab.pl
@@ -49,28 +49,22 @@ my $catalogs = Catalog::Catalogs($infile);
 
 # Collect the raw data from pg_proc.h.
 my @fmgr = ();
-my @attnames;
-foreach my $column (@{ $catalogs->{pg_proc}->{columns} })
-{
-	push @attnames, $column->{name};
-}
 
 my $data = $catalogs->{pg_proc}->{data};
 foreach my $row (@$data)
 {
-	my %bki_values;
-	@bki_values{@attnames} = @{$row->{bki_values}};
+	my $bki_values = $row->{bki_values};
 
 	# Select out just the rows for internal-language procedures.
 	# Note assumption here that INTERNALlanguageId is 12.
-	next if $bki_values{prolang} ne '12';
+	next if $bki_values->{prolang} ne '12';
 
 	push @fmgr,
 	  { oid    => $row->{oid},
-		strict => $bki_values{proisstrict},
-		retset => $bki_values{proretset},
-		nargs  => $bki_values{pronargs},
-		prosrc => $bki_values{prosrc}, };
+		strict => $bki_values->{proisstrict},
+		retset => $bki_values->{proretset},
+		nargs  => $bki_values->{pronargs},
+		prosrc => $bki_values->{prosrc}, };
 }
 
 # Emit headers for both files
-- 
2.7.4

