aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2012-11-11 19:56:16 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2012-11-11 19:56:16 -0500
commit454edf1da9f36615b780b1cb216ae5d9fe8ba42c (patch)
treea60af5a7bcaf153dfb60c8925ed1d4201dd0e99e
parent9b06d91ac88d2263d185fb12c7f11d9b450326db (diff)
downloadpostgresql-454edf1da9f36615b780b1cb216ae5d9fe8ba42c.tar.gz
postgresql-454edf1da9f36615b780b1cb216ae5d9fe8ba42c.zip
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 263edb5a7a6..c3e8b803027 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"
@@ -1558,6 +1559,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.
*/