summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2012-11-12 00:56:32 +0000
committerTom Lane2012-11-12 00:56:32 +0000
commit78542e37b8e1b25f329e4baac618da39ee8f911b (patch)
tree3efd6b2134b27bb96bfa0051f83fa0b742f167fa
parent4fa38136f7468ac3377a0041808bfb1d3e851d23 (diff)
Check for stack overflow in transformSetOperationTree().
Since transformSetOperationTree() recurses, it can be driven to stack overflow with enough UNION/INTERSECT/EXCEPT clauses in a query. Add a check to ensure it fails cleanly instead of crashing. Per report from Matthew Gerber (though it's not clear whether this is the only thing going wrong for him). Historical note: I think the reasoning behind not putting a check here in the beginning was that the check in transformExpr() ought to be sufficient to guard the whole parser. However, because transformSetOperationTree() recurses all the way to the bottom of the set-operation tree before doing any analysis of the statement's expressions, that check doesn't save it.
-rw-r--r--src/backend/parser/analyze.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index 66ac4a36288..e4b41c74316 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -26,6 +26,7 @@
#include "access/sysattr.h"
#include "catalog/pg_type.h"
+#include "miscadmin.h"
#include "nodes/makefuncs.h"
#include "nodes/nodeFuncs.h"
#include "optimizer/var.h"
@@ -1386,6 +1387,9 @@ transformSetOperationTree(ParseState *pstate, SelectStmt *stmt,
Assert(stmt && IsA(stmt, SelectStmt));
+ /* Guard against stack overflow due to overly complex set-expressions */
+ check_stack_depth();
+
/*
* Validity-check both leaf and internal SELECTs for disallowed ops.
*/