Changeset: 715099156ee6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=715099156ee6
Modified Files:
sql/server/rel_rel.c
sql/server/sql_mvc.c
sql/server/sql_mvc.h
Branch: default
Log Message:
added small less heavy highwater check.
diffs (138 lines):
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -137,7 +137,7 @@ rel_copy(mvc *sql, sql_rel *i, int deep)
{
sql_rel *rel;
- if (THRhighwater())
+ if (mvc_highwater(sql))
return sql_error(sql, 10, SQLSTATE(42000) "Query too complex:
running out of stack space");
rel = rel_create(sql->sa);
@@ -237,7 +237,7 @@ rel_bind_column_(mvc *sql, int *exp_has_
int ambiguous = 0, multi = 0;
sql_rel *l = NULL, *r = NULL;
- if (THRhighwater())
+ if (mvc_highwater(sql))
return sql_error(sql, 10, SQLSTATE(42000) "Query too complex:
running out of stack space");
switch(rel->op) {
@@ -1002,7 +1002,7 @@ list *
{
list *lexps, *rexps, *exps;
- if (THRhighwater())
+ if (mvc_highwater(sql))
return sql_error(sql, 10, SQLSTATE(42000) "Query too complex:
running out of stack space");
if (!rel)
@@ -1137,7 +1137,7 @@ rel_bind_path_(mvc *sql, sql_rel *rel, s
{
int found = 0;
- if (THRhighwater()) {
+ if (mvc_highwater(sql)) {
sql_error(sql, 10, SQLSTATE(42000) "Query too complex: running
out of stack space");
return 0;
}
@@ -1720,7 +1720,7 @@ static int rel_deps(mvc *sql, sql_rel *r
static int
exp_deps(mvc *sql, sql_exp *e, list *refs, list *l)
{
- if (THRhighwater()) {
+ if (mvc_highwater(sql)) {
(void) sql_error(sql, 10, SQLSTATE(42000) "Query too complex:
running out of stack space");
return -1;
}
@@ -1803,7 +1803,7 @@ exp_deps(mvc *sql, sql_exp *e, list *ref
static int
rel_deps(mvc *sql, sql_rel *r, list *refs, list *l)
{
- if (THRhighwater()) {
+ if (mvc_highwater(sql)) {
(void) sql_error(sql, 10, SQLSTATE(42000) "Query too complex:
running out of stack space");
return -1;
}
@@ -1930,7 +1930,7 @@ static sql_rel *rel_exp_visitor(visitor
static sql_exp *
exp_visitor(visitor *v, sql_rel *rel, sql_exp *e, int depth, exp_rewrite_fptr
exp_rewriter, bool topdown, bool relations_topdown)
{
- if (THRhighwater())
+ if (mvc_highwater(v->sql))
return sql_error(v->sql, 10, SQLSTATE(42000) "Query too
complex: running out of stack space");
assert(e);
@@ -2018,7 +2018,7 @@ exps_exp_visitor(visitor *v, sql_rel *re
static inline sql_rel *
rel_exp_visitor(visitor *v, sql_rel *rel, exp_rewrite_fptr exp_rewriter, bool
topdown, bool relations_topdown)
{
- if (THRhighwater())
+ if (mvc_highwater(v->sql))
return sql_error(v->sql, 10, SQLSTATE(42000) "Query too
complex: running out of stack space");
if (!rel)
@@ -2115,7 +2115,7 @@ static list *exps_rel_visitor(visitor *v
static sql_exp *
exp_rel_visitor(visitor *v, sql_exp *e, rel_rewrite_fptr rel_rewriter, bool
topdown)
{
- if (THRhighwater())
+ if (mvc_highwater(v->sql))
return sql_error(v->sql, 10, SQLSTATE(42000) "Query too
complex: running out of stack space");
assert(e);
@@ -2215,7 +2215,7 @@ rel_visitor(visitor *v, sql_rel *rel, re
{
sql_rel *parent = v->parent;
- if (THRhighwater())
+ if (mvc_highwater(v->sql))
return sql_error(v->sql, 10, SQLSTATE(42000) "Query too
complex: running out of stack space");
if (!rel)
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -728,6 +728,7 @@ mvc_create(sql_store *store, sql_allocat
m->pa = pa;
m->sa = NULL;
m->ta = sa_create(m->pa);
+ m->sp = (uintptr_t)(&m);
m->params = NULL;
m->sizeframes = MAXPARAMS;
@@ -1663,3 +1664,15 @@ symbol_cmp(mvc *sql, symbol *s1, symbol
{
return _symbol_cmp(sql, s1, s2);
}
+
+int
+mvc_highwater(mvc *sql)
+{
+ int l = 0, rc = 0;
+ uintptr_t c = (uintptr_t) (&l);
+
+ size_t diff = c < sql->sp ? sql->sp - c : c - sql->sp;
+ if (diff > THREAD_STACK_SIZE - 280 * 1024)
+ rc = 1;
+ return rc;
+}
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -150,6 +150,7 @@ typedef struct mvc {
unsigned int label; /* numbers for relational projection labels */
list *cascade_action; /* protection against recursive cascade actions
*/
list *schema_path; /* schema search path for object lookup */
+ uintptr_t sp;
} mvc;
extern sql_table *mvc_init_create_view(mvc *sql, sql_schema *s, const char
*name, const char *query);
@@ -303,5 +304,6 @@ extern void *sql_error(mvc *sql, int err
__attribute__((__format__(__printf__, 3, 4)));
extern int symbol_cmp(mvc* sql, symbol *s1, symbol *s2);
+extern int mvc_highwater(mvc *sql);
#endif /*_SQL_MVC_H*/
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list