mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Revert updatable views
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
# Makefile for rewrite
|
||||
#
|
||||
# IDENTIFICATION
|
||||
# $PostgreSQL: pgsql/src/backend/rewrite/Makefile,v 1.18 2009/01/22 17:27:54 petere Exp $
|
||||
# $PostgreSQL: pgsql/src/backend/rewrite/Makefile,v 1.19 2009/01/27 12:40:15 petere Exp $
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@@ -13,7 +13,6 @@ top_builddir = ../../..
|
||||
include $(top_builddir)/src/Makefile.global
|
||||
|
||||
OBJS = rewriteRemove.o rewriteDefine.o \
|
||||
rewriteHandler.o rewriteManip.o rewriteSupport.o \
|
||||
viewUpdate.o
|
||||
rewriteHandler.o rewriteManip.o rewriteSupport.o
|
||||
|
||||
include $(top_srcdir)/src/backend/common.mk
|
||||
|
@@ -8,14 +8,13 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/rewrite/rewriteDefine.c,v 1.135 2009/01/22 17:27:54 petere Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/rewrite/rewriteDefine.c,v 1.136 2009/01/27 12:40:15 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#include "postgres.h"
|
||||
|
||||
#include "access/heapam.h"
|
||||
#include "access/xact.h"
|
||||
#include "catalog/dependency.h"
|
||||
#include "catalog/indexing.h"
|
||||
#include "catalog/namespace.h"
|
||||
@@ -26,7 +25,6 @@
|
||||
#include "parser/parse_utilcmd.h"
|
||||
#include "rewrite/rewriteDefine.h"
|
||||
#include "rewrite/rewriteManip.h"
|
||||
#include "rewrite/rewriteRemove.h"
|
||||
#include "rewrite/rewriteSupport.h"
|
||||
#include "utils/acl.h"
|
||||
#include "utils/builtins.h"
|
||||
@@ -41,7 +39,6 @@ static void checkRuleResultList(List *targetList, TupleDesc resultDesc,
|
||||
bool isSelect);
|
||||
static bool setRuleCheckAsUser_walker(Node *node, Oid *context);
|
||||
static void setRuleCheckAsUser_Query(Query *qry, Oid userid);
|
||||
static const char *rule_event_string(CmdType evtype);
|
||||
|
||||
|
||||
/*
|
||||
@@ -55,7 +52,6 @@ InsertRule(char *rulname,
|
||||
Oid eventrel_oid,
|
||||
AttrNumber evslot_index,
|
||||
bool evinstead,
|
||||
bool is_auto,
|
||||
Node *event_qual,
|
||||
List *action,
|
||||
bool replace)
|
||||
@@ -88,7 +84,6 @@ InsertRule(char *rulname,
|
||||
values[i++] = CharGetDatum(evtype + '0'); /* ev_type */
|
||||
values[i++] = CharGetDatum(RULE_FIRES_ON_ORIGIN); /* ev_enabled */
|
||||
values[i++] = BoolGetDatum(evinstead); /* is_instead */
|
||||
values[i++] = BoolGetDatum(is_auto); /* is_auto */
|
||||
values[i++] = CStringGetTextDatum(evqual); /* ev_qual */
|
||||
values[i++] = CStringGetTextDatum(actiontree); /* ev_action */
|
||||
|
||||
@@ -107,11 +102,7 @@ InsertRule(char *rulname,
|
||||
|
||||
if (HeapTupleIsValid(oldtup))
|
||||
{
|
||||
/*
|
||||
* If REPLACE was not used we still check if the old rule is
|
||||
* automatic: Then we replace it anyway.
|
||||
*/
|
||||
if (!replace && !((Form_pg_rewrite) GETSTRUCT(oldtup))->is_auto)
|
||||
if (!replace)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DUPLICATE_OBJECT),
|
||||
errmsg("rule \"%s\" for relation \"%s\" already exists",
|
||||
@@ -124,7 +115,6 @@ InsertRule(char *rulname,
|
||||
replaces[Anum_pg_rewrite_ev_attr - 1] = true;
|
||||
replaces[Anum_pg_rewrite_ev_type - 1] = true;
|
||||
replaces[Anum_pg_rewrite_is_instead - 1] = true;
|
||||
replaces[Anum_pg_rewrite_is_auto - 1] = true;
|
||||
replaces[Anum_pg_rewrite_ev_qual - 1] = true;
|
||||
replaces[Anum_pg_rewrite_ev_action - 1] = true;
|
||||
|
||||
@@ -215,7 +205,6 @@ DefineRule(RuleStmt *stmt, const char *queryString)
|
||||
whereClause,
|
||||
stmt->event,
|
||||
stmt->instead,
|
||||
false, /* not is_auto */
|
||||
stmt->replace,
|
||||
actions);
|
||||
}
|
||||
@@ -234,7 +223,6 @@ DefineQueryRewrite(char *rulename,
|
||||
Node *event_qual,
|
||||
CmdType event_type,
|
||||
bool is_instead,
|
||||
bool is_auto,
|
||||
bool replace,
|
||||
List *action)
|
||||
{
|
||||
@@ -458,42 +446,6 @@ DefineQueryRewrite(char *rulename,
|
||||
RelationGetDescr(event_relation),
|
||||
false);
|
||||
}
|
||||
|
||||
/*
|
||||
* If defining a non-automatic DO INSTEAD rule, drop all
|
||||
* automatic rules on the same event.
|
||||
*/
|
||||
if (!is_auto && is_instead)
|
||||
{
|
||||
RemoveAutomaticRulesOnEvent(event_relation, event_type);
|
||||
CommandCounterIncrement();
|
||||
}
|
||||
|
||||
/*
|
||||
* If defining an automatic rule and there is a manual rule on
|
||||
* the same event, warn and don't do it.
|
||||
*/
|
||||
if (is_auto && event_relation->rd_rules != NULL)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < event_relation->rd_rules->numLocks; i++)
|
||||
{
|
||||
RewriteRule *rule = event_relation->rd_rules->rules[i];
|
||||
|
||||
if (rule->event == event_type && !rule->is_auto && rule->isInstead == is_instead)
|
||||
{
|
||||
ereport(WARNING,
|
||||
(errmsg("automatic %s rule not created because manually created %s rule exists",
|
||||
rule_event_string(event_type), rule_event_string(event_type)),
|
||||
errhint("If you prefer to have the automatic rule, drop the manually created rule and run CREATE OR REPLACE VIEW again.")));
|
||||
|
||||
heap_close(event_relation, NoLock);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -509,7 +461,6 @@ DefineQueryRewrite(char *rulename,
|
||||
event_relid,
|
||||
event_attno,
|
||||
is_instead,
|
||||
is_auto,
|
||||
event_qual,
|
||||
action,
|
||||
replace);
|
||||
@@ -803,16 +754,3 @@ RenameRewriteRule(Oid owningRel, const char *oldName,
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
static const char *
|
||||
rule_event_string(CmdType type)
|
||||
{
|
||||
if (type == CMD_INSERT)
|
||||
return "INSERT";
|
||||
if (type == CMD_UPDATE)
|
||||
return "UPDATE";
|
||||
if (type == CMD_DELETE)
|
||||
return "DELETE";
|
||||
return "???";
|
||||
}
|
||||
|
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/rewrite/rewriteHandler.c,v 1.184 2009/01/22 20:16:06 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/rewrite/rewriteHandler.c,v 1.185 2009/01/27 12:40:15 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -1899,20 +1899,20 @@ QueryRewrite(Query *parsetree)
|
||||
{
|
||||
case CMD_INSERT:
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||||
errmsg("view is not updatable"),
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("cannot insert into a view"),
|
||||
errhint("You need an unconditional ON INSERT DO INSTEAD rule.")));
|
||||
break;
|
||||
case CMD_UPDATE:
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||||
errmsg("view is not updatable"),
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("cannot update a view"),
|
||||
errhint("You need an unconditional ON UPDATE DO INSTEAD rule.")));
|
||||
break;
|
||||
case CMD_DELETE:
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||||
errmsg("view is not updatable"),
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("cannot delete from a view"),
|
||||
errhint("You need an unconditional ON DELETE DO INSTEAD rule.")));
|
||||
break;
|
||||
default:
|
||||
|
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/rewrite/rewriteRemove.c,v 1.76 2009/01/22 17:27:54 petere Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/rewrite/rewriteRemove.c,v 1.77 2009/01/27 12:40:15 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -90,39 +90,6 @@ RemoveRewriteRule(Oid owningRel, const char *ruleName, DropBehavior behavior,
|
||||
performDeletion(&object, behavior);
|
||||
}
|
||||
|
||||
/*
|
||||
* RemoveAutomaticRulesOnEvent
|
||||
*
|
||||
* This will delete automatic rules, if any exist, on the event in the
|
||||
* relation.
|
||||
*/
|
||||
void
|
||||
RemoveAutomaticRulesOnEvent(Relation rel, CmdType event_type)
|
||||
{
|
||||
RuleLock *rulelocks = rel->rd_rules;
|
||||
int i;
|
||||
|
||||
/* If there are no rules on the relation, waste no more time. */
|
||||
if (rulelocks == NULL)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Look at all rules looking for the ones that are on the event
|
||||
* and are automatic.
|
||||
*/
|
||||
for (i = 0; i < rulelocks->numLocks; i++)
|
||||
{
|
||||
RewriteRule *oneLock = rulelocks->rules[i];
|
||||
|
||||
if (oneLock->event == event_type && oneLock->is_auto)
|
||||
{
|
||||
RemoveRewriteRuleById(oneLock->ruleId);
|
||||
elog(DEBUG1, "removing automatic rule with OID %u\n",
|
||||
oneLock->ruleId);
|
||||
deleteDependencyRecordsFor(RewriteRelationId, oneLock->ruleId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Guts of rule deletion.
|
||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user