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
This commit is contained in:
Tom Lane 2022-10-17 12:14:39 -04:00
parent eec3466118
commit 797e313dc9
1 changed files with 12 additions and 0 deletions

View File

@ -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)));
}
/*