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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list