aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2009-01-22 17:27:55 +0000
committerPeter Eisentraut <peter_e@gmx.net>2009-01-22 17:27:55 +0000
commitdd7e54a17ffed5767cd9af175024c60df2b1951c (patch)
tree2932885551f282e1466c6bd1f31a35c4938c329c /src/backend/commands
parent5841aa86eb67dabb0a54c81d21463002dfa7e358 (diff)
downloadpostgresql-dd7e54a17ffed5767cd9af175024c60df2b1951c.tar.gz
postgresql-dd7e54a17ffed5767cd9af175024c60df2b1951c.zip
Automatic view update rules
Bernd Helmle
Diffstat (limited to 'src/backend/commands')
-rw-r--r--src/backend/commands/view.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/backend/commands/view.c b/src/backend/commands/view.c
index c29e88abddb..de1834ab1c8 100644
--- a/src/backend/commands/view.c
+++ b/src/backend/commands/view.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/view.c,v 1.111 2009/01/01 17:23:40 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/view.c,v 1.112 2009/01/22 17:27:54 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -27,7 +27,9 @@
#include "parser/parse_relation.h"
#include "rewrite/rewriteDefine.h"
#include "rewrite/rewriteManip.h"
+#include "rewrite/rewriteRemove.h"
#include "rewrite/rewriteSupport.h"
+#include "rewrite/viewUpdate.h"
#include "utils/acl.h"
#include "utils/builtins.h"
#include "utils/lsyscache.h"
@@ -308,13 +310,28 @@ DefineViewRules(Oid viewOid, Query *viewParse, bool replace)
viewOid,
NULL,
CMD_SELECT,
- true,
+ true, /* is_instead */
+ true, /* is_auto */
replace,
list_make1(viewParse));
/*
- * Someday: automatic ON INSERT, etc
+ * Delete all implicit rules on replace. CreateViewUpdateRules()
+ * below will re-create them if appropriate for the new view
+ * definition.
*/
+ if (replace)
+ {
+ Relation rel = heap_open(viewOid, AccessExclusiveLock);
+ RemoveAutomaticRulesOnEvent(rel, CMD_INSERT);
+ RemoveAutomaticRulesOnEvent(rel, CMD_DELETE);
+ RemoveAutomaticRulesOnEvent(rel, CMD_UPDATE);
+ heap_close(rel, NoLock);
+ }
+
+ CommandCounterIncrement();
+
+ CreateViewUpdateRules(viewOid, viewParse);
}
/*---------------------------------------------------------------