summaryrefslogtreecommitdiff
path: root/doc/src
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src')
-rw-r--r--doc/src/sgml/catalogs.sgml37
-rw-r--r--doc/src/sgml/ref/create_function.sgml67
-rw-r--r--doc/src/sgml/release.sgml3
3 files changed, 80 insertions, 27 deletions
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 31f82d12370..ba9c9b15e79 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -1,6 +1,6 @@
<!--
Documentation of the system catalogs, directed toward PostgreSQL developers
- $Header: /cvsroot/pgsql/doc/src/sgml/catalogs.sgml,v 2.39 2002/03/29 19:05:57 tgl Exp $
+ $Header: /cvsroot/pgsql/doc/src/sgml/catalogs.sgml,v 2.40 2002/04/05 00:31:22 tgl Exp $
-->
<chapter id="catalogs">
@@ -1654,6 +1654,15 @@
</row>
<row>
+ <entry>pronamespace</entry>
+ <entry><type>oid</type></entry>
+ <entry>pg_namespace.oid</entry>
+ <entry>
+ The OID of the namespace that contains this function
+ </entry>
+ </row>
+
+ <row>
<entry>proowner</entry>
<entry><type>int4</type></entry>
<entry>pg_shadow.usesysid</entry>
@@ -1682,13 +1691,6 @@
</row>
<row>
- <entry>proiscachable</entry>
- <entry><type>bool</type></entry>
- <entry></entry>
- <entry>Function returns same result for same input values</entry>
- </row>
-
- <row>
<entry>proisstrict</entry>
<entry><type>bool</type></entry>
<entry></entry>
@@ -1701,6 +1703,25 @@
</row>
<row>
+ <entry>provolatile</entry>
+ <entry><type>char</type></entry>
+ <entry></entry>
+ <entry>
+ <structfield>provolatile</structfield> tells whether the function's
+ result depends only on its input arguments, or is affected by outside
+ factors.
+ It is <literal>i</literal> for <quote>immutable</> functions,
+ which always deliver the same result for the same inputs.
+ It is <literal>s</literal> for <quote>stable</> functions,
+ whose results (for fixed inputs) do not change within a scan.
+ It is <literal>v</literal> for <quote>volatile</> functions,
+ whose results may change at any time. (Use <literal>v</literal> also
+ for functions with side-effects, so that calls to them cannot get
+ optimized away.)
+ </entry>
+ </row>
+
+ <row>
<entry>pronargs</entry>
<entry><type>int2</type></entry>
<entry></entry>
diff --git a/doc/src/sgml/ref/create_function.sgml b/doc/src/sgml/ref/create_function.sgml
index c6ee3e25efd..28c54e1eb89 100644
--- a/doc/src/sgml/ref/create_function.sgml
+++ b/doc/src/sgml/ref/create_function.sgml
@@ -1,5 +1,5 @@
<!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_function.sgml,v 1.34 2002/03/22 19:20:37 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_function.sgml,v 1.35 2002/04/05 00:31:24 tgl Exp $
-->
<refentry id="SQL-CREATEFUNCTION">
@@ -160,35 +160,63 @@ CREATE [ OR REPLACE ] FUNCTION <replaceable class="parameter">name</replaceable>
<variablelist>
<varlistentry>
- <term>iscachable</term>
+ <term>isStrict</term>
<listitem>
<para>
- <option>Iscachable</option> indicates that the function always
- returns the same result when given the same argument values (i.e.,
- it does not do database lookups or otherwise use information not
- directly present in its parameter list). The optimizer uses
- <option>iscachable</option> to know whether it is safe to
- pre-evaluate a call of the function.
+ <option>isStrict</option> indicates that the function always
+ returns NULL whenever any of its arguments are NULL. If this
+ attribute is specified, the function is not executed when there
+ are NULL arguments; instead a NULL result is assumed automatically.
+ When <option>isStrict</option> is not specified, the function will
+ be called for NULL inputs. It is then the function author's
+ responsibility to check for NULLs if necessary and respond
+ appropriately.
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>isstrict</term>
+ <term>isImmutable</term>
+ <term>isCachable</term>
+ <term>isStable</term>
+ <term>isVolatile</term>
<listitem>
<para>
- <option>isstrict</option> indicates that the function always
- returns NULL whenever any of its arguments are NULL. If this
- attribute is specified, the function is not executed when there
- are NULL arguments; instead a NULL result is assumed automatically.
- When <option>isstrict</option> is not specified, the function will
- be called for NULL inputs. It is then the function author's
- responsibility to check for NULLs if necessary and respond
- appropriately.
+ These attributes inform the system whether it is safe to replace
+ multiple evaluations of the function with a single evaluation.
+ At most one choice should be specified. (If none of these appear,
+ <option>isVolatile</option> is the default assumption.)
+ <option>isImmutable</option> indicates that the function always
+ returns the same result when given the same argument values; that
+ is, it does not do database lookups or otherwise use information not
+ directly present in its parameter list. If this option is given,
+ any call of the function with all-constant arguments can be
+ immediately replaced with the function value.
+ <option>isCachable</option> is an
+ obsolete equivalent of <option>isImmutable</option>; it's still
+ accepted for backwards-compatibility reasons.
+ <option>isStable</option> indicates that within a single table scan
+ the function will consistently
+ return the same result for the same argument values, but that its
+ result could change across SQL statements. This is the appropriate
+ selection for functions whose results depend on database lookups,
+ parameter variables (such as the current timezone), etc. Also note
+ that the <literal>CURRENT_TIMESTAMP</> family of functions qualify
+ as stable, since their values do not change within a transaction.
+ <option>isVolatile</option> indicates that the function value can
+ change even within a single table scan, so no optimizations can be
+ made. Relatively few database functions are volatile in this sense;
+ some examples are <literal>random()</>, <literal>currval()</>,
+ <literal>timeofday()</>. Note that any function that has side-effects
+ must be classified volatile, even if its result is quite predictable,
+ to prevent calls from being optimized away; an example is
+ <literal>setval()</>.
</para>
</listitem>
</varlistentry>
</variablelist>
+
+ Attribute names are not case-sensitive.
</para>
</refsect1>
@@ -342,7 +370,7 @@ CREATE TABLE product (
<programlisting>
CREATE FUNCTION point(complex) RETURNS point
AS '/home/bernie/pgsql/lib/complex.so', 'complex_to_point'
- LANGUAGE C;
+ LANGUAGE C WITH (isStrict);
</programlisting>
The C declaration of the function could be:
@@ -359,6 +387,9 @@ Point * complex_to_point (Complex *z)
return p;
}
</programlisting>
+
+ Note that the function is marked <quote>strict</>; this allows us
+ to skip checking for NULL input in the function body.
</para>
</refsect1>
diff --git a/doc/src/sgml/release.sgml b/doc/src/sgml/release.sgml
index dfb96e4ff8e..e70bb7fa099 100644
--- a/doc/src/sgml/release.sgml
+++ b/doc/src/sgml/release.sgml
@@ -1,5 +1,5 @@
<!--
-$Header: /cvsroot/pgsql/doc/src/sgml/release.sgml,v 1.130 2002/04/03 05:39:28 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/release.sgml,v 1.131 2002/04/05 00:31:23 tgl Exp $
-->
<appendix id="release">
@@ -24,6 +24,7 @@ CDATA means the content is "SGML-free", so you can write without
worries about funny characters.
-->
<literallayout><![CDATA[
+Define a third class of function volatility to allow indexscans in more cases
Locale support is now built by default; choice of locale is set by initdb and/or at run-time
ALTER TABLE ALTER COLUMN SET/DROP NOT NULL
EXPLAIN output comes out as a query result, not a NOTICE message