Doc: update CREATE RULE ref page's hoary discussion of views.
authorTom Lane <[email protected]>
Fri, 3 Nov 2023 15:48:23 +0000 (11:48 -0400)
committerTom Lane <[email protected]>
Fri, 3 Nov 2023 15:48:23 +0000 (11:48 -0400)
This text left one with the impression that an ON SELECT rule could
be attached to a plain table, which has not been true since commit
264c06820 (meaning the text was already misleading when written,
evidently by me in 96bd67f61).  However, it didn't get really bad
until b23cd185f removed the convert-a-table-to-a-view logic, which
had made it possible for scripts that thought they were attaching
ON SELECTs to tables to still work.

Rewrite into a form that makes it clear that an ON SELECT rule
is better regarded as an implementation detail of a view.
Pre-v16, point out that adding ON SELECT to a table actually
converts it to a view.

Per bug #18178 from Joshua Uyehara.  Back-patch to all supported
branches.

Discussion: https://postgr.es/m/18178-05534d7064044d2d@postgresql.org

doc/src/sgml/ref/create_rule.sgml

index dbf4c937841d5ad45f6f3850a223342334c5242c..4871a896dc3dd99be829d25e00b82d12dfba0d25 100644 (file)
@@ -59,15 +59,16 @@ CREATE [ OR REPLACE ] RULE <replaceable class="parameter">name</replaceable> AS
   </para>
 
   <para>
-   Presently, <literal>ON SELECT</literal> rules must be unconditional
-   <literal>INSTEAD</literal> rules and must have actions that consist
-   of a single <command>SELECT</command> command.  Thus, an
-   <literal>ON SELECT</literal> rule effectively turns the table into
-   a view, whose visible contents are the rows returned by the rule's
-   <command>SELECT</command> command rather than whatever had been
-   stored in the table (if anything).  It is considered better style
-   to write a <command>CREATE VIEW</command> command than to create a
-   real table and define an <literal>ON SELECT</literal> rule for it.
+   Presently, <literal>ON SELECT</literal> rules can only be attached
+   to views.  Such a rule must be named <literal>"_RETURN"</literal>,
+   must be an unconditional <literal>INSTEAD</literal> rule, and must have
+   an action that consists of a single <command>SELECT</command> command.
+   This command defines the visible contents of the view.  (The view
+   itself is basically a dummy table with no storage.)  It's best to
+   regard such a rule as an implementation detail.  While a view can be
+   redefined via <literal>CREATE OR REPLACE RULE "_RETURN" AS
+   ...</literal>, it's better style to use <literal>CREATE OR REPLACE
+   VIEW</literal>.
   </para>
 
   <para>