]> granicus.if.org Git - postgresql/commitdiff
Revert treatment of NOTIFY in rules to its pre-7.1 behavior: notify will
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 7 Sep 2001 20:52:31 +0000 (20:52 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 7 Sep 2001 20:52:31 +0000 (20:52 +0000)
occur unconditionally, even if the rule should otherwise execute
conditionally.  This is more useful than giving an error, even though it's
not truly the correct behavior.  Per today's pghackers discussion.

doc/src/sgml/ref/create_rule.sgml
src/backend/rewrite/rewriteManip.c

index 4d682c8899a37ba561e5f9dfbe09f2075676e718..47c029e653d96092de4475f198b5f5f51f7c188e 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_rule.sgml,v 1.25 2001/09/03 12:57:49 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_rule.sgml,v 1.26 2001/09/07 20:52:30 tgl Exp $
 Postgres documentation
 -->
 
@@ -249,6 +249,20 @@ SELECT * FROM emp;
       </programlisting></para>
     </example>
    </para>
+
+   <para>
+    Presently, if a rule contains a NOTIFY query, the NOTIFY will be executed
+    unconditionally --- that is, the NOTIFY will be issued even if there are
+    not any rows that the rule should apply to.  For example, in
+      <programlisting>
+CREATE RULE notify_me AS ON UPDATE TO mytable DO NOTIFY mytable;
+
+UPDATE mytable SET name = 'foo' WHERE id = 42;
+      </programlisting>
+    one NOTIFY event will be sent during the UPDATE, whether or not there
+    are any rows with id = 42.  This is an implementation restriction that
+    may be fixed in future releases.
+   </para>
   </refsect2>
  </refsect1>
 
index 45115b8d045e3cc26803fa5f2d5993e7f0703b7c..238897d58ebd7dfd41c1cd09de5688e660436500 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteManip.c,v 1.57 2001/04/18 20:42:55 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteManip.c,v 1.58 2001/09/07 20:52:31 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -592,15 +592,21 @@ AddQual(Query *parsetree, Node *qual)
 
        if (parsetree->commandType == CMD_UTILITY)
        {
-
                /*
-                * Noplace to put the qual on a utility statement.
+                * There's noplace to put the qual on a utility statement.
+                *
+                * If it's a NOTIFY, silently ignore the qual; this means that the
+                * NOTIFY will execute, whether or not there are any qualifying rows.
+                * While clearly wrong, this is much more useful than refusing to
+                * execute the rule at all, and extra NOTIFY events are harmless for
+                * typical uses of NOTIFY.
                 *
-                * For now, we expect utility stmt to be a NOTIFY, so give a specific
-                * error message for that case.
+                * If it isn't a NOTIFY, error out, since unconditional execution
+                * of other utility stmts is unlikely to be wanted.  (This case is
+                * not currently allowed anyway, but keep the test for safety.)
                 */
                if (parsetree->utilityStmt && IsA(parsetree->utilityStmt, NotifyStmt))
-                       elog(ERROR, "Conditional NOTIFY is not implemented");
+                       return;
                else
                        elog(ERROR, "Conditional utility statements are not implemented");
        }
@@ -634,15 +640,13 @@ AddHavingQual(Query *parsetree, Node *havingQual)
 
        if (parsetree->commandType == CMD_UTILITY)
        {
-
                /*
-                * Noplace to put the qual on a utility statement.
+                * There's noplace to put the qual on a utility statement.
                 *
-                * For now, we expect utility stmt to be a NOTIFY, so give a specific
-                * error message for that case.
+                * See comments in AddQual for motivation.
                 */
                if (parsetree->utilityStmt && IsA(parsetree->utilityStmt, NotifyStmt))
-                       elog(ERROR, "Conditional NOTIFY is not implemented");
+                       return;
                else
                        elog(ERROR, "Conditional utility statements are not implemented");
        }