Changeset: 69cfe8a9891c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=69cfe8a9891c Modified Files: sql/server/rel_select.c sql/server/rel_updates.c tools/merovingian/client/monetdb.c tools/merovingian/daemon/merovingian.c tools/merovingian/utils/control.c tools/merovingian/utils/control.h tools/merovingian/utils/properties.c tools/merovingian/utils/utils.c tools/merovingian/utils/utils.h Branch: default Log Message:
Merge with Jun2020 branch. diffs (truncated from 566 to 300 lines): diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -1714,7 +1714,8 @@ rel_compare_exp_(sql_query *query, sql_r return NULL; e = exp_compare_func(sql, ls, rs, rs2, compare_func((comp_type)type, quantifier?0:anti), quantifier); if (anti && quantifier) - e = rel_unop_(sql, NULL, e, NULL, "not", card_value); + if (!(e = rel_unop_(sql, NULL, e, NULL, "not", card_value))) + return NULL; } return rel_select(sql->sa, rel, e); } else if (!rs2) { @@ -2178,11 +2179,11 @@ rel_logical_value_exp(sql_query *query, { symbol *lo = sc->data.lval->h->data.sym; symbol *ro = sc->data.lval->h->next->data.sym; - - sql_exp *ls = rel_logical_value_exp(query, rel, lo, f, ek); - sql_exp *rs = rel_logical_value_exp(query, rel, ro, f, ek); - - if (!ls || !rs) + sql_exp *ls, *rs; + + if (!(ls = rel_logical_value_exp(query, rel, lo, f, ek))) + return NULL; + if (!(rs = rel_logical_value_exp(query, rel, ro, f, ek))) return NULL; if (sc->token == SQL_OR) return rel_binop_(sql, rel ? *rel : NULL, ls, rs, NULL, "or", card_value); @@ -2303,8 +2304,7 @@ rel_logical_value_exp(sql_query *query, int insensitive = sc->data.lval->h->next->next->data.i_val; int anti = (sc->token == SQL_NOT_LIKE) != (sc->data.lval->h->next->next->next->data.i_val != 0); sql_subtype *st = sql_bind_localtype("str"); - sql_exp *le = rel_value_exp(query, rel, lo, f, ek); - sql_exp *re, *ee = NULL; + sql_exp *le = rel_value_exp(query, rel, lo, f, ek), *re, *ee = NULL; char *like = insensitive ? (anti ? "not_ilike" : "ilike") : (anti ? "not_like" : "like"); sql_schema *sys = mvc_bind_schema(sql, "sys"); @@ -2339,14 +2339,15 @@ rel_logical_value_exp(sql_query *query, int symmetric = sc->data.lval->h->next->data.i_val; symbol *ro1 = sc->data.lval->h->next->next->data.sym; symbol *ro2 = sc->data.lval->h->next->next->next->data.sym; - sql_exp *le = rel_value_exp(query, rel, lo, f, ek); - sql_exp *re1 = rel_value_exp(query, rel, ro1, f, ek); - sql_exp *re2 = rel_value_exp(query, rel, ro2, f, ek); sql_subtype *t1, *t2, *t3; - sql_exp *e1 = NULL, *e2 = NULL; - + sql_exp *le, *re1, *re2, *e1 = NULL, *e2 = NULL; assert(sc->data.lval->h->next->type == type_int); - if (!le || !re1 || !re2) + + if (!(le = rel_value_exp(query, rel, lo, f, ek))) + return NULL; + if (!(re1 = rel_value_exp(query, rel, ro1, f, ek))) + return NULL; + if (!(re2 = rel_value_exp(query, rel, ro2, f, ek))) return NULL; t1 = exp_subtype(le); @@ -2380,14 +2381,17 @@ rel_logical_value_exp(sql_query *query, } if (sc->token == SQL_NOT_BETWEEN) { - e1 = rel_binop_(sql, rel ? *rel : NULL, le, re1, NULL, "<", card_value); - e2 = rel_binop_(sql, rel ? *rel : NULL, le, re2, NULL, ">", card_value); + if (!(e1 = rel_binop_(sql, rel ? *rel : NULL, le, re1, NULL, "<", card_value))) + return NULL; + if (!(e2 = rel_binop_(sql, rel ? *rel : NULL, le, re2, NULL, ">", card_value))) + return NULL; } else { - e1 = rel_binop_(sql, rel ? *rel : NULL, le, re1, NULL, ">=", card_value); - e2 = rel_binop_(sql, rel ? *rel : NULL, le, re2, NULL, "<=", card_value); + if (!(e1 = rel_binop_(sql, rel ? *rel : NULL, le, re1, NULL, ">=", card_value))) + return NULL; + if (!(e2 = rel_binop_(sql, rel ? *rel : NULL, le, re2, NULL, "<=", card_value))) + return NULL; } - if (!e1 || !e2) - return NULL; + assert(e1 && e2); if (sc->token == SQL_NOT_BETWEEN) { return rel_binop_(sql, rel ? *rel : NULL, e1, e2, NULL, "or", card_value); } else { @@ -2403,9 +2407,13 @@ rel_logical_value_exp(sql_query *query, if (!le) return NULL; le = rel_unop_(sql, rel ? *rel : NULL, le, NULL, "isnull", card_value); + if (!le) + return NULL; set_has_no_nil(le); if (sc->token != SQL_IS_NULL) le = rel_unop_(sql, rel ? *rel : NULL, le, NULL, "not", card_value); + if (!le) + return NULL; set_has_no_nil(le); return le; } @@ -2413,7 +2421,7 @@ rel_logical_value_exp(sql_query *query, sql_exp *le = rel_logical_value_exp(query, rel, sc->data.sym, f, ek); if (!le) - return le; + return NULL; return rel_unop_(sql, rel ? *rel : NULL, le, NULL, "not", card_value); } case SQL_ATOM: { @@ -2589,8 +2597,7 @@ rel_logical_exp(sql_query *query, sql_re int insensitive = sc->data.lval->h->next->next->data.i_val; int anti = (sc->token == SQL_NOT_LIKE) != (sc->data.lval->h->next->next->next->data.i_val != 0); sql_subtype *st = sql_bind_localtype("str"); - sql_exp *le = rel_value_exp(query, &rel, lo, f, ek); - sql_exp *re, *ee = NULL; + sql_exp *le = rel_value_exp(query, &rel, lo, f, ek), *re, *ee = NULL; if (!le) return NULL; @@ -2623,14 +2630,17 @@ rel_logical_exp(sql_query *query, sql_re int symmetric = sc->data.lval->h->next->data.i_val; symbol *ro1 = sc->data.lval->h->next->next->data.sym; symbol *ro2 = sc->data.lval->h->next->next->next->data.sym; - sql_exp *le = rel_value_exp(query, &rel, lo, f, ek); - sql_exp *re1 = rel_value_exp(query, &rel, ro1, f, ek); - sql_exp *re2 = rel_value_exp(query, &rel, ro2, f, ek); + sql_exp *le, *re1, *re2; sql_subtype *t1, *t2, *t3; int flag = 0; assert(sc->data.lval->h->next->type == type_int); - if (!le || !re1 || !re2) + + if (!(le = rel_value_exp(query, &rel, lo, f, ek))) + return NULL; + if (!(re1 = rel_value_exp(query, &rel, ro1, f, ek))) + return NULL; + if (!(re2 = rel_value_exp(query, &rel, ro2, f, ek))) return NULL; t1 = exp_subtype(le); @@ -2672,19 +2682,24 @@ rel_logical_exp(sql_query *query, sql_re if (le->card == CARD_ATOM) { sql_exp *e1, *e2; if (sc->token == SQL_NOT_BETWEEN) { - e1 = rel_binop_(sql, rel, le, re1, NULL, "<", card_value); - e2 = rel_binop_(sql, rel, le, re2, NULL, ">", card_value); + if (!(e1 = rel_binop_(sql, rel, le, re1, NULL, "<", card_value))) + return NULL; + if (!(e2 = rel_binop_(sql, rel, le, re2, NULL, ">", card_value))) + return NULL; } else { - e1 = rel_binop_(sql, rel, le, re1, NULL, ">=", card_value); - e2 = rel_binop_(sql, rel, le, re2, NULL, "<=", card_value); + if (!(e1 = rel_binop_(sql, rel, le, re1, NULL, ">=", card_value))) + return NULL; + if (!(e2 = rel_binop_(sql, rel, le, re2, NULL, "<=", card_value))) + return NULL; } - if (!e1 || !e2) - return NULL; + assert(e1 && e2); if (sc->token == SQL_NOT_BETWEEN) { e1 = rel_binop_(sql, rel, e1, e2, NULL, "or", card_value); } else { e1 = rel_binop_(sql, rel, e1, e2, NULL, "and", card_value); } + if (!e1) + return NULL; e2 = exp_atom_bool(sql->sa, 1); rel = rel_select(sql->sa, rel, exp_compare(sql->sa, e1, e2, cmp_equal)); } else if (sc->token == SQL_NOT_BETWEEN) { @@ -2702,7 +2717,8 @@ rel_logical_exp(sql_query *query, sql_re if (!le) return NULL; - le = rel_unop_(sql, rel, le, NULL, "isnull", card_value); + if (!(le = rel_unop_(sql, rel, le, NULL, "isnull", card_value))) + return NULL; set_has_no_nil(le); if (sc->token == SQL_IS_NULL) re = exp_atom_bool(sql->sa, 1); @@ -2727,8 +2743,7 @@ rel_logical_exp(sql_query *query, sql_re if (!le) return NULL; - le = rel_unop_(sql, rel, le, NULL, "not", card_value); - if (le == NULL) + if (!(le = rel_unop_(sql, rel, le, NULL, "not", card_value))) return NULL; le = exp_compare(sql->sa, le, exp_atom_bool(sql->sa, 1), cmp_equal); return rel_select(sql->sa, rel, le); @@ -3195,9 +3210,9 @@ rel_binop(sql_query *query, sql_rel **re if (sf) return rel_aggr(query, rel, se, f); - l = rel_value_exp(query, rel, dl->next->next->data.sym, f|sql_farg, iek); - r = rel_value_exp(query, rel, dl->next->next->next->data.sym, f|sql_farg, iek); - if (!l || !r) + if (!(l = rel_value_exp(query, rel, dl->next->next->data.sym, f|sql_farg, iek))) + return NULL; + if (!(r = rel_value_exp(query, rel, dl->next->next->next->data.sym, f|sql_farg, iek))) return NULL; return rel_binop_(sql, rel ? *rel : NULL, l, r, s, fname, ek.card); } @@ -3242,7 +3257,6 @@ rel_nop(sql_query *query, sql_rel **rel, char *sname = qname_schema(l->data.lval); sql_schema *s = cur_schema(sql); exp_kind iek = {type_value, card_column, FALSE}; - int err = 0; if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, SQLSTATE(3F000) "SELECT: no such schema '%s'", sname); @@ -3256,7 +3270,7 @@ rel_nop(sql_query *query, sql_rel **rel, sql_subtype *tpe; if (!e) - err = 1; + return NULL; append(exps, e); if (e) { tpe = exp_subtype(e); @@ -3265,8 +3279,6 @@ rel_nop(sql_query *query, sql_rel **rel, append(tl, tpe); } } - if (err) - return NULL; return _rel_nop(sql, s, fname, tl, rel ? *rel : NULL, exps, obj_type, nr_args, ek); } @@ -3363,6 +3375,8 @@ static sql_exp * sql_exp *e = rel_value_exp(query, &gl, args->data.sym, (f | sql_aggr)& ~sql_farg, ek); bool found_one_freevar = false; + if (!e) + return NULL; has_args = true; if (gl && gl != ogl) { if (gl->grouped) { @@ -3378,8 +3392,6 @@ static sql_exp * else groupby = subquery = gl; } - if (!e) - return NULL; if (!exp_subtype(e)) { /* we also do not expect parameters here */ char *uaname = GDKmalloc(strlen(aname) + 1); sql_exp *e = sql_error(sql, 02, SQLSTATE(42000) "%s: parameters not allowed as arguments to aggregate functions", @@ -3805,13 +3817,14 @@ rel_case(sql_query *query, sql_rel **rel if (token == SQL_NULLIF) { sql_exp *e1, *e2; - e1 = rel_value_exp(query, rel, dn->data.sym, f, ek); - e2 = rel_value_exp(query, rel, dn->next->data.sym, f, ek); - if (e1 && e2) { - cond = rel_binop_(sql, rel ? *rel : NULL, e1, e2, NULL, "=", card_value); - result = exp_null(sql->sa, exp_subtype(e1)); - else_exp = exp_ref_save(sql, e1); /* ELSE case */ - } + if (!(e1 = rel_value_exp(query, rel, dn->data.sym, f, ek))) + return NULL; + if (!(e2 = rel_value_exp(query, rel, dn->next->data.sym, f, ek))) + return NULL; + + cond = rel_binop_(sql, rel ? *rel : NULL, e1, e2, NULL, "=", card_value); + result = exp_null(sql->sa, exp_subtype(e1)); + else_exp = exp_ref_save(sql, e1); /* ELSE case */ /* COALESCE(e1,e2) == CASE WHEN e1 IS NOT NULL THEN e1 ELSE e2 END */ } else if (token == SQL_COALESCE) { @@ -3821,23 +3834,31 @@ rel_case(sql_query *query, sql_rel **rel sql_exp *le; result = exp_ref_save(sql, cond); - le = rel_unop_(sql, rel ? *rel : NULL, cond, NULL, "isnull", card_value); + if (!(le = rel_unop_(sql, rel ? *rel : NULL, cond, NULL, "isnull", card_value))) + return NULL; set_has_no_nil(le); - cond = rel_unop_(sql, rel ? *rel : NULL, le, NULL, "not", card_value); + if (!(cond = rel_unop_(sql, rel ? *rel : NULL, le, NULL, "not", card_value))) + return NULL; set_has_no_nil(cond); } } else { dlist *when = dn->data.sym->data.lval; if (opt_cond) { - sql_exp *l = rel_value_exp(query, rel, opt_cond, f, ek); - sql_exp *r = rel_value_exp(query, rel, when->h->data.sym, f, ek); - if (!l || !r || rel_convert_types(sql, rel ? *rel : NULL, rel ? *rel : NULL, &l, &r, 1, type_equal) < 0) + sql_exp *l, *r; + + if (!(l = rel_value_exp(query, rel, opt_cond, f, ek))) + return NULL; + if (!(r = rel_value_exp(query, rel, when->h->data.sym, f, ek))) + return NULL; + if (rel_convert_types(sql, rel ? *rel : NULL, rel ? *rel : NULL, &l, &r, 1, type_equal) < 0) return NULL; cond = rel_binop_(sql, rel ? *rel : NULL, l, r, NULL, "=", card_value); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list