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

From: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
To: Michael Krüger <michael(at)kruegers(dot)email>
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 12:45:05
Message-ID: CAFj8pRAKW+gHuiXwyeuQ3HgT87Ndj6bM+yH2UnwNxX8-P_4B6A@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

čt 3. 12. 2020 v 11:44 odesílatel Michael Krüger <michael(at)kruegers(dot)email>
napsal:

> 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.
>

with pleasure.

When you write C extensions for Postgres, then PostgreSQL source code is
the best source of inspiration.

Regards

Pavel

> Regards,
> Michael
>

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Daniel Verite 2020-12-03 14:18:42 Re: psql > split > queries & output
Previous Message Pavel Stehule 2020-12-03 12:33:07 Re: psql > split > queries & output