summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorTom Lane2019-11-21 21:21:44 +0000
committerTom Lane2019-11-21 21:21:44 +0000
commit669138ebd1465944119340397bcf31bab3050404 (patch)
tree9e076581439af03d5692799f755f8039fd534a6f /src/include
parent62074a34360b7a2b05f30087c9fe83da1c8bb6c8 (diff)
Defend against self-referential views in relation_is_updatable().
While a self-referential view doesn't actually work, it's possible to create one, and it turns out that this breaks some of the information_schema views. Those views call relation_is_updatable(), which neglected to consider the hazards of being recursive. In older PG versions you get a "stack depth limit exceeded" error, but since v10 it'd recurse to the point of stack overrun and crash, because commit a4c35ea1c took out the expression_returns_set() call that was incidentally checking the stack depth. Since this function is only used by information_schema views, it seems like it'd be better to return "not updatable" than suffer an error. Hence, add tracking of what views we're examining, in just the same way that the nearby fireRIRrules() code detects self-referential views. I added a check_stack_depth() call too, just to be defensive. Per private report from Manuel Rigger. Back-patch to all supported versions.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/rewrite/rewriteHandler.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/include/rewrite/rewriteHandler.h b/src/include/rewrite/rewriteHandler.h
index 8128199fc31..339f3438fda 100644
--- a/src/include/rewrite/rewriteHandler.h
+++ b/src/include/rewrite/rewriteHandler.h
@@ -30,6 +30,7 @@ extern Query *get_view_query(Relation view);
extern const char *view_query_is_auto_updatable(Query *viewquery,
bool check_cols);
extern int relation_is_updatable(Oid reloid,
+ List *outer_reloids,
bool include_triggers,
Bitmapset *include_cols);