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

Reply via email to