Changeset: 7caa42ba0a55 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7caa42ba0a55
Modified Files:
sql/server/rel_select.c
sql/test/SQLancer/Tests/sqlancer19.SQL.py
sql/test/SQLancer/Tests/sqlancer20.SQL.py
Branch: default
Log Message:
Making SQLancer happy.
While parsing comparison arguments, add sql_arg flag and don't mess up with
rel_logical_value_exp and rel_value_exp calls.
Later we could improve the algebra.fetch call with something better on remote
plans.
diffs (267 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
@@ -1716,7 +1716,7 @@ rel_compare(sql_query *query, sql_rel *r
cmp_type = swap_compare(cmp_type);
}
- ls = rel_value_exp(query, &rel, lo, f, ek);
+ ls = rel_value_exp(query, &rel, lo, f|sql_farg, ek);
if (!ls)
return NULL;
if (ls && rel && exp_has_freevar(sql, ls) && is_sql_sel(f))
@@ -1724,7 +1724,7 @@ rel_compare(sql_query *query, sql_rel *r
if (quantifier)
ek.card = card_set;
- rs = rel_value_exp(query, &rel, ro, f, ek);
+ rs = rel_value_exp(query, &rel, ro, f|sql_farg, ek);
if (!rs)
return NULL;
if (ls->card > rs->card && rs->card == CARD_AGGR && is_sql_having(f))
@@ -1833,7 +1833,7 @@ rel_exists_value_exp(sql_query *query, s
exp_kind ek = {type_value, card_exists, FALSE};
sql_exp *le, *e;
- le = rel_value_exp(query, rel, sc->data.sym, f, ek);
+ le = rel_value_exp(query, rel, sc->data.sym, f|sql_farg, ek);
if (!le)
return NULL;
if (!(e = exp_exist(query, rel ? *rel : NULL, le, sc->token ==
SQL_EXISTS)))
@@ -1902,7 +1902,7 @@ rel_in_value_exp(sql_query *query, sql_r
lo = dl->h->data.sym;
}
for( ; lo; lo = dn?dn->data.sym:NULL, dn = dn?dn->next:NULL ) {
- le = rel_value_exp(query, rel, lo, f, ek);
+ le = rel_value_exp(query, rel, lo, f|sql_farg, ek);
if (!le)
return NULL;
ek.card = card_set;
@@ -1926,7 +1926,7 @@ rel_in_value_exp(sql_query *query, sql_r
n = n->data.lval->h;
for (; n; n = n->next) {
- re = rel_value_exp(query, rel, n->data.sym, f, ek);
+ re = rel_value_exp(query, rel, n->data.sym, f|sql_farg,
ek);
if (!re)
return NULL;
if (is_tuple && !exp_is_rel(re))
@@ -2201,9 +2201,9 @@ rel_logical_value_exp(sql_query *query,
symbol *ro = sc->data.lval->h->next->data.sym;
sql_exp *ls, *rs;
- if (!(ls = rel_logical_value_exp(query, rel, lo, f, ek)))
+ if (!(ls = rel_value_exp(query, rel, lo, f|sql_farg, ek)))
return NULL;
- if (!(rs = rel_logical_value_exp(query, rel, ro, f, ek)))
+ if (!(rs = rel_value_exp(query, rel, ro, f|sql_farg, ek)))
return NULL;
return rel_binop_(sql, rel ? *rel : NULL, ls, rs, "sys",
sc->token == SQL_OR ? "or": "and", card_value);
}
@@ -2225,7 +2225,7 @@ rel_logical_value_exp(sql_query *query,
for (; ln; ln = ln->next) {
symbol *sym = ln->data.sym;
- sql_exp *e = rel_value_exp(query, rel, sym, f, ek);
+ sql_exp *e = rel_value_exp(query, rel, sym, f|sql_farg,
ek);
if (!e)
return NULL;
if (!obj_type)
@@ -2236,7 +2236,7 @@ rel_logical_value_exp(sql_query *query,
for (; rn; rn = rn->next) {
symbol *sym = rn->data.sym;
- sql_exp *e = rel_value_exp(query, rel, sym, f, ek);
+ sql_exp *e = rel_value_exp(query, rel, sym, f|sql_farg,
ek);
if (!e)
return NULL;
list_append(exps, e);
@@ -2285,13 +2285,13 @@ rel_logical_value_exp(sql_query *query,
compare_op = "=";
}
- ls = rel_value_exp(query, rel, lo, f, ek);
+ ls = rel_value_exp(query, rel, lo, f|sql_farg, ek);
if (!ls)
return NULL;
if (quantifier)
ek.card = card_set;
- rs = rel_value_exp(query, rel, ro, f, ek);
+ rs = rel_value_exp(query, rel, ro, f|sql_farg, ek);
if (!rs)
return NULL;
@@ -2324,7 +2324,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), *re, *ee =
NULL, *ie = exp_atom_bool(sql->sa, insensitive);
+ sql_exp *le = rel_value_exp(query, rel, lo, f|sql_farg, ek),
*re, *ee = NULL, *ie = exp_atom_bool(sql->sa, insensitive);
if (!le)
return NULL;
@@ -2336,7 +2336,7 @@ rel_logical_value_exp(sql_query *query,
lo = ro->data.lval->h->data.sym;
/* like uses a single string pattern */
ek.card = card_value;
- re = rel_value_exp(query, rel, lo, f, ek);
+ re = rel_value_exp(query, rel, lo, f|sql_farg, ek);
if (!re)
return NULL;
if ((re = exp_check_type(sql, st, rel ? *rel : NULL, re,
type_equal)) == NULL)
@@ -2364,11 +2364,11 @@ rel_logical_value_exp(sql_query *query,
assert(sc->data.lval->h->next->type == type_int);
- if (!(le = rel_value_exp(query, rel, lo, f, ek)))
+ if (!(le = rel_value_exp(query, rel, lo, f|sql_farg, ek)))
return NULL;
- if (!(re1 = rel_value_exp(query, rel, ro1, f, ek)))
+ if (!(re1 = rel_value_exp(query, rel, ro1, f|sql_farg, ek)))
return NULL;
- if (!(re2 = rel_value_exp(query, rel, ro2, f, ek)))
+ if (!(re2 = rel_value_exp(query, rel, ro2, f|sql_farg, ek)))
return NULL;
if (exp_between_check_types(&super, exp_subtype(le),
exp_subtype(re1), exp_subtype(re2)) < 0)
@@ -2388,7 +2388,7 @@ rel_logical_value_exp(sql_query *query,
case SQL_IS_NOT_NULL:
/* is (NOT) NULL */
{
- sql_exp *le = rel_value_exp(query, rel, sc->data.sym, f, ek);
+ sql_exp *le = rel_value_exp(query, rel, sc->data.sym,
f|sql_farg, ek);
if (!le)
return NULL;
@@ -2403,7 +2403,7 @@ rel_logical_value_exp(sql_query *query,
sc->data.sym = negate_symbol_tree(sql, sc->data.sym);
return rel_logical_value_exp(query, rel, sc->data.sym,
f, ek);
}
- sql_exp *le = rel_value_exp(query, rel, sc->data.sym, f, ek);
+ sql_exp *le = rel_value_exp(query, rel, sc->data.sym,
f|sql_farg, ek);
if (!le)
return NULL;
@@ -2440,7 +2440,7 @@ rel_logical_value_exp(sql_query *query,
case SQL_DEFAULT:
return sql_error(sql, 02, SQLSTATE(42000) "DEFAULT keyword not
allowed outside insert and update statements");
default: {
- sql_exp *le = rel_value_exp(query, rel, sc, f, ek);
+ sql_exp *le = rel_value_exp(query, rel, sc, f|sql_farg, ek);
sql_subtype bt;
if (!le)
@@ -2535,7 +2535,7 @@ rel_logical_exp(sql_query *query, sql_re
for (; ln; ln = ln->next) {
symbol *sym = ln->data.sym;
- sql_exp *e = rel_value_exp(query, &rel, sym, f, ek);
+ sql_exp *e = rel_value_exp(query, &rel, sym,
f|sql_farg, ek);
if (!e)
return NULL;
list_append(l, e);
@@ -2543,7 +2543,7 @@ rel_logical_exp(sql_query *query, sql_re
for (; rn; rn = rn->next) {
symbol *sym = rn->data.sym;
- sql_exp *e = rel_value_exp(query, &rel, sym, f, ek);
+ sql_exp *e = rel_value_exp(query, &rel, sym,
f|sql_farg, ek);
if (!e)
return NULL;
list_append(r, e);
@@ -2578,7 +2578,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), *re, *ee =
NULL, *ie = exp_atom_bool(sql->sa, insensitive);
+ sql_exp *le = rel_value_exp(query, &rel, lo, f|sql_farg, ek),
*re, *ee = NULL, *ie = exp_atom_bool(sql->sa, insensitive);
if (!le)
return NULL;
@@ -2595,7 +2595,7 @@ rel_logical_exp(sql_query *query, sql_re
ee = exp_atom(sql->sa, atom_string(sql->sa, st,
sa_strdup(sql->sa, "")));
}
ro = ro->data.lval->h->data.sym;
- re = rel_value_exp(query, &rel, ro, f, ek);
+ re = rel_value_exp(query, &rel, ro, f|sql_farg, ek);
if (!re)
return NULL;
if ((re = exp_check_type(sql, st, rel, re, type_equal)) == NULL)
@@ -2616,11 +2616,11 @@ rel_logical_exp(sql_query *query, sql_re
assert(sc->data.lval->h->next->type == type_int);
- if (!(le = rel_value_exp(query, &rel, lo, f, ek)))
+ if (!(le = rel_value_exp(query, &rel, lo, f|sql_farg, ek)))
return NULL;
- if (!(re1 = rel_value_exp(query, &rel, ro1, f, ek)))
+ if (!(re1 = rel_value_exp(query, &rel, ro1, f|sql_farg, ek)))
return NULL;
- if (!(re2 = rel_value_exp(query, &rel, ro2, f, ek)))
+ if (!(re2 = rel_value_exp(query, &rel, ro2, f|sql_farg, ek)))
return NULL;
if (exp_between_check_types(&super, exp_subtype(le),
exp_subtype(re1), exp_subtype(re2)) < 0)
@@ -2637,7 +2637,7 @@ rel_logical_exp(sql_query *query, sql_re
case SQL_IS_NOT_NULL:
/* is (NOT) NULL */
{
- sql_exp *le = rel_value_exp(query, &rel, sc->data.sym, f, ek);
+ sql_exp *le = rel_value_exp(query, &rel, sc->data.sym,
f|sql_farg, ek);
sql_subtype *t;
if (!le)
@@ -2735,7 +2735,7 @@ rel_logical_exp(sql_query *query, sql_re
case SQL_DEFAULT:
return sql_error(sql, 02, SQLSTATE(42000) "DEFAULT keyword not
allowed outside insert and update statements");
default: {
- sql_exp *le = rel_value_exp(query, &rel, sc, f, ek);
+ sql_exp *le = rel_value_exp(query, &rel, sc, f|sql_farg, ek);
sql_subtype bt;
if (!le)
@@ -4002,7 +4002,7 @@ rel_cast(sql_query *query, sql_rel **rel
symbol *s = dl->h->data.sym;
sql_subtype *tpe = &dl->h->next->data.typeval;
exp_kind ek = {type_value, card_column, FALSE};
- sql_exp *e = rel_value_exp(query, rel, s, f, ek);
+ sql_exp *e = rel_value_exp(query, rel, s, f|sql_farg, ek);
if (!e)
return NULL;
diff --git a/sql/test/SQLancer/Tests/sqlancer19.SQL.py
b/sql/test/SQLancer/Tests/sqlancer19.SQL.py
--- a/sql/test/SQLancer/Tests/sqlancer19.SQL.py
+++ b/sql/test/SQLancer/Tests/sqlancer19.SQL.py
@@ -250,6 +250,13 @@ with SQLTestCase() as cli:
.assertSucceeded().assertDataResultMatch([(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,)])
cli.execute("ROLLBACK;")
+ cli.execute("CREATE FUNCTION mybooludf(a bool) RETURNS BOOL RETURN a;")
+ # At the moment I take this as a feature. Later we could replace the
algebra.fetch call with something more appropriate
+ cli.execute("SELECT 1 FROM rt3 HAVING (min(TIME '02:00:00') IN (TIME
'02:00:00')) IS NULL;") \
+ .assertFailed(err_message="Illegal argument: cannot fetch a single row
from an empty input")
+ cli.execute("SELECT 1 FROM rt3 HAVING mybooludf(min(false));") \
+ .assertFailed(err_message="Illegal argument: cannot fetch a single row
from an empty input")
+
cli.execute("""
START TRANSACTION;
DROP TABLE rt1;
@@ -261,4 +268,5 @@ with SQLTestCase() as cli:
DROP TABLE t2;
DROP TABLE t3;
DROP TABLE t4;
+ DROP FUNCTION mybooludf(bool);
COMMIT;""").assertSucceeded()
diff --git a/sql/test/SQLancer/Tests/sqlancer20.SQL.py
b/sql/test/SQLancer/Tests/sqlancer20.SQL.py
--- a/sql/test/SQLancer/Tests/sqlancer20.SQL.py
+++ b/sql/test/SQLancer/Tests/sqlancer20.SQL.py
@@ -33,8 +33,6 @@ with SQLTestCase() as cli:
.assertSucceeded().assertDataResultMatch([])
cli.execute("SELECT 2 FROM rt1 WHERE (rt1.c0 BETWEEN rt1.c0 AND rt1.c0) IS
NULL;") \
.assertSucceeded().assertDataResultMatch([])
- cli.execute("SELECT 1 FROM rt1 HAVING (min(TIME '02:00:00') IN (TIME
'02:00:00')) IS NULL;") \
- .assertSucceeded().assertDataResultMatch([])
cli.execute("""
START TRANSACTION;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list