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