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; Regards Pavel > Regards, > Michael > > Email: michael@kruegers.email >