Changeset: e21d77fffbd4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e21d77fffbd4
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_rel.c
        sql/server/rel_select.c
Branch: merge-statements
Log Message:

Merge with default branch.


diffs (truncated from 557 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -262,6 +262,9 @@ handle_in_exps(backend *be, sql_exp *ce,
        node *n;
        stmt *s = NULL, *c = exp_bin(be, ce, left, right, grp, ext, cnt, NULL);
 
+       if(!c)
+               return NULL;
+
        if (c->nrcols == 0) {
                sql_subtype *bt = sql_bind_localtype("bit");
                sql_subfunc *cmp = (in)
@@ -273,7 +276,9 @@ handle_in_exps(backend *be, sql_exp *ce,
                for( n = nl->h; n; n = n->next) {
                        sql_exp *e = n->data;
                        stmt *i = exp_bin(be, use_r?e->r:e, left, right, grp, 
ext, cnt, NULL);
-                       
+                       if(!i)
+                               return NULL;
+
                        i = stmt_binop(be, c, i, cmp); 
                        if (s)
                                s = stmt_binop(be, s, i, a);
@@ -293,7 +298,9 @@ handle_in_exps(backend *be, sql_exp *ce,
                for( n = nl->h; n; n = n->next) {
                        sql_exp *e = n->data;
                        stmt *i = exp_bin(be, use_r?e->r:e, left, right, grp, 
ext, cnt, NULL);
-                       
+                       if(!i)
+                               return NULL;
+
                        if (in) { 
                                i = stmt_uselect(be, c, i, cmp, sel, 0); 
                                if (s)
@@ -341,8 +348,10 @@ exp_list(backend *be, list *exps, stmt *
        for( n = exps->h; n; n = n->next) {
                sql_exp *e = n->data;
                stmt *i = exp_bin(be, e, l, r, grp, ext, cnt, sel);
-               
-               if (n->next && i && i->type == st_table) /* relational 
statement */
+               if(!i)
+                       return NULL;
+
+               if (n->next && i->type == st_table) /* relational statement */
                        l = i->op1;
                else
                        append(nl, i);
@@ -356,6 +365,9 @@ exp_bin(backend *be, sql_exp *e, stmt *l
        mvc *sql = be->mvc;
        stmt *s = NULL;
 
+       if (THRhighwater())
+               return sql_error(be->mvc, 10, SQLSTATE(42000) "query too 
complex: running out of stack space");
+
        if (!e) {
                assert(0);
                return NULL;
@@ -365,6 +377,8 @@ exp_bin(backend *be, sql_exp *e, stmt *l
        case e_psm:
                if (e->flag & PSM_SET) {
                        stmt *r = exp_bin(be, e->l, left, right, grp, ext, cnt, 
sel);
+                       if(!r)
+                               return NULL;
                        return stmt_assign(be, e->name, r, 
GET_PSM_LEVEL(e->flag));
                } else if (e->flag & PSM_VAR) {
                        if (e->f)
@@ -397,26 +411,39 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                         * needed because the condition needs to be inside this 
outer block */
                        stmt *ifstmt = stmt_cond(be, stmt_bool(be, 1), NULL, 0, 
0);
                        stmt *cond = exp_bin(be, e->l, left, right, grp, ext, 
cnt, sel);
-                       stmt *wstmt = stmt_cond(be, cond, ifstmt, 1, 0);
-
-                       (void)exp_list(be, e->r, left, right, grp, ext, cnt, 
sel);
+                       stmt *wstmt;
+
+                       if(!cond)
+                               return NULL;
+                       wstmt = stmt_cond(be, cond, ifstmt, 1, 0);
+
+                       if (!exp_list(be, e->r, left, right, grp, ext, cnt, 
sel))
+                               return NULL;
                        (void)stmt_control_end(be, wstmt);
                        return stmt_control_end(be, ifstmt);
                } else if (e->flag & PSM_IF) {
                        stmt *cond = exp_bin(be, e->l, left, right, grp, ext, 
cnt, sel);
-                       stmt *ifstmt = stmt_cond(be, cond, NULL, 0, 0), *res;
-                       (void)exp_list(be, e->r, left, right, grp, ext, cnt, 
sel);
+                       stmt *ifstmt, *res;
+
+                       if(!cond)
+                               return NULL;
+                       ifstmt = stmt_cond(be, cond, NULL, 0, 0);
+                       if (!exp_list(be, e->r, left, right, grp, ext, cnt, 
sel))
+                               return NULL;
                        res = stmt_control_end(be, ifstmt);
                        if (e->f) {
                                stmt *elsestmt = stmt_cond(be, cond, NULL, 0, 
1);
 
-                               (void) exp_list(be, e->f, left, right, grp, 
ext, cnt, sel);
+                               if (!exp_list(be, e->f, left, right, grp, ext, 
cnt, sel))
+                                       return NULL;
                                res = stmt_control_end(be, elsestmt);
                        }
                        return res;
                } else if (e->flag & PSM_REL) {
                        sql_rel *rel = e->l;
                        stmt *r = rel_bin(be, rel);
+                       if(!r)
+                               return NULL;
 
 #if 0
                        if (r->type == st_list && r->nrcols == 0 && r->key) {
@@ -1285,6 +1312,8 @@ rel2bin_basetable(backend *be, sql_rel *
                        if (exps->h->next) {
                                sql_exp *at = exps->h->next->data;
                                stmt *u = exp_bin(be, at, NULL, NULL, NULL, 
NULL, NULL, NULL);
+                               if(!u)
+                                       return NULL;
 
                                append(l, u);
                        }
@@ -1326,6 +1355,10 @@ static list *
 exp2bin_args(backend *be, sql_exp *e, list *args)
 {
        mvc *sql = be->mvc;
+
+       if (THRhighwater())
+               return sql_error(sql, 10, SQLSTATE(42000) "query too complex: 
running out of stack space");
+
        if (!e)
                return args;
        switch(e->type){
@@ -1401,6 +1434,9 @@ exps2bin_args(backend *be, list *exps, l
 static list *
 rel2bin_args(backend *be, sql_rel *rel, list *args)
 {
+       if (THRhighwater())
+               return sql_error(be->mvc, 10, SQLSTATE(42000) "query too 
complex: running out of stack space");
+
        if (!rel)
                return args;
        switch(rel->op) {
@@ -1557,6 +1593,8 @@ rel2bin_table(backend *be, sql_rel *rel,
                nme = number2name(name, 16, ++sql->remote);
 
                l = rel2bin_args(be, rel->l, sa_list(sql->sa));
+               if(!l)
+                       return NULL;
                sub = stmt_list(be, l);
                sub = stmt_func(be, sub, sa_strdup(sql->sa, nme), rel->l, 0);
                l = sa_list(sql->sa);
@@ -2011,8 +2049,11 @@ rel2bin_semijoin(backend *be, sql_rel *r
 
                        /* for each equality join add a rel_select(r is NULL) */
                        s = exp_bin(be, r, right, NULL, NULL, NULL, NULL, NULL);
-                       if (!s)
-                               s = exp_bin(be, l, right, NULL, NULL, NULL, 
NULL, NULL);
+                       if (!s) {
+                               s = exp_bin(be, l, right, NULL, NULL, NULL, 
NULL, NULL);
+                               if(!s)
+                                       return NULL;
+                       }
                        if (s && !exp_is_atom(r)) {
                                sql_subaggr *cnt = sql_bind_aggr(sql->sa, 
sql->session->schema, "count", NULL);
                                sql_subfunc *add = 
sql_bind_func_result(sql->sa, sql->session->schema, "sql_add", lng, lng, lng);
@@ -2549,10 +2590,14 @@ rel2bin_project(backend *be, sql_rel *re
                        topn = NULL;
                } else {
                        l = exp_bin(be, le, NULL, NULL, NULL, NULL, NULL, NULL);
+                       if(!l)
+                               return NULL;
                        if (oe) {
                                sql_subtype *lng = sql_bind_localtype("lng");
                                sql_subfunc *add = 
sql_bind_func_result(sql->sa, sql->session->schema, "sql_add", lng, lng, lng);
                                stmt *o = exp_bin(be, oe, NULL, NULL, NULL, 
NULL, NULL, NULL);
+                               if(!o)
+                                       return NULL;
                                l = stmt_binop(be, l, o, add);
                        }
                }
@@ -2909,6 +2954,8 @@ rel2bin_topn(backend *be, sql_rel *rel, 
                        l = stmt_atom_lng_nil(be);
                if (!o)
                        o = stmt_atom_lng(be, 0);
+               if (!l || !o)
+                       return NULL;
 
                sc = column(be, sc);
                limit = stmt_limit(be, stmt_alias(be, sc, tname, cname), NULL, 
NULL, o, l, 0,0,0,0,0);
@@ -2949,12 +2996,13 @@ rel2bin_sample(backend *be, sql_rel *rel
                const char *tname = table_name(sql->sa, sc);
 
                sample_size = exp_bin(be, rel->exps->h->data, NULL, NULL, NULL, 
NULL, NULL, NULL);
-
                if (!sample_size)
                        sample_size = stmt_atom_lng_nil(be);
-               
+
                if (rel->exps->cnt == 2) {
                        seed = exp_bin(be, rel->exps->h->next->data, NULL, 
NULL, NULL, NULL, NULL, NULL);
+                       if(!seed)
+                               return NULL;
                }
 
                sc = column(be, sc);
@@ -3051,7 +3099,11 @@ sql_parse(backend *be, sql_allocator *sa
 
                if (r) {
                        r = rel_optimizer(m, r, 1);
+                       if(!r)
+                               return NULL;
                        sq = rel_bin(be, r);
+                       if(!sq)
+                               return NULL;
                }
        }
 
@@ -5041,6 +5093,8 @@ rel2bin_psm(backend *be, sql_rel *rel)
        for(n = rel->exps->h; n; n = n->next) {
                sql_exp *e = n->data;
                stmt *s = exp_bin(be, e, sub, NULL, NULL, NULL, NULL, NULL);
+               if(!s)
+                       return NULL;
 
                if (s && s->type == st_table) /* relational statement */
                        sub = s->op1;
@@ -5111,13 +5165,18 @@ rel2bin_seq(backend *be, sql_rel *rel, l
        stmt *restart, *sname, *seq, *seqname, *sl = NULL;
        list *l = sa_list(sql->sa);
 
-       if (rel->l)  /* first construct the sub relation */
+       if (rel->l) { /* first construct the sub relation */
                sl = subrel_bin(be, rel->l, refs);
+               if(!sl)
+                       return NULL;
+       }
 
        restart = exp_bin(be, en->data, sl, NULL, NULL, NULL, NULL, NULL);
        sname = exp_bin(be, en->next->data, sl, NULL, NULL, NULL, NULL, NULL);
        seqname = exp_bin(be, en->next->next->data, sl, NULL, NULL, NULL, NULL, 
NULL);
        seq = exp_bin(be, en->next->next->next->data, sl, NULL, NULL, NULL, 
NULL, NULL);
+       if (!restart || !sname || !seqname || !seq)
+               return NULL;
 
        (void)refs;
        append(l, sname);
@@ -5134,9 +5193,15 @@ rel2bin_trans(backend *be, sql_rel *rel,
        stmt *chain = exp_bin(be, en->data, NULL, NULL, NULL, NULL, NULL, NULL);
        stmt *name = NULL;
 
+       if (!chain)
+               return NULL;
+
        (void)refs;
-       if (en->next)
+       if (en->next) {
                name = exp_bin(be, en->next->data, NULL, NULL, NULL, NULL, 
NULL, NULL);
+               if (!name)
+                       return NULL;
+       }
        return stmt_trans(be, rel->flag, chain, name);
 }
 
@@ -5149,16 +5214,25 @@ rel2bin_catalog(backend *be, sql_rel *re
        stmt *sname = NULL, *name = NULL, *ifexists = NULL;
        list *l = sa_list(sql->sa);
 
+       if (!action)
+               return NULL;
+
        (void)refs;
        en = en->next;
        sname = exp_bin(be, en->data, NULL, NULL, NULL, NULL, NULL, NULL);
+       if (!sname)
+               return NULL;
        if (en->next) {
                name = exp_bin(be, en->next->data, NULL, NULL, NULL, NULL, 
NULL, NULL);
+               if (!name)
+                       return NULL;
        } else {
                name = stmt_atom_string_nil(be);
        }
        if (en->next && en->next->next) {
                ifexists = exp_bin(be, en->next->next->data, NULL, NULL, NULL, 
NULL, NULL, NULL);
+               if (!ifexists)
+                       return NULL;
        } else {
                ifexists = stmt_atom_int(be, 0);
        }
@@ -5178,12 +5252,19 @@ rel2bin_catalog_table(backend *be, sql_r
        stmt *table = NULL, *sname, *tname = NULL, *ifexists = NULL;
        list *l = sa_list(sql->sa);
 
+       if (!action)
+               return NULL;
+
        (void)refs;
        en = en->next;
        sname = exp_bin(be, en->data, NULL, NULL, NULL, NULL, NULL, NULL);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to