Thread: Does CREATE FUNCTION... WITH (ISCACHABLE) work?

Does CREATE FUNCTION... WITH (ISCACHABLE) work?

From
"Joel Burton"
Date:
I have a function that always returns the same answer given the
same input (no database lookups, etc.). The pg Users' Manual
documents the attribute 'iscachable' as allowing the database to
parse the results of the function and not keep looking it up.

Does this actually work yet? A simple test case:

CREATE FUNCTION f() RETURNS INT AS '
BEGIN
  raise notice ''foo'';
  return 1;
end;
' LANGUAGE 'plpgsql' WITH (ISCACHABLE);

SELECT o();
NOTICE: foo
o
___
1
(1 row)

SELECT o();
NOTICE: foo
o
____
(1 row)

It might be that the parser is smart enough to copy any output
(such as the RAISE NOTICE), my fear is that it is actually running
the function a second time.

Does anyone know if this caching actually happens yet, or is this a
future feature?

Thanks.
--
Joel Burton, Director of Information Systems -*- jburton@scw.org
Support Center of Washington (www.scw.org)

Re: Does CREATE FUNCTION... WITH (ISCACHABLE) work?

From
Tom Lane
Date:
"Joel Burton" <jburton@scw.org> writes:
> I have a function that always returns the same answer given the
> same input (no database lookups, etc.). The pg Users' Manual
> documents the attribute 'iscachable' as allowing the database to
> parse the results of the function and not keep looking it up.

iscachable does not mean that the system will cache the results of the
function across queries, it just means that the function needn't be
re-evaluated multiple times for the same arguments within a single query.
For example, given

    SELECT * from table1 where col = foo(42);

If foo() is marked cachable then it's evaluated once during query
planning; if not it's evaluated again for each row scanned in table1.

I don't think anyone has plans to implement a function result cache
across queries.  Most of the time it'd be a waste of space and cycles...

            regards, tom lane

Re: Does CREATE FUNCTION... WITH (ISCACHABLE) work?

From
"Joel Burton"
Date:

On 19 Jul 2000, at 14:30, Tom Lane wrote:

> "Joel Burton" <jburton@scw.org> writes:
> > I have a function that always returns the same answer given the same
> > input (no database lookups, etc.). The pg Users' Manual documents
> > the attribute 'iscachable' as allowing the database to parse the
> > results of the function and not keep looking it up.
>
> iscachable does not mean that the system will cache the results of the
> function across queries, it just means that the function needn't be
> re-evaluated multiple times for the same arguments within a single
> query. For example, given
>
>  SELECT * from table1 where col = foo(42);
>
> If foo() is marked cachable then it's evaluated once during query
> planning; if not it's evaluated again for each row scanned in table1.

Sounds reasonable. But does it work as advertised?

CREATE FUNCTION foo(int) RETURNS int AS '
BEGIN
  RAISE NOTICE ''hi'';
  RETURN 1;
END;'
LANGUAGE 'plpgsql';

CREATE FUNCTION foocache(int) RETURNS int AS '
BEGIN
  RAISE NOTICE ''hi'';
  RETURN 1;
END;'
LANGUAGE 'plpgsql'
WITH (iscachable);

SELECT foo(1),foo(1),foo(1)
gives us 3 NOTICEs, as does
SELECT foocache(1), foocache(1), foocache(1)

So is it running the cached version a second time?

Thanks,

--
Joel Burton, Director of Information Systems -*- jburton@scw.org
Support Center of Washington (www.scw.org)

Re: Does CREATE FUNCTION... WITH (ISCACHABLE) work?

From
Tom Lane
Date:
"Joel Burton" <jburton@scw.org> writes:
>> If foo() is marked cachable then it's evaluated once during query
>> planning; if not it's evaluated again for each row scanned in table1.

> Sounds reasonable. But does it work as advertised?

Yes, it does.  You're still not trying it on multiple tuples.

            regards, tom lane