From: | Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com> |
---|---|
To: | Eric Zhu <erkangzhu(at)gmail(dot)com> |
Cc: | pgsql-general <pgsql-general(at)lists(dot)postgresql(dot)org> |
Subject: | Re: Calling a SQL function inside a C function |
Date: | 2020-08-27 03:53:01 |
Message-ID: | CAFj8pRCdc93mgPFvHPqgk8JuaXxXNHQUKNk3-ObbWLA5rVSL4Q@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Hi
čt 27. 8. 2020 v 0:43 odesílatel Eric Zhu <erkangzhu(at)gmail(dot)com> napsal:
> How do I call a function defined using CREATE FUNCTION in SQL inside a C
> function in an extension? I feel this should be possible as the query
> parser is able to resolve the function names and arguments in a raw string
> query. I want to know if there is a standard way to look up for
> user-defined functions in the backend.
>
> For example, I have a function defined in SQL:
>
> ```
> CREATE FUNCTION times_two(x integer)
> RETURNS integer AS $$
> SELECT x*2
> $$ LANGUAGE SQL;
> ```
>
> Now I wish to call `times_two()` in a C extension similar to:
>
> ```
> // Look up for the user-defined function times_two()
> // ...
>
> // Use the function.
> Datum ret = DirectFunctionCall(times_two, Int32GetDatum(13));
> ```
>
Surely, it is not possible. You can use SPI interface, which is most
simple https://www.postgresql.org/docs/current/spi.html and instead of
calling function, you can call "SELECT times_two(x)". PLpgSQL is working
like that. It ensures necessary checks, and you don't need to manually
handle NULL values.
For direct function call of SQL function, you can use OidFunctionCall
some like
Oid funcargs = {INT4OID};
List *funcname;
Oid funcoid
funcname = stringToQualifiedNameList("times_two");
funcoid = LookupFuncName(func_name, 1, funcargs, false);
Datum ret = OidFunctionCall1(funcoid, Int32GetDatum(13));
Attention - for direct function calls the function should not to have any
NULL argument, and should not to return NULL.
Regards
Pavel
> Best,
> Eric
>
From | Date | Subject | |
---|---|---|---|
Next Message | Hemil Ruparel | 2020-08-27 04:40:07 | Are advisory locks guaranteed to be First Come First Serve? And can the behavior be relied upon? |
Previous Message | Tom Lane | 2020-08-26 23:33:54 | Re: Database cluster binary compatibility accross CPU platforms |