On Dec 30, 2009, at 2:54 PM, Tim Bunce wrote:

> That handles the arity of the calls and invokes the right SP, bypassing
> SQL if the SP is already loaded.

Nice.

> That much works currently. Behind the scenes, when a stored procedure is
> loaded into plperl the code ref for the perl sub is stored in a cache.
> Effectively just
>    $cache{$name}[$nargs] = $coderef;
> An SP::AUTOLOAD sub intercepts any SP::* call and effectively does
>    lookup_sp($name, \...@_)->(@_);
> For SPs that are already loaded lookup_sp returns $cache{$name}[$nargs]
> so the overhead of the call is very small.

Definite benefit, there. How does it handle the difference between IMMUTABLE | 
STABLE | VOLATILE, as well as STRICT functions? And what does it do if the 
function called is not actually a Perl function?

> For SPs that are not cached, lookup_sp returns a code ref of a closure
> that will invoke $name with the args in @_ via
>    spi_exec_query("select * from $name($encoded_args)");
> 
> The fallback-to-SQL behaviour neatly handles non-cached SPs (forcing
> them to be loaded and thus cached), and inter-language calling (both
> plperl<->plperl and other PLs).

Is there a way for such a function to be cached? If not, I'm not sure where 
cached functions come from.

> Limitations:
> 
> * It's not meant to handle type polymorphism, only the number of args.

Well, spi_exec_query() handles the type polymorphism. So might it be possible 
to call SP::function() and have it not use a cached query? That way, one gets 
the benefit of polymorphism. Maybe there's a SP package that does caching, and 
an SPI package that does not? (Better named, though.)

> * When invoked via SQL, because the SP isn't cached, all non-ref args
>  are all expressed as strings via quote_nullable(). Any array refs
>  are encoded as ARRAY[...] via encode_array_constructor().

Hrm. Why not use spi_prepare() and let spi_exec_prepared() handle the quoting?

> I don't see either of those as significant issues: "If you need more
> control for a particular SP then don't use SP::* to call that SP."

If there was a non-cached version that was essentially just sugar for the SPI 
stuff, I think that would be more predicable, no? I'm not saying there 
shouldn't be a cached interface, just that it should not be the first choice 
when using polymorphic functions and non-PL/Perl functions.

> Open issues:
> 
> * What should SP::foo(...) return? The plain as-if-called-by-perl 
>  return value, or something closer to what spi_exec_query() returns?

The former.

> * If the called SP::foo(...) calls return_next those rows are returned
>  directly to the client.  That can be construed as a feature.

As a list?

Best,

David
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to