postgres.git / summary / log / commit / refs

commit    797e313dc9aed83e28e9f1d08a281ea48c560cd2
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Mon Oct 17 16:14:39 2022 +0000
First released in: 16.0, 10.23, 11.18, 12.13, 13.9, 14.6, 15.1

    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


src/backend/rewrite/rewriteDefine.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 213eabfbb9f..09165b269b3 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -530,6 +530,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))); } /* [parent: eec34661182d]