Changeset: 2f417e9487c5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2f417e9487c5
Modified Files:
        gdk/gdk_analytic_bounds.c
        sql/backends/monet5/sql_cast.c
        sql/backends/monet5/sql_optimizer.c
        sql/backends/monet5/sql_time.c
        sql/server/rel_optimizer.c
        sql/server/rel_rewriter.c
        sql/server/rel_rewriter.h
        sql/server/rel_unnest.c
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_storage.h
        sql/storage/store.c
        sql/test/BugTracker-2013/Tests/timestamp.Bug-3401.stable.err
        sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.stable.err
        
sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.stable.err.int128
        
sql/test/BugTracker/Tests/inserting_invalid_timestamp.SF-1363557.stable.err
        sql/test/miscellaneous/Tests/select_groupby.stable.err
        sql/test/pg_regress/Tests/date.stable.err
        sql/test/pg_regress/Tests/time.stable.err
        sql/test/pg_regress/Tests/timestamp.stable.err
        sql/test/pg_regress/Tests/timestamptz.stable.err
        sql/test/pg_regress/Tests/timetz.stable.err
        sql/test/sys-schema/Tests/systemfunctions.stable.out
        sql/test/sys-schema/Tests/systemfunctions.stable.out.int128
        sql/test/wlcr/Tests/wlr110.stable.err
Branch: oscar
Log Message:

Merged with Jun2020


diffs (truncated from 1861 to 300 lines):

