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