Changeset: 79524514d874 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=79524514d874 Modified Files: gdk/gdk_logger.c sql/backends/monet5/rel_bin.c sql/include/sql_relation.h sql/rel.txt sql/server/rel_dump.c sql/server/rel_exp.c sql/server/rel_optimizer.c sql/server/rel_planner.c sql/server/rel_propagate.c sql/server/rel_psm.c sql/server/rel_rel.c sql/server/rel_select.c sql/server/rel_sequence.c sql/server/rel_unnest.c sql/server/rel_updates.c sql/server/sql_partition.c sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.stable.out sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-coalesce-error-message.Bug-6608.stable.err sql/test/analytics/Tests/analytics00.stable.out sql/test/analytics/Tests/analytics01.stable.out sql/test/mergetables/Tests/sqlsmith-exists.sql sql/test/mergetables/Tests/sqlsmith-exists.stable.out sql/test/miscellaneous/Tests/groupby_expressions.stable.err sql/test/subquery/Tests/subquery3.sql sql/test/subquery/Tests/subquery3.stable.err Branch: gdk_tracer Log Message:
Merge with default diffs (truncated from 1711 to 300 lines): diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -80,6 +80,7 @@ #define LOG_DESTROY_ID 14 #define LOG_USE_ID 15 #define LOG_CLEAR_ID 16 +#define LOG_UPDATE_PAX 17 #ifdef NATIVE_WIN32 #define getfilepos _ftelli64 @@ -114,6 +115,7 @@ static const char *log_commands[] = { "LOG_DESTROY_ID", "LOG_USE_ID", "LOG_CLEAR_ID", + "LOG_UPDATE_PAX", }; typedef struct logformat_t { @@ -471,7 +473,7 @@ timestampRead(void *dst, stream *s, size #endif static log_return -log_read_updates(logger *lg, trans *tr, logformat *l, char *name, int tpe, oid id) +log_read_updates(logger *lg, trans *tr, logformat *l, char *name, int tpe, oid id, int pax) { log_bid bid = logger_find_bat(lg, name, tpe, id); BAT *b = BATdescriptor(bid); @@ -576,7 +578,8 @@ log_read_updates(logger *lg, trans *tr, BATtseqbase(r, 0); if (ht == TYPE_void && l->flag == LOG_INSERT) { - for (; res == LOG_OK && l->nr > 0; l->nr--) { + lng nr = l->nr; + for (; res == LOG_OK && nr > 0; nr--) { void *t = rt(tv, lg->log, 1); if (t == NULL) { @@ -602,22 +605,66 @@ log_read_updates(logger *lg, trans *tr, if (hv == NULL) res = LOG_ERR; - for (; res == LOG_OK && l->nr > 0; l->nr--) { - void *h = rh(hv, lg->log, 1); - void *t = rt(tv, lg->log, 1); - - if (h == NULL) - res = LOG_EOF; - else if (t == NULL) { - if (strstr(GDKerrbuf, "malloc") == NULL) + if (!pax) { + lng nr = l->nr; + for (; res == LOG_OK && nr > 0; nr--) { + void *h = rh(hv, lg->log, 1); + void *t = rt(tv, lg->log, 1); + + if (h == NULL) res = LOG_EOF; - else + else if (t == NULL) { + if (strstr(GDKerrbuf, "malloc") == NULL) + res = LOG_EOF; + else + res = LOG_ERR; + } else if (BUNappend(uid, h, true) != GDK_SUCCEED || + BUNappend(r, t, true) != GDK_SUCCEED) res = LOG_ERR; - } else if (BUNappend(uid, h, true) != GDK_SUCCEED || - BUNappend(r, t, true) != GDK_SUCCEED) - res = LOG_ERR; - if (t != tv) - GDKfree(t); + if (t != tv) + GDKfree(t); + } + } else { + char compressed = 0; + lng nr = l->nr; + + if (mnstr_read(lg->log, &compressed, 1, 1) != 1) + return LOG_ERR; + + if (compressed) { + void *h = rh(hv, lg->log, 1); + + assert(uid->ttype == TYPE_void); + if (h == NULL) + res = LOG_EOF; + else { + BATtseqbase(uid, *(oid*)h); + BATsetcount(uid, (BUN) l->nr); + } + } else { + for (; res == LOG_OK && nr > 0; nr--) { + void *h = rh(hv, lg->log, 1); + + if (h == NULL) + res = LOG_EOF; + else if (BUNappend(uid, h, true) != GDK_SUCCEED) + res = LOG_ERR; + } + } + nr = l->nr; + for (; res == LOG_OK && nr > 0; nr--) { + void *t = rt(tv, lg->log, 1); + + if (t == NULL) { + if (strstr(GDKerrbuf, "malloc") == NULL) + res = LOG_EOF; + else + res = LOG_ERR; + } else if (BUNappend(r, t, true) != GDK_SUCCEED) + res = LOG_ERR; + if (t != tv) + GDKfree(t); + } } GDKfree(hv); } @@ -1221,16 +1268,18 @@ logger_readlog(logger *lg, char *filenam if (name == NULL || tr == NULL) err = LOG_EOF; else - err = log_read_updates(lg, tr, &l, name, 0, 0); + err = log_read_updates(lg, tr, &l, name, 0, 0, 0); break; case LOG_INSERT_ID: case LOG_UPDATE_ID: + case LOG_UPDATE_PAX: { + int pax = (l.flag == LOG_UPDATE_PAX); l.flag = (l.flag == LOG_INSERT_ID)?LOG_INSERT:LOG_UPDATE; if (log_read_id(lg, &tpe, &id) != LOG_OK) err = LOG_ERR; else - err = log_read_updates(lg, tr, &l, name, tpe, id); - break; + err = log_read_updates(lg, tr, &l, name, tpe, id, pax); + } break; case LOG_CREATE: if (name == NULL || tr == NULL) err = LOG_EOF; @@ -2908,19 +2957,45 @@ log_delta(logger *lg, BAT *uid, BAT *uva BATiter vi = bat_iterator(uval); gdk_return (*wh) (const void *, stream *, size_t) = BATatoms[TYPE_oid].atomWrite; gdk_return (*wt) (const void *, stream *, size_t) = BATatoms[uval->ttype].atomWrite; - - l.flag = (tpe)?LOG_UPDATE_ID:LOG_UPDATE; + char compress = (tpe && BATtdense(uid)?1:0); + + l.flag = (tpe)?LOG_UPDATE_PAX:LOG_UPDATE; if (log_write_format(lg, &l) != GDK_SUCCEED || (tpe ? log_write_id(lg, tpe, id) : log_write_string(lg, name)) != GDK_SUCCEED) return GDK_FAIL; - - for (p = 0; p < BUNlast(uid) && ok == GDK_SUCCEED; p++) { - const oid id = BUNtoid(uid, p); - const void *val = BUNtail(vi, p); - - ok = wh(&id, lg->log, 1); - if (ok == GDK_SUCCEED) - ok = wt(val, lg->log, 1); + if (l.flag == LOG_UPDATE) { /* old style */ + for (p = 0; p < BUNlast(uid) && ok == GDK_SUCCEED; p++) { + const oid id = BUNtoid(uid, p); + const void *val = BUNtail(vi, p); + + ok = wh(&id, lg->log, 1); + if (ok == GDK_SUCCEED) + ok = wt(val, lg->log, 1); + } + } else { + BATiter ui = bat_iterator(uid); + const oid *id = BUNtail(ui, 0); + + if (mnstr_write(lg->log, &compress, 1, 1) != 1) + return GDK_FAIL; + if (compress) { + oid seq = uid->tseqbase; + ok = wh(&seq, lg->log, 1); + } else { + ok = wh(id, lg->log, (size_t)l.nr); + } + + if (ok == GDK_SUCCEED) { + if (uval->ttype > TYPE_void && uval->ttype < TYPE_str && !isVIEW(uval)) { + const void *val = BUNtail(vi, 0); + ok = wt(val, lg->log, (size_t)l.nr); + } else { + for (p = 0; p < BUNlast(uval) && ok == GDK_SUCCEED; p++) { + const void *val = BUNtail(vi, p); + ok = wt(val, lg->log, 1); + } + } + } } if (lg->debug & 1) diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -756,7 +756,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l sql_exp *re = e->r, *re2 = e->f; /* general predicate, select and join */ - if (get_cmp(e) == cmp_filter) { + if (e->flag == cmp_filter) { list *args; list *ops; node *n; @@ -801,7 +801,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l if (e->flag == cmp_in || e->flag == cmp_notin) { return handle_in_exps(be, e->l, e->r, left, right, grp, ext, cnt, sel, (e->flag == cmp_in), 0); } - if (get_cmp(e) == cmp_or && (!right || right->nrcols == 1)) { + if (e->flag == cmp_or && (!right || right->nrcols == 1)) { sql_subtype *bt = sql_bind_localtype("bit"); list *l = e->l; node *n; @@ -884,7 +884,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l return stmt_project(be, stmt_tinter(be, sel1, sel2), sel1); return stmt_tunion(be, sel1, sel2); } - if (get_cmp(e) == cmp_or && right) { /* join */ + if (e->flag == cmp_or && right) { /* join */ assert(0); } @@ -982,13 +982,13 @@ exp_bin(backend *be, sql_exp *e, stmt *l s = stmt_binop(be, l, r, f); } else if (l->nrcols == 0 && r->nrcols == 0) { sql_subfunc *f = sql_bind_func(sql->sa, sql->session->schema, - compare_func((comp_type)get_cmp(e), is_anti(e)), + compare_func((comp_type)e->flag, is_anti(e)), tail_type(l), tail_type(l), F_FUNC); assert(f); s = stmt_binop(be, l, r, f); } else { /* this can still be a join (as relational algebra and single value subquery results still means joins */ - s = stmt_uselect(be, l, r, (comp_type)get_cmp(e), sel, is_anti(e)); + s = stmt_uselect(be, l, r, (comp_type)e->flag, sel, is_anti(e)); } } } @@ -1473,7 +1473,7 @@ exp2bin_args(backend *be, sql_exp *e, li case e_psm: return args; case e_cmp: - if (get_cmp(e) == cmp_or || get_cmp(e) == cmp_filter) { + if (e->flag == cmp_or || e->flag == cmp_filter) { args = exps2bin_args(be, e->l, args); args = exps2bin_args(be, e->r, args); } else if (e->flag == cmp_in || e->flag == cmp_notin) { @@ -1686,7 +1686,7 @@ rel2bin_table(backend *be, sql_rel *rel, } } } - if (!rel->flag && sub && sub->nrcols) { + if (rel->flag == TABLE_PROD_FUNC && sub && sub->nrcols) { assert(0); list_merge(l, sub->op4.lval, NULL); osub = sub; @@ -1971,8 +1971,8 @@ rel2bin_join(backend *be, sql_rel *rel, prop *p; /* only handle simple joins here */ - if ((exp_has_func(e) && get_cmp(e) != cmp_filter) || - get_cmp(e) == cmp_or || (e->f && e->anti) || + if ((exp_has_func(e) && e->flag != cmp_filter) || + e->flag == cmp_or || (e->f && e->anti) || (e->type == e_cmp && e->flag == cmp_equal && ((rel_find_exp(rel->l, e->l) && rel_find_exp(rel->l, e->r)) || (rel_find_exp(rel->r, e->l) && rel_find_exp(rel->r, e->r)))) ) { @@ -2282,8 +2282,8 @@ rel2bin_semijoin(backend *be, sql_rel *r stmt *s = NULL; /* only handle simple joins here */ - if ((exp_has_func(e) && get_cmp(e) != cmp_filter) || - get_cmp(e) == cmp_or || (e->f && e->anti)) { + if ((exp_has_func(e) && e->flag != cmp_filter) || + e->flag == cmp_or || (e->f && e->anti)) { if (!join && !list_length(lje)) { stmt *l = bin_first_column(be, left); stmt *r = bin_first_column(be, right); diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h --- a/sql/include/sql_relation.h +++ b/sql/include/sql_relation.h @@ -38,31 +38,32 @@ typedef struct expression { void *r; void *f; /* func's and aggr's, also e_cmp may have have 2 arguments */ unsigned int - flag:20, /* EXP_DISTINCT, NO_NIL, cmp types */ + flag:16, /* cmp types, PSM types/level */ card:2, /* card (0 truth value!) (1 atoms) (2 aggr) (3 multi value) */ freevar:4, /* free variable, ie binds to the upper dependent join */ intern:1, anti:1, ascending:1, /* order direction */ nulls_last:1, /* return null after all other rows */ + zero_if_empty:1, /* in case of partial aggregator computation, some aggregators need to return 0 instead of NULL */ + distinct:1, _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list