Changeset: a5324ae86375 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a5324ae86375
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_rewriter.c
        sql/server/rel_select.c
        sql/test/SQLancer/Tests/sqlancer01.sql
        sql/test/SQLancer/Tests/sqlancer01.stable.out
Branch: Jun2020
Log Message:

Fix for SQLancer crash, added missing exp_setname call at exp_merge_project_rse 
optimizer. Also some small cleanup


diffs (138 lines):

diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -4012,8 +4012,11 @@ exp_merge_project_rse( mvc *sql, sql_exp
                }
        } else if (is_convert(e->type)) {
                sql_exp *n = exp_merge_project_rse(sql, e->l);
-               if (n && n != e->l)
-                       return exp_convert(sql->sa, n, exp_fromtype(e), 
exp_totype(e));
+               if (n && n != e->l) {
+                       n = exp_convert(sql->sa, n, exp_fromtype(e), 
exp_totype(e));
+                       exp_setname(sql->sa, n, exp_relname(e), exp_name(e));
+                       return n;
+               }
        }
        return e;
 }
diff --git a/sql/server/rel_rewriter.c b/sql/server/rel_rewriter.c
--- a/sql/server/rel_rewriter.c
+++ b/sql/server/rel_rewriter.c
@@ -30,6 +30,9 @@ exps_simplify_exp(mvc *sql, list *exps, 
 
                needed = (exp_is_true(sql, e) || exp_is_false(sql, e) || 
(is_compare(e->type) && e->flag == cmp_or)); 
        }
+       /* if there's only one expression and it is false, we have to keep it */
+       if (list_length(exps) == 1 && exp_is_false(sql, exps->h->data))
+               return exps;
        if (needed) {
                list *nexps = sa_list(sql->sa);
                sql->caching = 0;
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
@@ -2328,10 +2328,7 @@ rel_logical_value_exp(sql_query *query, 
                        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);
-               else
-                       return rel_binop_(sql, rel ? *rel : NULL, ls, rs, NULL, 
"and", card_value);
+               return rel_binop_(sql, rel ? *rel : NULL, ls, rs, NULL, 
sc->token == SQL_OR ? "or": "and", card_value);
        }
        case SQL_FILTER:
                /* [ x,..] filter [ y,..] */
@@ -2523,23 +2520,11 @@ rel_logical_value_exp(sql_query *query, 
                        re1 = tmp;
                }
 
-               if (sc->token == SQL_NOT_BETWEEN) {
-                       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 {
-                       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;
-               }
-               assert(e1 && e2);
-               if (sc->token == SQL_NOT_BETWEEN) {
-                       return rel_binop_(sql, rel ? *rel : NULL, e1, e2, NULL, 
"or", card_value);
-               } else {
-                       return rel_binop_(sql, rel ? *rel : NULL, e1, e2, NULL, 
"and", card_value);
-               }
+               if (!(e1 = rel_binop_(sql, rel ? *rel : NULL, le, re1, NULL, 
sc->token == SQL_NOT_BETWEEN ? "<" : ">=", card_value)))
+                       return NULL;
+               if (!(e2 = rel_binop_(sql, rel ? *rel : NULL, le, re2, NULL, 
sc->token == SQL_NOT_BETWEEN ? ">" : "<=", card_value)))
+                       return NULL;
+               return rel_binop_(sql, rel ? *rel : NULL, e1, e2, NULL, 
sc->token == SQL_NOT_BETWEEN ? "or" : "and", card_value);
        }
        case SQL_IS_NULL:
        case SQL_IS_NOT_NULL:
@@ -2834,24 +2819,11 @@ rel_logical_exp(sql_query *query, sql_re
 
                if (le->card == CARD_ATOM) {
                        sql_exp *e1, *e2;
-                       if (sc->token == SQL_NOT_BETWEEN) {
-                               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 {
-                               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;
-                       }
-                       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)
+                       if (!(e1 = rel_binop_(sql, rel, le, re1, NULL, 
sc->token == SQL_NOT_BETWEEN ? "<" : ">=", card_value)))
+                               return NULL;
+                       if (!(e2 = rel_binop_(sql, rel, le, re2, NULL, 
sc->token == SQL_NOT_BETWEEN ? ">" : "<=", card_value)))
+                               return NULL;
+                       if (!(e1 = rel_binop_(sql, rel, e1, e2, NULL, sc->token 
== SQL_NOT_BETWEEN ? "or" : "and", card_value)))
                                return NULL;
                        e2 = exp_compare(sql->sa, e1, exp_atom_bool(sql->sa, 
1), cmp_equal);
                        return rel_compare_push_exp(sql, rel, e2, le, le, re1, 
re1, re2);
diff --git a/sql/test/SQLancer/Tests/sqlancer01.sql 
b/sql/test/SQLancer/Tests/sqlancer01.sql
--- a/sql/test/SQLancer/Tests/sqlancer01.sql
+++ b/sql/test/SQLancer/Tests/sqlancer01.sql
@@ -51,6 +51,8 @@ select all integers.i from another_t inn
 where true union all select all integers.i from another_t join integers on 
((another_t.col3)<=(cast((another_t.col4) between symmetric 
(cast(0.29924480503501805 as int)) and (another_t.col3) as int))) 
 where not (true) union all select all integers.i from another_t join integers 
on ((another_t.col3)<=(cast((another_t.col4) between symmetric 
(cast(0.29924480503501805 as int)) and (another_t.col3) as int))) where (true) 
is null;
        -- empty
+select 1 from another_t join integers on (cast(another_t.col4 between 1 and 2 
as int)) where false;
+       -- empty
 
 DROP TABLE tbl_ProductSales;
 DROP TABLE another_T;
diff --git a/sql/test/SQLancer/Tests/sqlancer01.stable.out 
b/sql/test/SQLancer/Tests/sqlancer01.stable.out
--- a/sql/test/SQLancer/Tests/sqlancer01.stable.out
+++ b/sql/test/SQLancer/Tests/sqlancer01.stable.out
@@ -205,6 +205,18 @@ stdout of test 'sqlancer01` in directory
 % varchar,     varchar,        clob,   clob # type
 % 1,   0,      0,      0 # length
 [ "!", "",     NULL,   NULL    ]
+#select all integers.i from another_t inner join integers on 
((another_t.col3)<=(cast((another_t.col4) between symmetric 
(cast(0.29924480503501805 as int)) and (another_t.col3) as int))) 
+#where true union all select all integers.i from another_t join integers on 
((another_t.col3)<=(cast((another_t.col4) between symmetric 
(cast(0.29924480503501805 as int)) and (another_t.col3) as int))) 
+#where not (true) union all select all integers.i from another_t join integers 
on ((another_t.col3)<=(cast((another_t.col4) between symmetric 
(cast(0.29924480503501805 as int)) and (another_t.col3) as int))) where (true) 
is null;
+% .%20 # table_name
+% i # name
+% int # type
+% 1 # length
+#select 1 from another_t join integers on (cast(another_t.col4 between 1 and 2 
as int)) where false;
+% .%14 # table_name
+% %14 # name
+% tinyint # type
+% 1 # length
 #DROP TABLE tbl_ProductSales;
 #DROP TABLE another_T;
 #DROP TABLE integers;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to