Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 797e313

Browse files
committed
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
1 parent eec3466 commit 797e313

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

src/backend/rewrite/rewriteDefine.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,18 @@ DefineQueryRewrite(const char *rulename,
530530
RelationGetDescr(event_relation),
531531
false, false);
532532
}
533+
534+
/*
535+
* And finally, if it's not an ON SELECT rule then it must *not* be
536+
* named _RETURN. This prevents accidentally or maliciously replacing
537+
* a view's ON SELECT rule with some other kind of rule.
538+
*/
539+
if (strcmp(rulename, ViewSelectRuleName) == 0)
540+
ereport(ERROR,
541+
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
542+
errmsg("non-view rule for \"%s\" must not be named \"%s\"",
543+
RelationGetRelationName(event_relation),
544+
ViewSelectRuleName)));
533545
}
534546

535547
/*

0 commit comments

Comments
 (0)