Doc: explain about dependency tracking for new-style SQL functions.

5.14 Dependency Tracking was not updated when we added new-style
SQL functions.  Improve that.

Noted by Sami Imseih.  Back-patch to v14 where
new-style SQL functions came in.

Discussion: https://postgr.es/m/2C1933AB-C2F8-499B-9D18-4AC1882256A0@amazon.com
This commit is contained in:
Tom Lane 2023-06-04 13:27:34 -04:00
parent 0161074786
commit 0211544969
1 changed files with 20 additions and 2 deletions

View File

@ -5235,8 +5235,9 @@ DROP TABLE products CASCADE;
</para>
<para>
For user-defined functions, <productname>PostgreSQL</productname> tracks
dependencies associated with a function's externally-visible properties,
For a user-defined function or procedure whose body is defined as a string
literal, <productname>PostgreSQL</productname> tracks
dependencies associated with the function's externally-visible properties,
such as its argument and result types, but <emphasis>not</emphasis> dependencies
that could only be known by examining the function body. As an example,
consider this situation:
@ -5264,6 +5265,23 @@ CREATE FUNCTION get_color_note (rainbow) RETURNS text AS
table is missing, though executing it would cause an error; creating a new
table of the same name would allow the function to work again.
</para>
<para>
On the other hand, for a SQL-language function or procedure whose body
is written in SQL-standard style, the body is parsed at function
definition time and all dependencies recognized by the parser are
stored. Thus, if we write the function above as
<programlisting>
CREATE FUNCTION get_color_note (rainbow) RETURNS text
BEGIN ATOMIC
SELECT note FROM my_colors WHERE color = $1;
END;
</programlisting>
then the function's dependency on the <structname>my_colors</structname>
table will be known and enforced by <command>DROP</command>.
</para>
</sect1>
</chapter>