*** boot-13/convert_oid2name.pl~	Sat Mar 31 07:53:29 2018
--- boot-13/convert_oid2name.pl	Wed Apr  4 21:45:05 2018
***************
*** 129,146 ****
  	  $row->{oprname}, $typenames{$row->{oprleft}}, $typenames{$row->{oprright}};
  }
  
! # Proc oid lookup.
  my %procoids;
  foreach my $row (@{ $catalog_data{pg_proc} })
  {
  	next if !ref $row;
  	if (defined($procoids{ $row->{proname} }))
  	{
  		$procoids{ $row->{proname} } = 'MULTIPLE';
  	}
  	else
  	{
! 		$procoids{ $row->{oid} } = $row->{proname};
  	}
  }
  
--- 129,153 ----
  	  $row->{oprname}, $typenames{$row->{oprleft}}, $typenames{$row->{oprright}};
  }
  
! # Proc oid lookup (see lookup_procname).
! my %procshortnames;
! my %proclongnames;
  my %procoids;
  foreach my $row (@{ $catalog_data{pg_proc} })
  {
  	next if !ref $row;
+ 	$procshortnames{ $row->{oid} } = $row->{proname};
+ 	$proclongnames{ $row->{oid} } = sprintf "%s(%s)",
+ 	  $row->{proname},
+       join(',', map($typenames{$_}, split(/\s+/, $row->{proargtypes})));
+ 	# We use this to track whether a proname is duplicated.
  	if (defined($procoids{ $row->{proname} }))
  	{
  		$procoids{ $row->{proname} } = 'MULTIPLE';
  	}
  	else
  	{
! 		$procoids{ $row->{proname} } = $row->{oid};
  	}
  }
  
***************
*** 186,191 ****
--- 193,200 ----
  
  			if ($catname eq 'pg_proc')
  			{
+ 				$values{provariadic} = $typenames{$values{provariadic}}
+ 				  if exists $values{provariadic};
  				$values{prorettype} = $typenames{$values{prorettype}};
  				if ($values{proargtypes})
  				{
***************
*** 211,222 ****
--- 220,236 ----
  			}
  			elsif ($catname eq 'pg_aggregate')
  			{
+ 				$values{aggfnoid}     = lookup_procname($values{aggfnoid});
  				$values{aggsortop}     = $opernames{$values{aggsortop}}
  				  if exists $values{aggsortop};
  				$values{aggtranstype}  = $typenames{$values{aggtranstype}};
  				$values{aggmtranstype} = $typenames{$values{aggmtranstype}}
  				  if exists $values{aggmtranstype};
  			}
+ 			elsif ($catname eq 'pg_am')
+ 			{
+ 				$values{aggfnoid}     = lookup_procname($values{aggfnoid});
+ 			}
  			elsif ($catname eq 'pg_amop')
  			{
  				$values{amoplefttype}   = $typenames{$values{amoplefttype}};
***************
*** 232,242 ****
--- 246,258 ----
  				$values{amprocfamily}    = $opfnames{$values{amprocfamily}};
  				$values{amproclefttype}  = $typenames{$values{amproclefttype}};
  				$values{amprocrighttype} = $typenames{$values{amprocrighttype}};
+ 				$values{amproc}          = lookup_procname($values{amproc});
  			}
  			elsif ($catname eq 'pg_cast')
  			{
  				$values{castsource} = $typenames{$values{castsource}};
  				$values{casttarget} = $typenames{$values{casttarget}};
+ 				$values{castfunc}   = lookup_procname($values{castfunc});
  			}
  			elsif ($catname eq 'pg_opclass')
  			{
***************
*** 255,260 ****
--- 271,277 ----
  				  if exists $values{oprcom};
  				$values{oprnegate} = $opernames{$values{oprnegate}}
  				  if exists $values{oprnegate};
+ 				$values{oprcode}   = lookup_procname($values{oprcode});
  			}
  			elsif ($catname eq 'pg_opfamily')
  			{
***************
*** 266,271 ****
--- 283,295 ----
  				$values{rngsubtype} = $typenames{$values{rngsubtype}};
  				$values{rngsubopc}  = $opcnames{$values{rngsubopc}};
  			}
+ 			elsif ($catname eq 'pg_type')
+ 			{
+ 				$values{typelem}    = $typenames{$values{typelem}}
+ 				  if exists $values{typelem};
+ 				$values{typarray}   = $typenames{$values{typarray}}
+ 				  if exists $values{typarray};
+ 			}
  
  			############################################################
  
***************
*** 412,417 ****
--- 436,454 ----
  	return $hash_str;
  }
  
+ sub lookup_procname
+ {
+ 	my $oid = shift;
+ 	return $oid if !defined($oid) || $oid eq '-' || $oid eq '0';
+ 	my $shortname = $procshortnames{$oid};
+ 	return $shortname if defined($shortname) &&
+ 		defined($procoids{$shortname}) &&
+ 		$procoids{$shortname} eq $oid;
+ 	my $longname = $proclongnames{$oid};
+ 	return $longname if defined($longname);
+ 	return $oid;
+ }
+ 
  sub usage
  {
  	die <<EOM;
