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

Reply via email to