Sounds like a great approach to me.  If it doesn't work, we will find
out during beta testing.

---------------------------------------------------------------------------

Tom Lane wrote:
> We've had a couple of complaints in the past about recursive functions
> crashing the server by overflowing the C execution stack.  There is a
> GUC variable max_expr_depth that is intended to prevent this sort of
> problem for the particular case of overly complex arithmetic
> expressions, but it's difficult to apply a similar solution to function
> calls.  A function nesting depth limit would necessarily be pretty
> arbitrary, since different functions might use very different amounts of
> stack space.
> 
> It occurred to me today that it would not be difficult to implement a
> direct check on the physical size of the execution stack.  We could have
> PostgresMain do this:
> 
>       /* global variables: */
>       char   *stack_base_ptr;
>       int     max_stack_size;       /* settable through GUC */
> 
>       PostgresMain(...)
>       {
>               char    stack_base_loc;
> 
>               stack_base_ptr = &stack_base_loc;
> 
>               ... server main loop here ...
>       }
> 
> Then, in key recursive routines such as ExecQual, add a stack depth test
> that looks like
> 
>       void check_stack_depth(void)
>       {
>               char    stack_top_loc;
> 
>               if (abs(stack_base_ptr - &stack_top_loc) > max_stack_size)
>                       elog(ERROR, "Stack depth limit exceeded");
>       }
> 
> Essentially we're measuring the distance between the local variables of
> PostgresMain and those of the current recursive routine.  (The abs()
> operation is needed since the stack grows up on some machines and down
> on others.)
> 
> Now, instead of a max_expr_depth variable that no one really knows how
> to set intelligently, we have a max_stack_size variable that we can tell
> people exactly how to set: a megabyte or so less than your "ulimit -s"
> value should work fine for most cases.  And it works for everything;
> recursive function calls, whatever.
> 
> I imagine that somewhere in the fine print of the ANSI C standard, it
> says that this maneuver doesn't give well-defined results --- but I
> cannot think of any platform where it wouldn't work.
> 
> Comments?
> 
>                       regards, tom lane
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])
> 

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  [EMAIL PROTECTED]               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to