| #!/usr/bin/perl |
| #---------------------------------------------------------------------- |
| # |
| # unused_oids |
| # Finds blocks of manually-assignable OIDs that have not already been |
| # claimed by previous hackers. The main use is for finding available |
| # OIDs for new internal functions. The numbers printed are inclusive |
| # ranges of unused OIDs. |
| # |
| # Before using a large empty block, make sure you aren't about |
| # to take over what was intended as expansion space for something |
| # else. |
| # |
| # Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group |
| # Portions Copyright (c) 1994, Regents of the University of California |
| # |
| # src/include/catalog/unused_oids |
| # |
| #---------------------------------------------------------------------- |
| |
| use strict; |
| use warnings; |
| |
| # Must run in src/include/catalog |
| use FindBin; |
| chdir $FindBin::RealBin or die "could not cd to $FindBin::RealBin: $!\n"; |
| |
| use lib "$FindBin::RealBin/../../backend/catalog/"; |
| use Catalog; |
| |
| my @input_files = (glob("pg_*.h"), glob("gp_*.h")); |
| |
| my $oids = Catalog::FindAllOidsFromHeaders(@input_files); |
| |
| # Also push FirstGenbkiObjectId to serve as a terminator for the last gap. |
| my $FirstGenbkiObjectId = |
| Catalog::FindDefinedSymbol('access/transam.h', '..', 'FirstGenbkiObjectId'); |
| push @{$oids}, $FirstGenbkiObjectId; |
| |
| # This value splits the OID range into two so that GPDB and GPSQL can add |
| # new built-in objects in parallel. |
| my $FirstGPDBObjectId = |
| Catalog::FindDefinedSymbol('access/transam.h', '..', 'LowestGPSQLBootstrapObjectId'); |
| |
| my $prev_oid = 0; |
| my @sortedoids = sort { $a <=> $b } @{$oids}; |
| foreach my $oid (@sortedoids) |
| { |
| if ($oid > $prev_oid + 1 && $oid < $FirstGPDBObjectId) |
| { |
| if ($oid > $prev_oid + 2) |
| { |
| printf "%d - %d\n", $prev_oid + 1, $oid - 1; |
| } |
| else |
| { |
| printf "%d\n", $prev_oid + 1; |
| } |
| } |
| $prev_oid = $oid; |
| } |
| |
| my $suggestion; |
| do |
| { |
| $suggestion = int(8000 + rand(2000)); |
| } while (grep(/^$suggestion$/, @{$oids})); |
| |
| my $navailable = 0; |
| foreach my $oid (@sortedoids) |
| { |
| if ($oid > $suggestion) |
| { |
| $navailable = $oid - $suggestion; |
| last; |
| } |
| } |
| |
| printf "Patches should use a more-or-less consecutive range of OIDs.\n"; |
| printf |
| "Best practice is to start with a random choice in the range 8000-9999.\n"; |
| printf |
| "Suggested random unused OID: $suggestion ($navailable consecutive OID(s) available starting here)\n"; |