Changeset: f09a5dd3bec5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f09a5dd3bec5
Added Files:
sql/test/SQLancer/Tests/SingleServer
Modified Files:
monetdb5/modules/atoms/str.c
sql/server/rel_optimizer.c
sql/server/rel_rewriter.c
sql/server/rel_select.c
sql/server/rel_unnest.c
sql/server/sql_parser.y
sql/test/BugTracker-2017/Tests/date-arithmetic.Bug-6415.sql
sql/test/SQLancer/Tests/sqlancer01.sql
sql/test/SQLancer/Tests/sqlancer01.stable.out
testing/Mtest.py.in
Branch: default
Log Message:
merged
diffs (truncated from 760 to 300 lines):
diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c
--- a/monetdb5/modules/atoms/str.c
+++ b/monetdb5/modules/atoms/str.c
@@ -3989,23 +3989,26 @@ STRSubstitute(str *res, const str *arg1,
const char *pfnd;
char *fnd;
- if (strNil(s)) {
+ if (strNil(s) || strNil(src) || strNil(dst)) {
if ((*res = GDKstrdup(str_nil)) == NULL)
throw(MAL, "str.substitute", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
return MAL_SUCCEED;
}
+ if (!lsrc || !l) { /* s/src is an empty string, there's nothing to
substitute */
+ if ((*res = GDKstrdup(s)) == NULL)
+ throw(MAL, "str.substitute", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ return MAL_SUCCEED;
+ }
n = l + ldst;
- if (repeat && ldst > lsrc && lsrc) {
+ if (repeat && ldst > lsrc)
n = (ldst * l) / lsrc; /* max length */
- }
+
buf = *res = GDKmalloc(n);
if (*res == NULL)
throw(MAL, "str.substitute", SQLSTATE(HY013) MAL_MALLOC_FAIL);
pfnd = s;
- if (lsrc == 0)
- lsrc = 1; /* make sure we make
progress */
do {
fnd = strstr(pfnd, src);
if (fnd == NULL)
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
@@ -2491,7 +2491,7 @@ static sql_rel *
rel_remove_redundant_join(mvc *sql, sql_rel *rel, int *changes)
{
(void)sql;
- if (is_join(rel->op) || is_semi(rel->op)) {
+ if ((is_join(rel->op) || is_semi(rel->op)) && !list_empty(rel->exps)) {
sql_rel *l = rel->l, *r = rel->r, *b, *p = NULL, *j;
if (is_basetable(l->op) && is_simple_project(r->op) &&
need_distinct(r)) {
@@ -3976,8 +3976,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
@@ -2323,10 +2323,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,..] */
@@ -2518,23 +2515,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:
@@ -2819,24 +2804,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_select_push_exp_down(sql, rel, e2, le, le,
re1, re1, re2, f);
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -2085,10 +2085,13 @@ rewrite_anyequal(mvc *sql, sql_rel *rel,
if (!lsq && !is_tuple && is_values(re) &&
!exps_have_rel_exp(re->f)) { /* exp_values */
list *vals = re->f;
- if (is_select(rel->op))
+ if (is_select(rel->op)) {
return exp_in_compare(sql, &le, vals,
is_anyequal(sf));
- else
- return exp_in_project(sql, &le, vals,
is_anyequal(sf));
+ } else {
+ sql_exp *res = exp_in_project(sql, &le,
vals, is_anyequal(sf));
+ exp_setname(sql->sa, res,
exp_relname(e), exp_name(e));
+ return res;
+ }
}
if (is_atom(re->type) && re->f) { /* exp_values */
@@ -2291,10 +2294,13 @@ rewrite_compare(mvc *sql, sql_rel *rel,
list *vals = re->f;
assert(0);
- if (depth == 0 && is_select(rel->op))
+ if (depth == 0 && is_select(rel->op)) {
return exp_in_compare(sql, &le, vals,
is_anyequal(sf));
- else
- return exp_in_project(sql, &le, vals,
is_anyequal(sf));
+ } else {
+ sql_exp *res = exp_in_project(sql, &le,
vals, is_anyequal(sf));
+ exp_setname(sql->sa, res,
exp_relname(e), exp_name(e));
+ return res;
+ }
}
if (is_values(re)) { /* exp_values */
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -188,7 +188,6 @@ int yydebug=1;
alter_statement
alter_table_element
and_exp
- assign_default
assignment
atom
between_predicate
@@ -198,7 +197,6 @@ int yydebug=1;
case_opt_else
case_statement
cast_exp
- cast_value
catalog_object
column_constraint
column_constraint_type
@@ -305,7 +303,6 @@ int yydebug=1;
select_statement_single_row
seq_def
set_statement
- simple_atom
simple_scalar_exp
simple_select
sql
@@ -425,7 +422,7 @@ int yydebug=1;
atom_commalist
authid_list
case_opt_else_statement
- case_scalar_exp_list
+ case_search_condition_commalist
column_commalist_parens
column_def_opt_list
column_exp_commalist
@@ -481,7 +478,6 @@ int yydebug=1;
routine_designator
routine_name
row_commalist
- scalar_exp_list
schema_element_list
schema_name_clause
schema_name_list
@@ -891,7 +887,7 @@ opt_equal:
;
set_statement:
- set variable_ref '=' search_condition
+ set variable_ref '=' search_condition
{ dlist *l = L();
append_list(l, $2 );
append_symbol(l, $4 );
@@ -2281,12 +2277,10 @@ routine_invocation:
routine_name: qname ;
argument_list:
- /*empty*/ {$$ = L();}
- | scalar_exp { $$ = append_symbol( L(), $1); }
- | argument_list ',' scalar_exp
- { $$ = append_symbol( $1, $3); }
- ;
-
+ /* empty */ { $$ =
L(); }
+ | search_condition { $$ = append_symbol(
L(), $1); }
+ | argument_list ',' search_condition { $$ = append_symbol( $1, $3); }
+ ;
return_statement:
RETURN return_value { $$ = _symbol_create_symbol(SQL_RETURN, $2); }
@@ -2295,12 +2289,12 @@ return_statement:
return_value:
query_expression
| search_condition
- | TABLE '(' query_expression ')'
+ | TABLE '(' query_expression ')'
{ $$ = _symbol_create_symbol(SQL_TABLE, $3); }
;
case_statement:
- CASE scalar_exp when_statements case_opt_else_statement END CASE
+ CASE search_condition when_statements case_opt_else_statement END CASE
{ $$ = _symbol_create_list(SQL_CASE,
append_list(
append_list(
@@ -2314,7 +2308,7 @@ case_statement:
;
when_statement:
- WHEN scalar_exp THEN procedure_statement_list
+ WHEN search_condition THEN procedure_statement_list
{ $$ = _symbol_create_list( SQL_WHEN,
append_list(
append_symbol(
@@ -2409,8 +2403,7 @@ opt_end_label:
/* empty */ { $$ = NULL; }
| ident
;
-
-
+
table_function_column_list:
column data_type { $$ = L();
append_string($$, $1);
@@ -2825,7 +2818,6 @@ opt_fwf_widths:
| fwf_widthlist ',' poslng
{ $$ = append_lng($1, $3); }
;
-
opt_header_list:
/* empty */ { $$ = NULL; }
@@ -3039,7 +3031,6 @@ values_or_query_spec:
| query_expression
;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list