Check for stack overflow in transformSetOperationTree().
authorTom Lane <[email protected]>
Mon, 12 Nov 2012 00:56:36 +0000 (19:56 -0500)
committerTom Lane <[email protected]>
Mon, 12 Nov 2012 00:56:36 +0000 (19:56 -0500)
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.

src/backend/parser/analyze.c

index 09c28dca033ca803519b4004781548d51b178456..76282f400951877610570ef9750b07b886b88cf4 100644 (file)
@@ -25,6 +25,7 @@
 #include "postgres.h"
 
 #include "catalog/pg_type.h"
+#include "miscadmin.h"
 #include "nodes/makefuncs.h"
 #include "optimizer/clauses.h"
 #include "optimizer/var.h"
@@ -1238,6 +1239,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.
     */