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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list