use strict;
use warnings;
-require Exporter;
-our @ISA = qw(Exporter);
-our @EXPORT = ();
-our @EXPORT_OK = qw(Catalogs SplitDataLine RenameTempFile FindDefinedSymbol);
-
# Call this function with an array of names of header files to parse.
# Returns a nested data structure describing the data in the headers.
sub Catalogs
'int64' => 'int8',
'Oid' => 'oid',
'NameData' => 'name',
- 'TransactionId' => 'xid');
+ 'TransactionId' => 'xid',
+ 'XLogRecPtr' => 'pg_lsn');
foreach my $input_file (@_)
{
/BKI_WITHOUT_OIDS/ ? ' without_oids' : '';
$catalog{rowtype_oid} =
/BKI_ROWTYPE_OID\((\d+)\)/ ? " rowtype_oid $1" : '';
- $catalog{schema_macro} = /BKI_SCHEMA_MACRO/ ? 'True' : '';
+ $catalog{schema_macro} = /BKI_SCHEMA_MACRO/ ? 1 : 0;
$declaring_attributes = 1;
}
elsif ($declaring_attributes)
}
else
{
- my %row;
+ my %column;
my ($atttype, $attname, $attopt) = split /\s+/, $_;
die "parse error ($input_file)" unless $attname;
if (exists $RENAME_ATTTYPE{$atttype})
$atttype .= '[]'; # variable-length only
}
- $row{'type'} = $atttype;
- $row{'name'} = $attname;
+ $column{type} = $atttype;
+ $column{name} = $attname;
if (defined $attopt)
{
if ($attopt eq 'BKI_FORCE_NULL')
{
- $row{'forcenull'} = 1;
+ $column{forcenull} = 1;
}
elsif ($attopt eq 'BKI_FORCE_NOT_NULL')
{
- $row{'forcenotnull'} = 1;
+ $column{forcenotnull} = 1;
}
else
{
"unknown column option $attopt on column $attname";
}
}
- push @{ $catalog{columns} }, \%row;
+ push @{ $catalog{columns} }, \%column;
}
}
}
pg_default_acl.h pg_init_privs.h pg_seclabel.h pg_shseclabel.h \
pg_collation.h pg_partitioned_table.h pg_range.h pg_transform.h \
pg_sequence.h pg_publication.h pg_publication_rel.h pg_subscription.h \
- pg_subscription_rel.h toasting.h indexing.h \
+ pg_subscription_rel.h \
toasting.h indexing.h \
)
use warnings;
my @input_files;
-our @include_path;
+my @include_path;
my $output_path = '';
my $major_version;
my %schemapg_entries;
my @tables_needing_macros;
my %regprocoids;
-our @types;
+my @types;
# produce output, one catalog at a time
foreach my $catname (@{ $catalogs->{names} })
my $first = 1;
print $bki " (\n";
- foreach my $column (@{ $catalog->{columns} })
+ my $schema = $catalog->{columns};
+ foreach my $column (@$schema)
{
my $attname = $column->{name};
my $atttype = $column->{type};
}
print $bki "\n )\n";
- # open it, unless bootstrap case (create bootstrap does this automatically)
- if ($catalog->{bootstrap} eq '')
+ # Open it, unless bootstrap case (create bootstrap does this
+ # automatically)
+ if (!$catalog->{bootstrap})
{
print $bki "open $catname\n";
}
Catalog::SplitDataLine($row->{bki_values});
# Perform required substitutions on fields
- foreach my $att (keys %bki_values)
+ foreach my $column (@$schema)
{
+ my $attname = $column->{name};
+ my $atttype = $column->{type};
# 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{$attname} =~ s/\bPGUID\b/$BOOTSTRAP_SUPERUSERID/g;
+ $bki_values{$attname} =~ 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')
+ if ($atttype eq 'regproc')
{
- my $procoid = $regprocoids{ $bki_values{$att} };
- $bki_values{$att} = $procoid
+ my $procoid = $regprocoids{ $bki_values{$attname} };
+ $bki_values{$attname} = $procoid
if defined($procoid) && $procoid ne 'MULTIPLE';
}
}
printf $bki "insert %s( %s )\n", $oid,
join(' ', @bki_values{@attnames});
- # Write comments to postgres.description and postgres.shdescription
+ # Write comments to postgres.description and
+ # postgres.shdescription
if (defined $row->{descr})
{
- printf $descr "%s\t%s\t0\t%s\n", $row->{oid}, $catname,
- $row->{descr};
+ printf $descr "%s\t%s\t0\t%s\n",
+ $row->{oid}, $catname, $row->{descr};
}
if (defined $row->{shdescr})
{
- printf $shdescr "%s\t%s\t%s\n", $row->{oid}, $catname,
- $row->{shdescr};
+ printf $shdescr "%s\t%s\t%s\n",
+ $row->{oid}, $catname, $row->{shdescr};
}
}
}
# Currently, all bootstrapped relations also need schemapg.h
# entries, so skip if the relation isn't to be in schemapg.h.
- next if $table->{schema_macro} ne 'True';
+ next if !$table->{schema_macro};
$schemapg_entries{$table_name} = [];
push @tables_needing_macros, $table_name;
- my $is_bootstrap = $table->{bootstrap};
# Generate entries for user attributes.
my $attnum = 0;
$priornotnull &= ($row->{attnotnull} eq 't');
# If it's bootstrapped, put an entry in postgres.bki.
- if ($is_bootstrap eq ' bootstrap')
+ if ($table->{bootstrap})
{
bki_insert($row, @attnames);
}
$row =
emit_schemapg_row($row,
grep { $bki_attr{$_}{type} eq 'bool' } @attnames);
- push @{ $schemapg_entries{$table_name} }, '{ '
- . join(
- ', ', grep { defined $_ }
- map $row->{$_}, @attnames) . ' }';
+ push @{ $schemapg_entries{$table_name} },
+ sprintf "{ %s }",
+ join(', ', grep { defined $_ } @{$row}{@attnames});
}
# Generate entries for system attributes.
# We only need postgres.bki entries, not schemapg.h entries.
- if ($is_bootstrap eq ' bootstrap')
+ if ($table->{bootstrap})
{
$attnum = 0;
my @SYS_ATTRS = (
$row->{attnum} = $attnum;
$row->{attstattarget} = '0';
- # some catalogs don't have oids
+ # Omit the oid column if the catalog doesn't have them
next
- if $table->{without_oids} eq ' without_oids'
+ if $table->{without_oids}
&& $row->{attname} eq 'oid';
bki_insert($row, @attnames);
#-------------------------------------------------------------------------
#
# Gen_fmgrtab.pl
-# Perl script that generates fmgroids.h and fmgrtab.c from pg_proc.h
+# Perl script that generates fmgroids.h, fmgrprotos.h, and fmgrtab.c
+# from pg_proc.h
#
# Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
# Portions Copyright (c) 1994, Regents of the University of California
my $FirstBootstrapObjectId =
Catalog::FindDefinedSymbol('access/transam.h', \@include_path, 'FirstBootstrapObjectId');
+my $INTERNALlanguageId =
+ Catalog::FindDefinedSymbol('catalog/pg_language.h', \@include_path, 'INTERNALlanguageId');
# Read all the data from the include/catalog files.
my $catalogs = Catalog::Catalogs($infile);
@bki_values{@attnames} = Catalog::SplitDataLine($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 $INTERNALlanguageId;
push @fmgr,
{ oid => $row->{oid},
die <<EOM;
Usage: perl -I [directory of Catalog.pm] Gen_fmgrtab.pl [path to pg_proc.h]
-Gen_fmgrtab.pl generates fmgroids.h and fmgrtab.c from pg_proc.h
+Gen_fmgrtab.pl generates fmgroids.h, fmgrprotos.h, and fmgrtab.c from
+pg_proc.h
Report bugs to <pgsql-bugs\@postgresql.org>.
EOM
* src/include/catalog/pg_partitioned_table.h
*
* NOTES
- * the genbki.sh script reads this file and generates .bki
+ * the genbki.pl script reads this file and generates .bki
* information from the DATA() statements.
*
*-------------------------------------------------------------------------
+/* -------------------------------------------------------------------------
+ *
+ * pg_sequence.h
+ * definition of the system "sequence" relation (pg_sequence)
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * -------------------------------------------------------------------------
+ */
#ifndef PG_SEQUENCE_H
#define PG_SEQUENCE_H
#define Anum_pg_statistic_stavalues5 26
/*
- * Currently, five statistical slot "kinds" are defined by core PostgreSQL,
- * as documented below. Additional "kinds" will probably appear in
- * future to help cope with non-scalar datatypes. Also, custom data types
- * can define their own "kind" codes by mutual agreement between a custom
- * typanalyze routine and the selectivity estimation functions of the type's
- * operators.
+ * Several statistical slot "kinds" are defined by core PostgreSQL, as
+ * documented below. Also, custom data types can define their own "kind"
+ * codes by mutual agreement between a custom typanalyze routine and the
+ * selectivity estimation functions of the type's operators.
*
* Code reading the pg_statistic relation should not assume that a particular
* data "kind" will appear in any particular slot. Instead, search the
*/
#define SubscriptionRelRelationId 6102
-/* Workaround for genbki not knowing about XLogRecPtr */
-#define pg_lsn XLogRecPtr
-
CATALOG(pg_subscription_rel,6102) BKI_WITHOUT_OIDS
{
Oid srsubid; /* Oid of subscription */
Oid srrelid; /* Oid of relation */
char srsubstate; /* state of the relation in subscription */
- pg_lsn srsublsn; /* remote lsn of the state change used for
+ XLogRecPtr srsublsn; /* remote lsn of the state change used for
* synchronization coordination */
} FormData_pg_subscription_rel;