Thread: Schema name of function

Schema name of function

From
"John Hansen"
Date:
Just got reminded...

Is there a way for a C function to determine the name of the schema in which is was created?

... John




Re: Schema name of function

From
Michael Fuhr
Date:
On Mon, Feb 14, 2005 at 07:32:15PM +1100, John Hansen wrote:
> 
> Is there a way for a C function to determine the name of the
> schema in which is was created?

Dunno if there's anything as simple as whats_my_schema(), but
fcinfo->flinfo->fn_oid should contain the function's oid.  If nobody
mentions an easier way, you could use SPI to query pg_proc and
pg_namespace.

-- 
Michael Fuhr
http://www.fuhr.org/~mfuhr/


Re: Schema name of function

From
Tom Lane
Date:
Michael Fuhr <mike@fuhr.org> writes:
> On Mon, Feb 14, 2005 at 07:32:15PM +1100, John Hansen wrote:
>> Is there a way for a C function to determine the name of the
>> schema in which is was created?

> Dunno if there's anything as simple as whats_my_schema(), but
> fcinfo->flinfo->fn_oid should contain the function's oid.  If nobody
> mentions an easier way, you could use SPI to query pg_proc and
> pg_namespace.

In C, it'd be a lot easier (and faster) to do a couple of SearchSysCache
calls than to use SPI to get those rows.
        regards, tom lane


Re: Schema name of function

From
Michael Fuhr
Date:
On Mon, Feb 14, 2005 at 11:11:53AM -0500, Tom Lane wrote:
> 
> In C, it'd be a lot easier (and faster) to do a couple of SearchSysCache
> calls than to use SPI to get those rows.

The following appears to work -- does it look right, aside from the
missing error checking?
 tuple = SearchSysCache(PROCOID,                        ObjectIdGetDatum(fcinfo->flinfo->fn_oid),
0, 0, 0); nsoid = SysCacheGetAttr(PROCOID, tuple,                         Anum_pg_proc_pronamespace, &isnull);
schemaname= get_namespace_name(nsoid); ReleaseSysCache(tuple);
 

-- 
Michael Fuhr
http://www.fuhr.org/~mfuhr/


Re: Schema name of function

From
Tom Lane
Date:
Michael Fuhr <mike@fuhr.org> writes:
> On Mon, Feb 14, 2005 at 11:11:53AM -0500, Tom Lane wrote:
>> In C, it'd be a lot easier (and faster) to do a couple of SearchSysCache
>> calls than to use SPI to get those rows.

> The following appears to work -- does it look right, aside from the
> missing error checking?

>   tuple = SearchSysCache(PROCOID,
>                          ObjectIdGetDatum(fcinfo->flinfo->fn_oid),
>                          0, 0, 0);
>   nsoid = SysCacheGetAttr(PROCOID, tuple,
>                           Anum_pg_proc_pronamespace, &isnull);
>   schemaname = get_namespace_name(nsoid);
>   ReleaseSysCache(tuple);

That would work.  Since pronamespace is one of the fixed non-nullable
columns of pg_proc, you don't really need to use SysCacheGetAttr: you
can just map the C struct onto the tuple and grab the field directly.
nsoid = ((Form_pg_proc) GETSTRUCT(tuple))->pronamespace;

utils/cache/lsyscache.c contains lots of examples of this sort of thing.
(get_namespace_name is one, in fact.)
        regards, tom lane


Re: Schema name of function

From
"John Hansen"
Date:
Beautiful, just what I was looking for.

Thnx,

John

> -----Original Message-----
> From: Tom Lane [mailto:tgl@sss.pgh.pa.us]
> Sent: Tuesday, February 15, 2005 6:31 AM
> To: Michael Fuhr
> Cc: John Hansen; pgsql-hackers@postgresql.org
> Subject: Re: [HACKERS] Schema name of function
>
> Michael Fuhr <mike@fuhr.org> writes:
> > On Mon, Feb 14, 2005 at 11:11:53AM -0500, Tom Lane wrote:
> >> In C, it'd be a lot easier (and faster) to do a couple of
> >> SearchSysCache calls than to use SPI to get those rows.
>
> > The following appears to work -- does it look right, aside from the
> > missing error checking?
>
> >   tuple = SearchSysCache(PROCOID,
> >                          ObjectIdGetDatum(fcinfo->flinfo->fn_oid),
> >                          0, 0, 0);
> >   nsoid = SysCacheGetAttr(PROCOID, tuple,
> >                           Anum_pg_proc_pronamespace, &isnull);
> >   schemaname = get_namespace_name(nsoid);
> >   ReleaseSysCache(tuple);
>
> That would work.  Since pronamespace is one of the fixed
> non-nullable columns of pg_proc, you don't really need to use
> SysCacheGetAttr: you can just map the C struct onto the tuple
> and grab the field directly.
>
>     nsoid = ((Form_pg_proc) GETSTRUCT(tuple))->pronamespace;
>
> utils/cache/lsyscache.c contains lots of examples of this
> sort of thing.
> (get_namespace_name is one, in fact.)
>
>             regards, tom lane
>
>