postgres.git / summary / log / commit / refs
commit e9377e3e53e6d7dc9458e296aba06af6b58dae7a
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 67ba8276104..10a3e872259 100644
--- a/src/backend/rewrite/rewriteDefine.c
+++ b/src/backend/rewrite/rewriteDefine.c
@@ -524,6 +524,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: 6618c276b7a0]