Re: Postgres C-API: How to get the Oid for a custom type defined in a schema outside of the current search path

From: Michael Krüger <michael(at)kruegers(dot)email>
To: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
Cc: Postgres General <pgsql-general(at)postgresql(dot)org>
Subject: Re: Postgres C-API: How to get the Oid for a custom type defined in a schema outside of the current search path
Date: 2020-12-03 10:44:48
Message-ID: 32816FAC-CF61-45E0-B161-7DA662F3FEDF@kruegers.email
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi,

> Am 03.12.2020 um 11:01 schrieb Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>:
>
> Hi
>
> čt 3. 12. 2020 v 10:32 odesílatel Michael Krüger <michael(at)kruegers(dot)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

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Wim Bertels 2020-12-03 11:38:46 psql > split > queries & output
Previous Message Pavel Stehule 2020-12-03 10:01:42 Re: Postgres C-API: How to get the Oid for a custom type defined in a schema outside of the current search path