Allow composite types in catalog bootstrap
authorTomas Vondra <tomas.vondra@postgresql.org>
Tue, 23 Mar 2021 23:47:50 +0000 (00:47 +0100)
committerTomas Vondra <tomas.vondra@postgresql.org>
Tue, 23 Mar 2021 23:47:52 +0000 (00:47 +0100)
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

index 52d36ae1a2889879356d2d733a87da3dbd1a4ee7..dce7088e6bbb25fcb5edd712aec686392f684998 100644 (file)
@@ -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
        {