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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list