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

Reply via email to