diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2022-10-17 12:14:39 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2022-10-17 12:14:39 -0400 |
commit | 4a41a069e7ac78e0a8b700fac181f59a234f8606 (patch) | |
tree | f957df65a21cfda57f641f527c2174a44ba2bc6e /src | |
parent | 2e3326929b0ba9f421f2ab1270c57b294c208a99 (diff) | |
download | postgresql-4a41a069e7ac78e0a8b700fac181f59a234f8606.tar.gz postgresql-4a41a069e7ac78e0a8b700fac181f59a234f8606.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')
-rw-r--r-- | src/backend/rewrite/rewriteDefine.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 185bf5fbff7..a354969ede6 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))); } /* |