aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2010-11-06 16:50:18 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2010-11-06 16:50:18 -0400
commitdd1c781903811416db4e03383a4cb0bfc8cfac40 (patch)
tree95189e98f3f3663cfa4b4bf8904e36a1ca4aa4c8 /src
parent6736916f5f5a5f340aa20d4b27540764b5646585 (diff)
downloadpostgresql-dd1c781903811416db4e03383a4cb0bfc8cfac40.tar.gz
postgresql-dd1c781903811416db4e03383a4cb0bfc8cfac40.zip
Make get_stack_depth_rlimit() handle RLIM_INFINITY more sanely.
Rather than considering this result as meaning "unknown", report LONG_MAX. This won't change what superusers can set max_stack_depth to, but it will cause InitializeGUCOptions() to set the built-in default to 2MB not 100kB. The latter seems like a fairly unreasonable interpretation of "infinity". Per my investigation of odd buildfarm results as well as an old complaint from Heikki. Since this should persuade all the buildfarm animals to use a reasonable stack depth setting during "make check", revert previous patch that dumbed down a recursive regression test to only 5 levels.
Diffstat (limited to 'src')
-rw-r--r--src/backend/tcop/postgres.c12
-rw-r--r--src/backend/utils/misc/guc.c4
-rw-r--r--src/test/regress/expected/plpgsql.out2
-rw-r--r--src/test/regress/sql/plpgsql.sql2
4 files changed, 12 insertions, 8 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index edf18fd0f20..60f3c7c63d0 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -19,10 +19,11 @@
#include "postgres.h"
+#include <fcntl.h>
+#include <limits.h>
+#include <signal.h>
#include <time.h>
#include <unistd.h>
-#include <signal.h>
-#include <fcntl.h>
#include <sys/socket.h>
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
@@ -4107,7 +4108,7 @@ PostgresMain(int argc, char *argv[], const char *username)
/*
* Obtain platform stack depth limit (in bytes)
*
- * Return -1 if unlimited or not known
+ * Return -1 if unknown
*/
long
get_stack_depth_rlimit(void)
@@ -4123,7 +4124,10 @@ get_stack_depth_rlimit(void)
if (getrlimit(RLIMIT_STACK, &rlim) < 0)
val = -1;
else if (rlim.rlim_cur == RLIM_INFINITY)
- val = -1;
+ val = LONG_MAX;
+ /* rlim_cur is probably of an unsigned type, so check for overflow */
+ else if (rlim.rlim_cur >= LONG_MAX)
+ val = LONG_MAX;
else
val = rlim.rlim_cur;
}
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index b5dfa2287bb..09beb5f3985 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -3485,14 +3485,14 @@ InitializeGUCOptions(void)
stack_rlimit = get_stack_depth_rlimit();
if (stack_rlimit > 0)
{
- int new_limit = (stack_rlimit - STACK_DEPTH_SLOP) / 1024L;
+ long new_limit = (stack_rlimit - STACK_DEPTH_SLOP) / 1024L;
if (new_limit > 100)
{
char limbuf[16];
new_limit = Min(new_limit, 2048);
- sprintf(limbuf, "%d", new_limit);
+ sprintf(limbuf, "%ld", new_limit);
SetConfigOption("max_stack_depth", limbuf,
PGC_POSTMASTER, PGC_S_ENV_VAR);
}
diff --git a/src/test/regress/expected/plpgsql.out b/src/test/regress/expected/plpgsql.out
index cd503c0ec2d..a02da980116 100644
--- a/src/test/regress/expected/plpgsql.out
+++ b/src/test/regress/expected/plpgsql.out
@@ -4006,7 +4006,7 @@ $$ language plpgsql;
-- "limit" is to prevent this from being inlined
create function sql_recurse(float8) returns float8 as
$$ select recurse($1) limit 1; $$ language sql;
-select recurse(5);
+select recurse(10);
recurse
---------
0
diff --git a/src/test/regress/sql/plpgsql.sql b/src/test/regress/sql/plpgsql.sql
index 14294b6dc49..015fbd6317e 100644
--- a/src/test/regress/sql/plpgsql.sql
+++ b/src/test/regress/sql/plpgsql.sql
@@ -3211,7 +3211,7 @@ $$ language plpgsql;
create function sql_recurse(float8) returns float8 as
$$ select recurse($1) limit 1; $$ language sql;
-select recurse(5);
+select recurse(10);
create function error1(text) returns text language sql as
$$ SELECT relname::text FROM pg_class c WHERE c.oid = $1::regclass $$;