Changeset: 551b12410f86 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=551b12410f86 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 with Jun2020 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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list