diff --git a/gdk/gdk_analytic_bounds.c b/gdk/gdk_analytic_bounds.c
--- a/gdk/gdk_analytic_bounds.c
+++ b/gdk/gdk_analytic_bounds.c
@@ -548,10 +548,7 @@
 
 #define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_GROUPS(IMP, LIMIT, TPE)      \
        do {                                                            \
-               switch (tp1) {                                          \
-               case TYPE_bit:                                          \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(bit, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_GROUPS##IMP, LIMIT, TPE); \
-                       break;                                          \
+               switch (ATOMbasetype(tp1)) {    \
                case TYPE_bte:                                          \
                        ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(bte, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_GROUPS##IMP, LIMIT, TPE); \
                        break;                                          \
diff --git a/sql/backends/monet5/sql_optimizer.c 
b/sql/backends/monet5/sql_optimizer.c
--- a/sql/backends/monet5/sql_optimizer.c
+++ b/sql/backends/monet5/sql_optimizer.c
@@ -30,7 +30,6 @@ SQLgetColumnSize(sql_trans *tr, sql_colu
 {
        lng size = 0;
        BAT *b;
-       store_lock();
        switch(access){
        case 0:
                b= store_funcs.bind_col(tr, c, RDONLY);
@@ -58,7 +57,6 @@ SQLgetColumnSize(sql_trans *tr, sql_colu
                        BBPunfix(b->batCacheid);
                }
        }
-       store_unlock();
        return size;
 }
 
diff --git a/sql/backends/monet5/sql_time.c b/sql/backends/monet5/sql_time.c
--- a/sql/backends/monet5/sql_time.c
+++ b/sql/backends/monet5/sql_time.c
@@ -222,13 +222,12 @@ lng shift, lng divider, lng multiplier
 )
 {
        ssize_t pos = 0;
-       daytime *conv = NULL;
+       daytime dt = 0, *conv = &dt;
 
        pos = fromstr_func(next, &(size_t){sizeof(daytime)}, &conv, false);
        if (pos < (ssize_t) strlen(next) || /* includes pos < 0 */ 
ATOMcmp(TYPE_daytime, conv, ATOMnilptr(TYPE_daytime)) == 0)
-               return createException(SQL, "batcalc.str_2time_daytimetz", 
SQLSTATE(22007) "Daytime (%s) has incorrect format", next);
-       else
-               *ret = daytime_2time_daytime_imp(*conv, shift, divider, 
multiplier);
+               return createException(SQL, "batcalc.str_2time_daytimetz", 
SQLSTATE(22007) "Daytime '%s' has incorrect format", next);
+       *ret = daytime_2time_daytime_imp(*conv, shift, divider, multiplier);
        return MAL_SUCCEED;
 }
 
@@ -608,13 +607,12 @@ lng shift, lng divider, lng multiplier
 )
 {
        ssize_t pos = 0;
-       timestamp *conv = NULL;
+       timestamp tp = 0, *conv = &tp;
 
        pos = fromstr_func(next, &(size_t){sizeof(timestamp)}, &conv, false);
        if (!pos || pos < (ssize_t) strlen(next) || ATOMcmp(TYPE_timestamp, 
conv, ATOMnilptr(TYPE_timestamp)) == 0)
-               return createException(SQL, 
"batcalc.str_2time_timestamptz_internal", SQLSTATE(22007) "Timestamp (%s) has 
incorrect format", next);
-       else
-               *ret = timestamp_2time_timestamp_imp(*conv, shift, divider, 
multiplier);
+               return createException(SQL, 
"batcalc.str_2time_timestamptz_internal", SQLSTATE(22007) "Timestamp '%s' has 
incorrect format", next);
+       *ret = timestamp_2time_timestamp_imp(*conv, shift, divider, multiplier);
        return MAL_SUCCEED;
 }
 
@@ -1257,21 +1255,19 @@ nil_2_date(Client cntxt, MalBlkPtr mb, M
 }
 
 static inline str
-str_2_date_internal_imp(date *res, str next, bit ce, bit *hasnil)
+str_2_date_internal_imp(date *ret, str next, bit ce, bit *hasnil)
 {
        if (!ce || strNil(next)) {
                *hasnil = 1;
-               *res = date_nil;
+               *ret = date_nil;
        } else {
-               ptr p = NULL;
-               ssize_t pos = ATOMfromstr(TYPE_date, &p, 
&(size_t){sizeof(date)}, next, false);
+               ssize_t pos = 0;
+               date dt = 0, *conv = &dt;
 
-               if (pos < 0 || !p || (ATOMcmp(TYPE_date, p, 
ATOMnilptr(TYPE_date)) == 0)) {
-                       GDKfree(p);
-                       return createException(SQL, "calc.str_2_date", 
SQLSTATE(42000) "Conversion of string '%s' failed", next);
-               } else {
-                       *res = *(date*)p;
-               }
+               pos = date_fromstr(next, &(size_t){sizeof(date)}, &conv, false);
+               if (pos < (ssize_t) strlen(next) || /* includes pos < 0 */ 
ATOMcmp(TYPE_date, conv, ATOMnilptr(TYPE_date)) == 0)
+                       return createException(SQL, "batcalc.str_2_date", 
SQLSTATE(22007) "Date '%s' has incorrect format", next);
+               *ret = *conv;
        }
        return MAL_SUCCEED;
 }
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
@@ -3871,13 +3871,11 @@ exps_merge_select_rse( mvc *sql, list *l
 }
 
 static sql_exp *
-exp_merge_project_rse(visitor *v, sql_rel *rel, sql_exp *e, int depth)
-{
-       mvc *sql = v->sql;
-
+rel_merge_project_rse(visitor *v, sql_rel *rel, sql_exp *e, int depth)
+{
        (void) depth;
-       (void) rel;
-       if (is_func(e->type) && e->l) {
+
+       if (is_simple_project(rel->op) && is_func(e->type) && e->l) {
                list *fexps = e->l;
                sql_subfunc *f = e->f;
 
@@ -3897,27 +3895,28 @@ exp_merge_project_rse(visitor *v, sql_re
                                    ((strcmp(rf->func->base.name, "<=") == 0 || 
strcmp(rf->func->base.name, "<") == 0) && list_length(rfexps) == 2)
                                    && exp_equal(list_fetch(lfexps,0), 
list_fetch(rfexps,0)) == 0) {
                                        sql_exp *ce = list_fetch(lfexps, 0);
-                                       list *types, *ops = sa_list(sql->sa);
+                                       list *types, *ops = sa_list(v->sql->sa);
                                        sql_subfunc *between;
 
                                        append(ops, ce);
                                        append(ops, list_fetch(lfexps, 1));
                                        append(ops, list_fetch(rfexps, 1));
-                                       append(ops, exp_atom_bool(sql->sa, 0)); 
/* non symetrical */
-                                       append(ops, exp_atom_bool(sql->sa, 
lf->func->base.name[1] == '=')); /* left inclusive */
-                                       append(ops, exp_atom_bool(sql->sa, 
rf->func->base.name[1] == '=')); /* right exclusive */
-                                       append(ops, exp_atom_bool(sql->sa, 0)); 
/* nils_false */
-                                       append(ops, exp_atom_bool(sql->sa, 0)); 
/* anti */
-
-                                       types = exp_types(sql->sa, ops);
+                                       append(ops, exp_atom_bool(v->sql->sa, 
0)); /* non symetrical */
+                                       append(ops, exp_atom_bool(v->sql->sa, 
lf->func->base.name[1] == '=')); /* left inclusive */
+                                       append(ops, exp_atom_bool(v->sql->sa, 
rf->func->base.name[1] == '=')); /* right exclusive */
+                                       append(ops, exp_atom_bool(v->sql->sa, 
0)); /* nils_false */
+                                       append(ops, exp_atom_bool(v->sql->sa, 
0)); /* anti */
+
+                                       types = exp_types(v->sql->sa, ops);
                                        /* convert into between */
-                                       between = sql_bind_func_(sql->sa, 
mvc_bind_schema(sql, "sys"), "between", types, F_FUNC);
+                                       between = sql_bind_func_(v->sql->sa, 
mvc_bind_schema(v->sql, "sys"), "between", types, F_FUNC);
                                        if (between) {
-                                               sql_exp *ne = exp_op(sql->sa, 
ops, between);
-
-                                               exp_setname(sql->sa, ne, 
exp_relname(e), exp_name(e));
+                                               sql_exp *ne = 
exp_op(v->sql->sa, ops, between);
+
+                                               exp_setname(v->sql->sa, ne, 
exp_relname(e), exp_name(e));
                                                e = ne;
                                        }
+                                       v->changes++;
                                }
                        }
                }
@@ -3938,10 +3937,10 @@ exp_merge_project_rse(visitor *v, sql_re
  *              y > 1 and y < 20
  * */
 static sql_rel *
-rel_merge_rse(visitor *v, sql_rel *rel)
+rel_merge_select_rse(visitor *v, sql_rel *rel)
 {
        /* only execute once per select */
-       if ((is_select(rel->op) || is_join(rel->op) || is_semi(rel->op)) && 
rel->exps) {
+       if ((is_select(rel->op) || is_join(rel->op) || is_semi(rel->op)) && 
rel->exps && !rel->used) {
                node *n, *o;
                list *nexps = new_exp_list(v->sql->sa);
 
@@ -3955,13 +3954,11 @@ rel_merge_rse(visitor *v, sql_rel *rel)
                                        append(nexps, o->data);
                        }
                }
-               if (list_length(nexps))
-                      for (o = nexps->h; o; o = o->next)
+               if (!list_empty(nexps))
+                       for (o = nexps->h; o; o = o->next)
                                append(rel->exps, o->data);
-       }
-       /* the project case of rse */
-       if (is_project(rel->op) && rel->exps)
-               rel->exps = exps_exp_visitor_bottomup(v, rel, rel->exps, 0, 
&exp_merge_project_rse);
+               rel->used = 1;
+       }
        return rel;
 }
 
@@ -9330,8 +9327,16 @@ optimize_rel(mvc *sql, sql_rel *rel, int
        if ((gp.cnt[op_left] || gp.cnt[op_right] || gp.cnt[op_full]) && /* 
DISABLES CODE */ (0))
                rel = rel_visitor_topdown(&v, rel, &rel_split_outerjoin);
 
-       if (gp.cnt[op_select] || gp.cnt[op_project])
-               rel = rel_visitor_bottomup(&v, rel, &rel_merge_rse);
+       if ((gp.cnt[op_join] ||
+               gp.cnt[op_left] || gp.cnt[op_right] || gp.cnt[op_full] ||
+               gp.cnt[op_semi] || gp.cnt[op_anti] ||
+               gp.cnt[op_select]) && level == 1) { /* only once */
+                       rel = rel_visitor_bottomup(&v, rel, 
&rel_merge_select_rse);
+                       rel = rel_visitor_bottomup(&v, rel, 
&rewrite_reset_used); /* reset used flag, used by rel_merge_select_rse */
+               }
+
+       if (gp.cnt[op_project])
+               rel = rel_exp_visitor_bottomup(&v, rel, &rel_merge_project_rse);
 
        if (gp.cnt[op_select] && gp.cnt[op_join] && /* DISABLES CODE */ (0))
                rel = rel_visitor_topdown(&v, rel, &rel_push_select_down_join);
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
@@ -344,3 +344,11 @@ exp_push_down(mvc *sql, sql_exp *e, sql_
 {
        return _exp_push_down(sql, e, f, t);
 }
+
+sql_rel *
+rewrite_reset_used(visitor *v, sql_rel *rel)
+{
+       (void) v;
+       rel->used = 0;
+       return rel;
+}
diff --git a/sql/server/rel_rewriter.h b/sql/server/rel_rewriter.h
--- a/sql/server/rel_rewriter.h
+++ b/sql/server/rel_rewriter.h
@@ -23,4 +23,6 @@ extern sql_rel *rel_remove_empty_select(
 
 extern sql_exp *exp_push_down(mvc *sql, sql_exp *e, sql_rel *f, sql_rel *t);
 
+extern sql_rel *rewrite_reset_used(visitor *v, sql_rel *rel);
+
 #endif /*_REL_REWRITER_H_*/
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
@@ -3187,6 +3187,7 @@ rel_unnest(mvc *sql, sql_rel *rel)
                rel = rel_visitor_bottomup(&v, rel, &rel_remove_empty_select);
        rel = rel_visitor_bottomup(&v, rel, &_rel_unnest);
        rel = rel_visitor_bottomup(&v, rel, &rewrite_fix_count);        /* fix 
count inside a left join (adds a project (if (cnt IS null) then (0) else (cnt)) 
*/
+       rel = rel_visitor_bottomup(&v, rel, &rewrite_reset_used);       /* 
rewrite_fix_count uses 'used' property from sql_rel, reset it after it's done */
        rel = rel_visitor_bottomup(&v, rel, &rewrite_remove_xp);        /* 
remove crossproducts with project [ atom ] */
        rel = rel_visitor_bottomup(&v, rel, &rewrite_groupings);        /* 
transform group combinations into union of group relations */
        rel = rel_visitor_bottomup(&v, rel, &rewrite_empty_project);
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -38,7 +38,6 @@ timestamp_dbat( sql_dbat *d, int ts)
 {
        while (d->next && d->wtime > ts)
                d = d->next;
-       sql_ref_inc(&d->r);
        return d;
 }
 
@@ -812,7 +811,6 @@ dup_idx(sql_trans *tr, sql_idx *i, sql_i
 static int
 dup_dbat( sql_trans *tr, sql_dbat *obat, sql_dbat *bat, int is_new, int temp)
 {
-       sql_ref_init(&bat->r);
        bat->dbid = obat->dbid;
        bat->cnt = obat->cnt;
        bat->dname = _STRDUP(obat->dname);
@@ -961,7 +959,6 @@ delta_delete_val( sql_dbat *bat, oid rid
 static void
 _destroy_dbat(sql_dbat *bat)
 {
-       assert(bat->r.refcnt == 0);
        if (bat->dname)
                _DELETE(bat->dname);
        if (bat->dbid)
@@ -983,8 +980,6 @@ destroy_dbat(sql_trans *tr, sql_dbat *ba
        (void)tr;
        while(bat) {
                n = bat->next;
-               if (sql_ref_dec(&bat->r) > 0)
-                       return LOG_OK;
                _destroy_dbat(bat);
                bat = n;
        }
@@ -999,12 +994,9 @@ bind_del_data(sql_trans *tr, sql_table *
                sql_dbat *bat = ZNEW(sql_dbat), *obat;
                if(!bat)
                        return LOG_ERR;
-               if (t->data)
-                       destroy_dbat(tr, t->data);
                t->data = bat;
                obat = timestamp_dbat(ot->data, t->base.stime);
                dup_dbat(tr, obat, bat, isNew(ot), isTempTable(t));
-               destroy_dbat(tr, obat);
                t->base.allocated = 1;
        }
        return LOG_OK;
@@ -1078,6 +1070,7 @@ count_col(sql_trans *tr, sql_column *c, 
 {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to