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