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