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