Changeset: 2c12bf737807 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2c12bf737807
Removed Files:
        sql/test/BugTracker-2019/Tests/msqldump-mapi-cache.Bug-6777.timeout
Modified Files:
        sql/backends/monet5/sql_execute.c
        sql/server/rel_dump.c
        sql/test/BugTracker-2019/Tests/msqldump-mapi-cache.Bug-6777.py
        sql/test/BugTracker-2019/Tests/msqldump-mapi-cache.Bug-6777.stable.out
        
sql/test/BugTracker-2019/Tests/remote-table-non-existent-column.Bug-6750.py
Branch: linear-hashing
Log Message:

Merged with Nov2019


diffs (truncated from 2692 to 300 lines):

diff --git a/sql/backends/monet5/sql_execute.c 
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -955,9 +955,13 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
        rel = rel_read(m, *expr, &pos, refs);
        stack_pop_frame(m);
        if (rel)
-               rel = sql_processrelation(m, rel, 0);
-       if (!rel || monet5_create_relational_function(m, *mod, *nme, rel, NULL, 
ops, 0) < 0)
-               throw(SQL, "sql.register", SQLSTATE(42000) "Cannot register %s: 
%s", buf, m->errstr);
+               rel = sql_processrelation(m, rel, 1);
+       if (!rel || monet5_create_relational_function(m, *mod, *nme, rel, NULL, 
ops, 0) < 0) {
+               if (strlen(m->errstr) > 6 && m->errstr[5] == '!')
+                       msg = createException(SQL, "RAstatement2", "%s", 
m->errstr);
+               else
+                       msg = createException(SQL, "RAstatement2", 
SQLSTATE(42000) "%s", m->errstr);
+       }
        rel_destroy(rel);
        sqlcleanup(m, 0);
        return msg;
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -762,6 +762,8 @@ read_prop( mvc *sql, sql_exp *exp, char 
                r[*pos] = 0;
 
                s = mvc_bind_schema(sql, sname);
+               if (sname && !s)
+                       return sql_error(sql, -1, SQLSTATE(42000) "Schema %s 
missing\n", sname);
                if (!find_prop(exp->p, PROP_JOINIDX)) {
                        p = exp->p = prop_create(sql->sa, PROP_JOINIDX, exp->p);
                        p->value = mvc_bind_idx(sql, s, iname);
@@ -769,7 +771,7 @@ read_prop( mvc *sql, sql_exp *exp, char 
                r[*pos] = old;
                skipWS(r,pos);
        }
-       return exp->p;
+       return exp;
 }
 
 static list*
@@ -789,12 +791,13 @@ read_exps(mvc *sql, sql_rel *lrel, sql_r
                        return sql_error(sql, -1, SQLSTATE(42000) "Missing 
closing %c\n", ebracket);
                } else if (!e) {
                        (*pos)++;
-                       skipWS( r, pos);
-                       return exps;
+                       skipWS(r, pos);
+                       return sql->errstr[0] ? NULL : exps; /* A function call 
might not have any input expressions, so return empty exps on that case */
                }
                append(exps, e);
                skipWS( r, pos);
-               read_prop( sql, e, r, pos);
+               if (!read_prop(sql, e, r, pos))
+                       return NULL;
                while (r[*pos] == ',') {
                        int op = 0;
 
@@ -810,7 +813,8 @@ read_exps(mvc *sql, sql_rel *lrel, sql_r
                                return NULL;
                        append(exps, e);
                        skipWS( r, pos);
-                       read_prop( sql, e, r, pos);
+                       if (!read_prop(sql, e, r, pos))
+                               return NULL;
                }
                if (r[*pos] != ebracket)
                        return sql_error(sql, -1, SQLSTATE(42000) "Missing 
closing %c\n", ebracket);
@@ -824,7 +828,7 @@ static sql_exp*
 exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, list *pexps, char *r, int 
*pos, int grp)
 {
        int f = -1, not = 1, old, d=0, s=0, unique = 0, no_nils = 0, quote = 0;
-       char *tname, *cname = NULL, *e, *b = r + *pos, *st;
+       char *tname = NULL, *cname = NULL, *var_cname = NULL, *e, *b = r + 
*pos, *st;
        sql_exp *exp = NULL;
        list *exps = NULL;
        sql_subtype *tpe;
@@ -869,7 +873,8 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        list *lexps,*rexps;
                        char *fname = NULL;
 
-                       lexps = read_exps(sql, lrel, rrel, pexps, r, pos, '(', 
0);
+                       if (!(lexps = read_exps(sql, lrel, rrel, pexps, r, pos, 
'(', 0)))
+                               return NULL;
                        skipWS(r, pos);
                        if (r[*pos] == '!') {
                                anti = 1;
@@ -895,7 +900,8 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                skipWS(r,pos);
                        }
 
-                       rexps = read_exps(sql, lrel, rrel, pexps, r, pos, '(', 
0);
+                       if (!(rexps = read_exps(sql, lrel, rrel, pexps, r, pos, 
'(', 0)))
+                               return NULL;
                        if (filter) {
                                sql_subfunc *func = sql_find_func(sql->sa, 
mvc_bind_schema(sql, "sys"), fname, 1+list_length(exps), F_FILT, NULL);
                                if (!func)
@@ -909,8 +915,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
        case '[':
                tname = b;
                if (tname && *tname == '[') { /* list of values */
-                       exps = read_exps(sql, lrel, rrel, pexps, r, pos, '[', 
0);
-                       if (!exps)
+                       if (!(exps = read_exps(sql, lrel, rrel, pexps, r, pos, 
'[', 0)))
                                return NULL;
                        exp = exp_values(sql->sa, exps);
                } else {
@@ -929,14 +934,14 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                        return sql_error(sql, -1, 
SQLSTATE(42000) "Type: missing ')'\n");
                                (*pos)++;
                        }
-                       tpe = sql_bind_subtype(sql->sa, tname, d, s);
+                       if (!(tpe = sql_bind_subtype(sql->sa, tname, d, s)))
+                               return sql_error(sql, -1, SQLSTATE(42000) "SQL 
type %s(%d, %d) not found\n", tname, d, s);
                        skipWS(r, pos);
                        *e = old;
                        if (r[*pos] == '[') { /* convert */
                                (*pos)++;
                                skipWS(r, pos);
-                               exp = exp_read(sql, lrel, rrel, pexps, r, pos, 
0);
-                               if (!exp)
+                               if (!(exp = exp_read(sql, lrel, rrel, pexps, r, 
pos, 0)))
                                        return NULL;
                                if (r[*pos] != ']')
                                        return sql_error(sql, -1, 
SQLSTATE(42000) "Convert: missing ']'\n");
@@ -956,7 +961,8 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
        case '\"':
                *e = 0;
                tname = b;
-               tpe = sql_bind_subtype(sql->sa, tname, 0, 0);
+               if (!(tpe = sql_bind_subtype(sql->sa, tname, 0, 0)))
+                       return sql_error(sql, -1, SQLSTATE(42000) "SQL type %s 
not found\n", tname);
                st = readString(r,pos);
                if (st && strcmp(st, "NULL") == 0)
                        exp = exp_atom(sql->sa, atom_general(sql->sa, tpe, 
NULL));
@@ -988,18 +994,21 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                sql_subaggr *a = NULL;
                node *n;
 
-               exps = read_exps(sql, lrel, rrel, pexps, r, pos, '(', 0);
-               if (!exps)
+               if (!(exps = read_exps(sql, lrel, rrel, pexps, r, pos, '(', 0)))
                        return NULL;
                tname = b;
                *e = 0;
                s = mvc_bind_schema(sql, tname);
+               if (tname && !s)
+                       return sql_error(sql, -1, SQLSTATE(42000) "Schema %s 
not found\n", tname);
                if (grp) {
                        if (exps && exps->h)
                                a = sql_bind_aggr(sql->sa, s, cname, 
exp_subtype(exps->h->data));
                        else
                                a = sql_bind_aggr(sql->sa, s, cname, NULL);
-                       exp = exp_aggr( sql->sa, exps, a, unique, no_nils, 
CARD_ATOM, 1);
+                       if (!a)
+                               return sql_error(sql, -1, SQLSTATE(42000) 
"Aggregate %s%s%s not found\n", tname ? tname : "", tname ? "." : "", cname);
+                       exp = exp_aggr(sql->sa, exps, a, unique, no_nils, 
CARD_ATOM, 1);
                } else {
                        list *ops = sa_list(sql->sa);
                        for( n = exps->h; n; n = n->next)
@@ -1028,6 +1037,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
        }
 
        if (!exp && b != e) { /* simple ident */
+               var_cname = b;
                if (b[0] == 'A' && isdigit((unsigned char) b[1])) {
                        char *e2;
                        int nr = strtol(b+1,&e2,10);
@@ -1051,28 +1061,35 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                }
                if (!exp && lrel) {
                        int amb = 0;
-                       char *cname;
 
                        old = *e;
                        *e = 0;
-                       cname = sa_strdup(sql->sa, b);
+                       var_cname = sa_strdup(sql->sa, b);
                        if (pexps) {
-                               exp = exps_bind_column(pexps, cname, &amb, 1);
+                               exp = exps_bind_column(pexps, var_cname, &amb, 
1);
                                if (exp)
-                                       exp = exp_alias_or_copy(sql, 
exp_relname(exp), cname, lrel, exp);
+                                       exp = exp_alias_or_copy(sql, 
exp_relname(exp), var_cname, lrel, exp);
                        }
                        (void)amb;
                        assert(amb == 0);
                        if (!exp && lrel)
-                               exp = rel_bind_column(sql, lrel, cname, 0, 1);
+                               exp = rel_bind_column(sql, lrel, var_cname, 0, 
1);
                        if (!exp && rrel)
-                               exp = rel_bind_column(sql, rrel, cname, 0, 1);
+                               exp = rel_bind_column(sql, rrel, var_cname, 0, 
1);
                        *e = old;
                        skipWS(r,pos);
                }
        }
-       if (!exp)
+
+       if (!exp) {
+               if (cname) {
+                       bool has_tname = tname && strcmp(tname, cname) != 0;
+                       return sql_error(sql, -1, SQLSTATE(42000) "Identifier 
%s%s%s doesn't exist\n", has_tname ? tname : "", has_tname ? "." : "", cname);
+               } else if (var_cname) {
+                       return sql_error(sql, -1, SQLSTATE(42000) "Identifier 
%s doesn't exist\n", var_cname);
+               }
                return NULL;
+       }
 
        if (r[*pos] == '!') {
                (*pos)++;
@@ -1137,7 +1154,8 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        exp->p = prop_create(sql->sa, PROP_FETCH, exp->p);
                skipWS(r,pos);
        }
-       read_prop( sql, exp, r, pos);
+       if (!read_prop(sql, exp, r, pos))
+               return NULL;
        skipWS(r,pos);
 
        /* as alias */
@@ -1240,12 +1258,16 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                skipWS(r,pos);
                if (f == cmp_in || f == cmp_notin) {
                        list *exps = read_exps(sql, lrel, rrel, pexps, r, pos, 
'(', 0);
+                       if (!exps)
+                               return NULL;
                        if (f == cmp_in || f == cmp_notin)
                                return exp_in(sql->sa, exp, exps, f);
                } else {
                        int sym = 0, between = 0;
                        sql_exp *e = exp_read(sql, lrel, rrel, pexps, r, pos, 
0);
 
+                       if (!e)
+                               return NULL;
                        if (strncmp(r+*pos, "BETWEEN",  strlen("BETWEEN")) == 
0) {
                                (*pos)+= (int) strlen("BETWEEN");
                                skipWS(r,pos);
@@ -1256,7 +1278,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                skipWS(r,pos);
                                sym = 1;
                        }
-                       if (e && e->type == e_cmp) {
+                       if (e->type == e_cmp) {
                                sql_exp *ne = exp_compare2(sql->sa, e->l, exp, 
e->r, compare2range(swap_compare((comp_type)f), e->flag));
                                if (sym)
                                        ne->flag |= CMP_SYMMETRIC;
@@ -1265,7 +1287,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                if (is_anti(exp))
                                        set_anti(ne);
                                return ne;
-                       } else if (e) {
+                       } else {
                                sql_exp *ne = exp_compare(sql->sa, exp, e, f);
                                if (sym)
                                        ne->flag |= CMP_SYMMETRIC;
@@ -1314,7 +1336,8 @@ rel_read(mvc *sql, char *r, int *pos, li
                (*pos)++; /* ( */
                (void)readInt(r,pos); /* skip nr refs */
                (*pos)++; /* ) */
-               rel = rel_read(sql, r, pos, refs);
+               if (!(rel = rel_read(sql, r, pos, refs)))
+                       return NULL;
                append(refs, rel);
                skipWS(r,pos);
        }
@@ -1332,9 +1355,11 @@ rel_read(mvc *sql, char *r, int *pos, li
                *pos += (int) strlen("insert");
                skipWS(r, pos);
                (*pos)++; /* ( */
-               lrel = rel_read(sql, r, pos, refs); /* to be inserted relation 
*/
+               if (!(lrel = rel_read(sql, r, pos, refs))) /* to be inserted 
relation */
+                       return NULL;
                skipWS(r,pos);
-               rrel = rel_read(sql, r, pos, refs); /* the inserts relation */
+               if (!(rrel = rel_read(sql, r, pos, refs))) /* the inserts 
relation */
+                       return NULL;
                skipWS(r,pos);
                (*pos)++; /* ) */
 
@@ -1345,9 +1370,11 @@ rel_read(mvc *sql, char *r, int *pos, li
                *pos += (int) strlen("delete");
                skipWS(r, pos);
                (*pos)++; /* ( */
-               lrel = rel_read(sql, r, pos, refs); /* to be deleted relation */
+               if (!(lrel = rel_read(sql, r, pos, refs))) /* to be deleted 
relation */
+                       return NULL;
                skipWS(r,pos);
-               rrel = rel_read(sql, r, pos, refs); /* the deletes relation */
+               if (!(rrel = rel_read(sql, r, pos, refs))) /* the deletes 
relation */
+                       return NULL;
                skipWS(r,pos);
                (*pos)++; /* ) */
 
@@ -1371,7 +1398,8 @@ rel_read(mvc *sql, char *r, int *pos, li
                }
                skipWS(r, pos);
                (*pos)++; /* ( */
-               lrel = rel_read(sql, r, pos, refs); /* to be truncated relation 
*/
+               if (!(lrel = rel_read(sql, r, pos, refs))) /* to be truncated 
relation */
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to