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

Reply via email to