Allow composite types in catalog bootstrap
authorTomas Vondra <[email protected]>
Tue, 23 Mar 2021 23:47:50 +0000 (00:47 +0100)
committerTomas Vondra <[email protected]>
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
    {