postgres.git / summary / log / commit / refs

commit    79f6a942bdb958fbd7ef6870d5bf2e3cefb65da5
Author:   Tomas Vondra <tomas.vondra@postgresql.org>
Date:     Tue Mar 23 23:47:50 2021 +0000

    Allow composite types in catalog bootstrap
    
    When resolving types during catalog bootstrap, try to reload the pg_type
    contents if a type is not found. That allows catalogs to contain
    composite types, e.g. row types for other catalogs.
    
    Author: Justin Pryzby
    Reviewed-by: Dean Rasheed, Tomas Vondra
    Discussion: https://postgr.es/m/ad7891d2-e90c-b446-9fe2-7419143847d7%40enterprisedb.com


src/backend/bootstrap/bootstrap.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 52d36ae1a28..dce7088e6bb 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -934,6 +934,29 @@ gettype(char *type) return app->am_oid; } } + + /* + * The type wasn't known; reload the pg_type contents and check again + * to handle composite types, added since last populating the list. + */ + + list_free_deep(Typ); + Typ = NIL; + populate_typ_list(); + + /* + * Calling gettype would result in infinite recursion for types missing + * in pg_type, so just repeat the lookup. + */ + foreach (lc, Typ) + { + struct typmap *app = lfirst(lc); + if (strncmp(NameStr(app->am_typ.typname), type, NAMEDATALEN) == 0) + { + Ap = app; + return app->am_oid; + } + } } else { [parent: e1a5e65703ce]