postgres.git / summary / log / commit / refs

commit    454edf1da9f36615b780b1cb216ae5d9fe8ba42c
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Mon Nov 12 00:56:16 2012 +0000

    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.


src/backend/parser/analyze.c | 4 ++++ 1 file changed, 4 insertions(+) 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. */ [parent: 9b06d91ac88d]