• Tom Lane's avatar
    Replace our traditional initial-catalog-data format with a better design. · 372728b0
    Tom Lane authored
    Historically, the initial catalog data to be installed during bootstrap
    has been written in DATA() lines in the catalog header files.  This had
    lots of disadvantages: the format was badly underdocumented, it was
    very difficult to edit the data in any mechanized way, and due to the
    lack of any abstraction the data was verbose, hard to read/understand,
    and easy to get wrong.
    
    Hence, move this data into separate ".dat" files and represent it in a way
    that can easily be read and rewritten by Perl scripts.  The new format is
    essentially "key => value" for each column; while it's a bit repetitive,
    explicit labeling of each value makes the data far more readable and less
    error-prone.  Provide a way to abbreviate entries by omitting field values
    that match a specified default value for their column.  This allows removal
    of a large amount of repetitive boilerplate and also lowers the barrier to
    adding new columns.
    
    Also teach genbki.pl how to translate symbolic OID references into
    numeric OIDs for more cases than just "regproc"-like pg_proc references.
    It can now do that for regprocedure-like references (thus solving the
    problem that regproc is ambiguous for overloaded functions), operators,
    types, opfamilies, opclasses, and access methods.  Use this to turn
    nearly all OID cross-references in the initial data into symbolic form.
    This represents a very large step forward in readability and error
    resistance of the initial catalog data.  It should also reduce the
    difficulty of renumbering OID assignments in uncommitted patches.
    
    Also, solve the longstanding problem that frontend code that would like to
    use OID macros and other information from the catalog headers often had
    difficulty with backend-only code in the headers.  To do this, arrange for
    all generated macros, plus such other declarations as we deem fit, to be
    placed in "derived" header files that are safe for frontend inclusion.
    (Once clients migrate to using these pg_*_d.h headers, it will be possible
    to get rid of the pg_*_fn.h headers, which only exist to quarantine code
    away from clients.  That is left for follow-on patches, however.)
    
    The now-automatically-generated macros include the Anum_xxx and Natts_xxx
    constants that we used to have to update by hand when adding or removing
    catalog columns.
    
    Replace the former manual method of generating OID macros for pg_type
    entries with an automatic method, ensuring that all built-in types have
    OID macros.  (But note that this patch does not change the way that
    OID macros for pg_proc entries are built and used.  It's not clear that
    making that match the other catalogs would be worth extra code churn.)
    
    Add SGML documentation explaining what the new data format is and how to
    work with it.
    
    Despite being a very large change in the catalog headers, there is no
    catversion bump here, because postgres.bki and related output files
    haven't changed at all.
    
    John Naylor, based on ideas from various people; review and minor
    additional coding by me; previous review by Alvaro Herrera
    
    Discussion: https://postgr.es/m/CAJVSVGWO48JbbwXkJz_yBFyGYW-M9YWxnPdxJBUosDC9ou_F0Q@mail.gmail.com
    372728b0
pg_subscription_rel.h 2.47 KB