mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-29 22:49:41 +03:00 
			
		
		
		
	Create a separate oid range for oids assigned by genbki.pl.
The changes I made in 578b229718 assigned oids below
FirstBootstrapObjectId to objects in include/catalog/*.dat files that
did not have an oid assigned, starting at the max oid explicitly
assigned.  Tom criticized that for mainly two reasons:
1) It's not clear which values are manually and which explicitly
   assigned.
2) The space below FirstBootstrapObjectId gets pretty crowded, and
   some PostgreSQL forks have used oids >= 9000 for their own objects,
   to avoid conflicting.
Thus create a new range for objects not assigned explicit oids, but
assigned by genbki.pl. For now 1-9999 is for explicitly assigned oids,
FirstGenbkiObjectId (10000) to FirstBootstrapObjectId (1200) -1 is for
genbki.pl assigned oids, and < FirstNormalObjectId (16384) is for oids
assigned during bootstrap.  It's possible that we'll have to adjust
these boundaries, but there's some headroom for now.
Add a note suggesting that oids in forks should be assigned in the
9000-9999 range.
Catversion bump for obvious reasons.
Per complaint from Tom Lane.
Author: Andres Freund
Discussion: https://postgr.es/m/16845.1544393682@sss.pgh.pa.us
			
			
This commit is contained in:
		| @@ -88,7 +88,9 @@ generated-header-symlinks: $(top_builddir)/src/include/catalog/header-stamp | ||||
| # instead is cheating a bit, but it will achieve the goal of updating the | ||||
| # version number when it changes. | ||||
| bki-stamp: genbki.pl Catalog.pm $(POSTGRES_BKI_SRCS) $(POSTGRES_BKI_DATA) $(top_srcdir)/configure.in | ||||
| 	$(PERL) -I $(catalogdir) $< --set-version=$(MAJORVERSION) $(POSTGRES_BKI_SRCS) | ||||
| 	$(PERL) -I $(catalogdir) $< \ | ||||
| 		-I $(top_srcdir)/src/include/ --set-version=$(MAJORVERSION) \ | ||||
| 		$(POSTGRES_BKI_SRCS) | ||||
| 	touch $@ | ||||
|  | ||||
| # The generated headers must all be symlinked into builddir/src/include/, | ||||
|   | ||||
| @@ -22,6 +22,7 @@ use warnings; | ||||
| my @input_files; | ||||
| my $output_path = ''; | ||||
| my $major_version; | ||||
| my $include_path; | ||||
|  | ||||
| # Process command line switches. | ||||
| while (@ARGV) | ||||
| @@ -31,6 +32,10 @@ while (@ARGV) | ||||
| 	{ | ||||
| 		push @input_files, $arg; | ||||
| 	} | ||||
| 	elsif ($arg =~ /^-I/) | ||||
| 	{ | ||||
| 		$include_path = length($arg) > 2 ? substr($arg, 2) : shift @ARGV; | ||||
| 	} | ||||
| 	elsif ($arg =~ /^-o/) | ||||
| 	{ | ||||
| 		$output_path = length($arg) > 2 ? substr($arg, 2) : shift @ARGV; | ||||
| @@ -50,6 +55,7 @@ while (@ARGV) | ||||
| # Sanity check arguments. | ||||
| die "No input files.\n" if !@input_files; | ||||
| die "--set-version must be specified.\n" if !defined $major_version; | ||||
| die "-I, the header include path, must be specified.\n" if !$include_path; | ||||
|  | ||||
| # Make sure output_path ends in a slash. | ||||
| if ($output_path ne '' && substr($output_path, -1) ne '/') | ||||
| @@ -133,17 +139,9 @@ foreach my $header (@input_files) | ||||
| # While duplicate OIDs would only cause a failure if they appear in | ||||
| # the same catalog, our project policy is that manually assigned OIDs | ||||
| # should be globally unique, to avoid confusion. | ||||
| # | ||||
| # Also use the loop to determine the maximum explicitly assigned oid | ||||
| # found in the data file, we'll use that for default oid assignments. | ||||
| my $found = 0; | ||||
| my $maxoid = 0; | ||||
| foreach my $oid (keys %oidcounts) | ||||
| { | ||||
| 	if ($oid > $maxoid) | ||||
| 	{ | ||||
| 		$maxoid = $oid; | ||||
| 	} | ||||
| 	next unless $oidcounts{$oid} > 1; | ||||
| 	print STDERR "Duplicate OIDs detected:\n" if !$found; | ||||
| 	print STDERR "$oid\n"; | ||||
| @@ -151,6 +149,15 @@ foreach my $oid (keys %oidcounts) | ||||
| } | ||||
| die "found $found duplicate OID(s) in catalog data\n" if $found; | ||||
|  | ||||
|  | ||||
| # Oids not specified in the input files are automatically assigned, | ||||
| # starting at FirstGenbkiObjectId. | ||||
| my $FirstGenbkiObjectId = | ||||
|   Catalog::FindDefinedSymbol('access/transam.h', $include_path, | ||||
| 	'FirstGenbkiObjectId'); | ||||
| my $GenbkiNextOid = $FirstGenbkiObjectId; | ||||
|  | ||||
|  | ||||
| # Fetch some special data that we will substitute into the output file. | ||||
| # CAUTION: be wary about what symbols you substitute into the .bki file here! | ||||
| # It's okay to substitute things that are expected to be really constant | ||||
| @@ -418,8 +425,8 @@ EOM | ||||
| 			# Assign oid if oid column exists and no explicit assignment in row | ||||
| 			if ($attname eq "oid" and not defined $bki_values{$attname}) | ||||
| 			{ | ||||
| 				$bki_values{$attname} = $maxoid; | ||||
| 				$maxoid++; | ||||
| 				$bki_values{$attname} = $GenbkiNextOid; | ||||
| 				$GenbkiNextOid++; | ||||
| 			} | ||||
|  | ||||
| 			# Substitute constant values we acquired above. | ||||
| @@ -858,6 +865,7 @@ sub usage | ||||
| Usage: genbki.pl [options] header... | ||||
|  | ||||
| Options: | ||||
|     -I               include path | ||||
|     -o               output path | ||||
|     --set-version    PostgreSQL version number for initdb cross-check | ||||
|  | ||||
|   | ||||
| @@ -79,9 +79,9 @@ foreach my $datfile (@input_files) | ||||
| } | ||||
|  | ||||
| # Fetch some values for later. | ||||
| my $FirstBootstrapObjectId = | ||||
| my $FirstGenbkiObjectId = | ||||
|   Catalog::FindDefinedSymbol('access/transam.h', $include_path, | ||||
| 	'FirstBootstrapObjectId'); | ||||
| 	'FirstGenbkiObjectId'); | ||||
| my $INTERNALlanguageId = | ||||
|   Catalog::FindDefinedSymbolFromData($catalog_data{pg_language}, | ||||
| 	'INTERNALlanguageId'); | ||||
| @@ -252,13 +252,13 @@ const int fmgr_nbuiltins = (sizeof(fmgr_builtins) / sizeof(FmgrBuiltin)); | ||||
|  | ||||
| # Create fmgr_builtins_oid_index table. | ||||
| # | ||||
| # Note that the array has to be filled up to FirstBootstrapObjectId, | ||||
| # Note that the array has to be filled up to FirstGenbkiObjectId, | ||||
| # as we can't rely on zero initialization as 0 is a valid mapping. | ||||
| print $tfh qq| | ||||
| const uint16 fmgr_builtin_oid_index[FirstBootstrapObjectId] = { | ||||
| const uint16 fmgr_builtin_oid_index[FirstGenbkiObjectId] = { | ||||
| |; | ||||
|  | ||||
| for (my $i = 0; $i < $FirstBootstrapObjectId; $i++) | ||||
| for (my $i = 0; $i < $FirstGenbkiObjectId; $i++) | ||||
| { | ||||
| 	my $oid = $fmgr_builtin_oid_index[$i]; | ||||
|  | ||||
| @@ -269,7 +269,7 @@ for (my $i = 0; $i < $FirstBootstrapObjectId; $i++) | ||||
| 		$oid = 'InvalidOidBuiltinMapping'; | ||||
| 	} | ||||
|  | ||||
| 	if ($i + 1 == $FirstBootstrapObjectId) | ||||
| 	if ($i + 1 == $FirstGenbkiObjectId) | ||||
| 	{ | ||||
| 		print $tfh "  $oid\n"; | ||||
| 	} | ||||
|   | ||||
| @@ -75,7 +75,7 @@ fmgr_isbuiltin(Oid id) | ||||
| 	uint16		index; | ||||
|  | ||||
| 	/* fast lookup only possible if original oid still assigned */ | ||||
| 	if (id >= FirstBootstrapObjectId) | ||||
| 	if (id >= FirstGenbkiObjectId) | ||||
| 		return NULL; | ||||
|  | ||||
| 	/* | ||||
|   | ||||
		Reference in New Issue
	
	Block a user