The PQregisterTypes() function allows an application to register one or more PQT_SUBCLASS, PQT_COMPOSITE
or PQT_USERDEFINED types which is defined by the which argument.
When which is PQT_COMPOSITE or PQT_USERDEFINED, this function must execute a query against the backend to
retrieve type information, thus this should not be called from within a transaction. It is recommended
to register multiple composites at the same time to avoid round trip overhead.
The types argument is an array containing count types to register. Composites do not use the typput or
typget members of the PGregisterType structure, thus these memebrs are ignored. If any composite does
not exist, the register is aborted. User-defined types must set either typput and/or typget for each
type. Sub-classes typname member of the PGregisterType structure must specify an inheritence
relationship: ex. "myint=int4" where myint inherits from int4. The ´=´ is called the inheritence
operator. If both typput and typget members of the PGregisterType structure are NULL, the type at that
element will behave identically to the type it is inheriting from; an alias. Otherwise, the base type's
put and/or get routines will be overridden.
The async argument indicates if the asynchronous type registration should be used. When non-zero, the
caller must proceed in the normal async libpq fashion (PQconsumeInput, PQisBusy, PQgetResult) and provide
a PGresult to PQregisterResult when obtained to complete the registration.
NOTE: The typname member of the PGregisterType structure can optionally contain the type's schema:
schema.typname.
WARNING: PQparamCreate is only aware of types that have already been registered. If you need to put a
type into a param, make sure it is first registered.