Changeset: fd082437384b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fd082437384b Modified Files: sql/server/rel_select.c sql/server/rel_updates.c Branch: Jun2020 Log Message:
Defensive lines. When one of the symbol handling recursive functions return an error, return immediately, because there are locations where errors are reset, thus leaving to the 'subquery result missing' error message later diffs (truncated from 407 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