diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl index f6be50a..8d47109 100644 --- a/src/backend/catalog/genbki.pl +++ b/src/backend/catalog/genbki.pl @@ -343,34 +343,21 @@ EOM # # If the column type is oidvector or oid[], we have to replace # each element of the array as per the lookup rule. - # - # If we don't have a unique value to substitute, warn and - # leave the entry unchanged. if ($column->{lookup}) { my $lookup = $lookup_kind{ $column->{lookup} }; + my @lookupnames; + my @lookupoids; die "unrecognized BKI_LOOKUP type " . $column->{lookup} if !defined($lookup); if ($atttype eq 'oidvector') { - my @lookupnames = split /\s+/, $bki_values{$attname}; - my @lookupoids; - foreach my $lookupname (@lookupnames) - { - my $lookupoid = $lookup->{ $lookupname }; - if (defined($lookupoid) && $lookupoid ne 'MULTIPLE') - { - $lookupname = $lookupoid; - } - else - { - warn "unresolved OID reference \"$lookupname\" in $catname row " . join(',', values(%bki_values)) - if $lookupname ne '-' && $lookupname ne '0'; - } - push @lookupoids, $lookupname; - } + @lookupnames = split /\s+/, $bki_values{$attname}; + @lookupoids = lookup_oids($lookup, $catname, + \%bki_values, @lookupnames); + $bki_values{$attname} = join(' ', @lookupoids); } elsif ($atttype eq 'oid[]') @@ -378,39 +365,21 @@ EOM if ($bki_values{$attname} ne '_null_') { $bki_values{$attname} =~ s/[{}]//g; - my @lookupnames = split /,/, $bki_values{$attname}; - my @lookupoids; - foreach my $lookupname (@lookupnames) - { - my $lookupoid = $lookup->{ $lookupname }; - if (defined($lookupoid) && $lookupoid ne 'MULTIPLE') - { - $lookupname = $lookupoid; - } - else - { - warn "unresolved OID reference \"$lookupname\" in $catname row " . join(',', values(%bki_values)) - if $lookupname ne '-' && $lookupname ne '0'; - } - push @lookupoids, $lookupname; - } + @lookupnames = split /,/, $bki_values{$attname}; + @lookupoids = lookup_oids($lookup, $catname, + \%bki_values, @lookupnames); + $bki_values{$attname} = sprintf "{%s}", join(',', @lookupoids); } } else { - my $lookupname = $bki_values{$attname}; - my $lookupoid = $lookup->{ $lookupname }; - if (defined($lookupoid) && $lookupoid ne 'MULTIPLE') - { - $bki_values{$attname} = $lookupoid; - } - else - { - warn "unresolved OID reference \"$lookupname\" in $catname row " . join(',', values(%bki_values)) - if $lookupname ne '-' && $lookupname ne '0'; - } + $lookupnames[0] = $bki_values{$attname}; + @lookupoids = lookup_oids($lookup, $catname, + \%bki_values, @lookupnames); + + $bki_values{$attname} = $lookupoids[0]; } } } @@ -759,6 +728,32 @@ sub morph_row_for_schemapg } } +# Perform OID lookups on an array of OID names. +# If we don't have a unique value to substitute, warn and +# leave the entry unchanged. +sub lookup_oids +{ + my ($lookup, $catname, $bki_values, @lookupnames) = @_; + + my @lookupoids; + foreach my $lookupname (@lookupnames) + { + my $lookupoid = $lookup->{$lookupname}; + if (defined($lookupoid) and $lookupoid ne 'MULTIPLE') + { + push @lookupoids, $lookupoid; + } + else + { + push @lookupoids, $lookupname; + warn "unresolved OID reference \"$lookupname\" in $catname row " + . join(',', values(%$bki_values)) + if $lookupname ne '-' && $lookupname ne '0'; + } + } + return @lookupoids; +} + # Determine canonical pg_type OID #define symbol from the type name. sub form_pg_type_symbol {