Hi,

> Am 03.12.2020 um 11:01 schrieb Pavel Stehule <pavel.steh...@gmail.com>:
> 
> Hi
> 
> čt 3. 12. 2020 v 10:32 odesílatel Michael Krüger <michael@kruegers.email> 
> napsal:
> Dear all,
> 
> I need to find out the Oid of a custom type in C programming language. This 
> type is defined in a schema, outside of the standard search path, e.g. public.
> I know that I can call TypenameGetTypid to find out an Oid. But this is not 
> working for me if the type is not in the public namespace.
> How can I query a non-public Oid? Do I have to change the search path? If yes 
> how do I do it? As mentioned I need to do this with the C interface. 
> 
> I looking to source code
> 
> Oid
> TypenameGetTypidExtended(const char *typname, bool temp_ok)
> {
> <-->Oid><--><-->typid;
> <-->ListCell   *l;
> 
> <-->recomputeNamespacePath();
> 
> <-->foreach(l, activeSearchPath)
> <-->{
> <--><-->Oid><--><-->namespaceId = lfirst_oid(l);
> 
> <--><-->if (!temp_ok && namespaceId == myTempNamespace)
> <--><--><-->continue;<-><--><-->/* do not look in temp namespace */
> 
> <--><-->typid = GetSysCacheOid2(TYPENAMENSP, Anum_pg_type_oid,
> <--><--><--><--><--><--><--><-->PointerGetDatum(typname),
> <--><--><--><--><--><--><--><-->ObjectIdGetDatum(namespaceId));
> <--><-->if (OidIsValid(typid))
> <--><--><-->return typid;
> <-->}
> 
> <-->/* Not found in path */
> <-->return InvalidOid;
> }
> 
> You can get the value from sys cache by call GetSysCacheOid2. It can looks 
> like
> 
> <--><-->char<-->   *schemaname;
> <--><-->char<-->   *typname;
> <--><--><-->namespaceId = LookupExplicitNamespace(schemaname, missing_ok);
> <--><--><-->if (OidIsValid(namespaceId))
> <--><--><--><-->typoid = GetSysCacheOid2(TYPENAMENSP, Anum_pg_type_oid,
> <--><--><--><--><--><--><--><--><--><--> PointerGetDatum(typname),
> <--><--><--><--><--><--><--><--><--><--> ObjectIdGetDatum(namespaceId));
> <--><--><-->else
> <--><--><--><-->typoid = InvalidOid;
> 

Thank you so much. That worked.

Regards,
Michael

Reply via email to