aboutsummaryrefslogtreecommitdiff
path: root/src/backend/rewrite/rewriteDefine.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2022-10-17 12:14:39 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2022-10-17 12:14:39 -0400
commit65c1106d8c5bea72b30c257d992c0d42f1b52440 (patch)
tree07eb6c882e724fa02fa185e8439edc217b3e34dc /src/backend/rewrite/rewriteDefine.c
parent99b6b705d439fbf72aefe968941f38d571b9231c (diff)
downloadpostgresql-65c1106d8c5bea72b30c257d992c0d42f1b52440.tar.gz
postgresql-65c1106d8c5bea72b30c257d992c0d42f1b52440.zip
Reject non-ON-SELECT rules that are named "_RETURN".
DefineQueryRewrite() has long required that ON SELECT rules be named "_RETURN". But we overlooked the converse case: we should forbid non-ON-SELECT rules that are named "_RETURN". In particular this prevents using CREATE OR REPLACE RULE to overwrite a view's _RETURN rule with some other kind of rule, thereby breaking the view. Per bug #17646 from Kui Liu. Back-patch to all supported branches. Discussion: https://postgr.es/m/17646-70c93cfa40365776@postgresql.org
Diffstat (limited to 'src/backend/rewrite/rewriteDefine.c')
-rw-r--r--src/backend/rewrite/rewriteDefine.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c
index c9788e538d2..62c46e43840 100644
--- a/src/backend/rewrite/rewriteDefine.c
+++ b/src/backend/rewrite/rewriteDefine.c
@@ -532,6 +532,18 @@ DefineQueryRewrite(const char *rulename,
RelationGetDescr(event_relation),
false, false);
}
+
+ /*
+ * And finally, if it's not an ON SELECT rule then it must *not* be
+ * named _RETURN. This prevents accidentally or maliciously replacing
+ * a view's ON SELECT rule with some other kind of rule.
+ */
+ if (strcmp(rulename, ViewSelectRuleName) == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
+ errmsg("non-view rule for \"%s\" must not be named \"%s\"",
+ RelationGetRelationName(event_relation),
+ ViewSelectRuleName)));
}
/*