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

Reply via email to