Changeset: 1471c4f087fc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1471c4f087fc
Modified Files:
        gdk/gdk_logger.c
        gdk/gdk_logger.h
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_scenario.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_storage.h
        sql/storage/bat/bat_table.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
        
sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out.Windows
        sql/test/BugTracker-2009/Tests/join_topn.SF-2654133.test
        testing/Mtest.py.in
Branch: unlock
Log Message:

improved handling of deletes


diffs (truncated from 2523 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
@@ -27,13 +27,14 @@ static gdk_return logger_del_bat(logger 
 
 #define LOG_START      0
 #define LOG_END                1
-#define LOG_UPDATE_BULK        2
-#define LOG_UPDATE     3
-#define LOG_CREATE     4
-#define LOG_DESTROY    5
-#define LOG_SEQ                6
-#define LOG_CLEAR      7
-#define LOG_ROW                8 /* per row relative small log entry */
+#define LOG_UPDATE_CONST       2
+#define LOG_UPDATE_BULK        3
+#define LOG_UPDATE     4
+#define LOG_CREATE     5
+#define LOG_DESTROY    6
+#define LOG_SEQ                7
+#define LOG_CLEAR      8
+#define LOG_ROW                9 /* per row relative small log entry */
 
 #ifdef NATIVE_WIN32
 #define getfilepos _ftelli64
@@ -52,6 +53,7 @@ static gdk_return logger_del_bat(logger 
 static const char *log_commands[] = {
        "LOG_START",
        "LOG_END",
+       "LOG_UPDATE_CONST",
        "LOG_UPDATE_BULK",
        "LOG_UPDATE",
        "LOG_CREATE",
@@ -354,7 +356,22 @@ log_read_updates(logger *lg, trans *tr, 
                        }
                }
 
-               if (l->flag == LOG_UPDATE_BULK) {
+               if (l->flag == LOG_UPDATE_CONST) {
+                       if (!mnstr_readLng(lg->input_log, &offset)) {
+                               if (r)
+                                       BBPreclaim(r);
+                               return LOG_ERR;
+                       }
+                       void *t = rt(tv, lg->input_log, 1);
+                       if (t == NULL) {
+                               res = LOG_ERR;
+                       } else {
+                               for(BUN p = 0; p<(BUN) nr; p++) {
+                                       if (r && BUNappend(r, t, true) != 
GDK_SUCCEED)
+                                               res = LOG_ERR;
+                               }
+                       }
+               } else if (l->flag == LOG_UPDATE_BULK) {
                        if (!mnstr_readLng(lg->input_log, &offset)) {
                                if (r)
                                        BBPreclaim(r);
@@ -462,7 +479,8 @@ log_read_updates(logger *lg, trans *tr, 
 
                if (res == LOG_OK) {
                        if (tr_grow(tr) == GDK_SUCCEED) {
-                               tr->changes[tr->nr].type = l->flag;
+                               tr->changes[tr->nr].type =
+                                       
l->flag==LOG_UPDATE_CONST?LOG_UPDATE_BULK:l->flag;
                                tr->changes[tr->nr].nr = pnr;
                                tr->changes[tr->nr].tt = tpe;
                                tr->changes[tr->nr].cid = id;
@@ -1020,6 +1038,7 @@ logger_read_transaction(logger *lg)
                case LOG_SEQ:
                        err = log_read_seq(lg, &l);
                        break;
+               case LOG_UPDATE_CONST:
                case LOG_UPDATE_BULK:
                case LOG_UPDATE:
                        if (tr == NULL)
@@ -2063,6 +2082,48 @@ logger_sequence(logger *lg, int seq, lng
        return 0;
 }
 
+gdk_return
+log_constant(logger *lg, int type, ptr val, log_id id, lng offset, lng cnt)
+{
+       char tpe = find_type(lg, type);
+       gdk_return ok = GDK_SUCCEED;
+       logformat l;
+       lng nr;
+       int is_row = 0;
+
+       if (lg->row_insert_nrcols != 0) {
+               lg->row_insert_nrcols--;
+               is_row = 1;
+       }
+       l.flag = LOG_UPDATE_CONST;
+       l.id = id;
+       nr = cnt;
+
+       if (LOG_DISABLED(lg) || !nr) {
+               /* logging is switched off */
+               return GDK_SUCCEED;
+       }
+
+       gdk_return (*wt) (const void *, stream *, size_t) = 
BATatoms[type].atomWrite;
+
+       if (is_row)
+               l.flag = tpe;
+       if (log_write_format(lg, &l) != GDK_SUCCEED ||
+           (!is_row && !mnstr_writeLng(lg->output_log, nr)) ||
+           (!is_row && mnstr_write(lg->output_log, &tpe, 1, 1) != 1) ||
+           (!is_row && !mnstr_writeLng(lg->output_log, offset)))
+               return GDK_FAIL;
+
+       ok = wt(val, lg->output_log, 1);
+
+       if (lg->debug & 1)
+               fprintf(stderr, "#Logged %d " LLFMT " inserts\n", id, nr);
+
+       if (ok != GDK_SUCCEED)
+               TRC_CRITICAL(GDK, "write failed\n");
+       return ok;
+}
+
 static gdk_return
 internal_log_bat(logger *lg, BAT *b, log_id id, lng offset, lng cnt, int 
sliced)
 {
diff --git a/gdk/gdk_logger.h b/gdk/gdk_logger.h
--- a/gdk/gdk_logger.h
+++ b/gdk/gdk_logger.h
@@ -52,6 +52,7 @@ gdk_export lng logger_changes(logger *lg
 gdk_export int logger_sequence(logger *lg, int seq, lng *id);
 
 /* todo pass the transaction id */
+gdk_export gdk_return log_constant(logger *lg, int type, ptr val, log_id id, 
lng offset, lng cnt);
 gdk_export gdk_return log_bat(logger *lg, BAT *b, log_id id, lng offset, lng 
cnt); /* log slice from b */
 gdk_export gdk_return log_bat_clear(logger *lg, log_id id);
 gdk_export gdk_return log_bat_persists(logger *lg, BAT *b, log_id id);
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
@@ -5347,7 +5347,7 @@ check_for_foreign_key_references(mvc *sq
                                                if (k->t != t && !cascade) {
                                                        node *n = 
t->columns.set->h;
                                                        sql_column *c = n->data;
-                                                       size_t n_rows = 
store->storage_api.count_col(sql->session->tr, c, 1);
+                                                       size_t n_rows = 
store->storage_api.count_col(sql->session->tr, c, 0);
                                                        size_t n_deletes = 
store->storage_api.count_del(sql->session->tr, c->t, 0);
                                                        assert (n_rows >= 
n_deletes);
                                                        if (n_rows - n_deletes 
> 0) {
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -1262,7 +1262,7 @@ mvc_bind_wrap(Client cntxt, MalBlkPtr mb
                                BUN l, h;
                                /* here we align the parts to multiples of 
'BAT_ALIGN', needed for efficient 'msk' slices */
                                psz = cnt ? (cnt / nr_parts) : 0;
-                               psz = ALIGN(psz, BAT_ALIGN);
+                               //psz = ALIGN(psz, BAT_ALIGN);
                                l = part_nr * psz;
                                if (l > cnt)
                                        l = cnt;
@@ -1286,7 +1286,7 @@ mvc_bind_wrap(Client cntxt, MalBlkPtr mb
                                }
                                cnt = BATcount(c);
                                psz = cnt ? (cnt / nr_parts) : 0;
-                               psz = ALIGN(psz, BAT_ALIGN);
+                               //psz = ALIGN(psz, BAT_ALIGN);
                                l = part_nr * psz;
                                if (l > cnt)
                                        l = cnt;
@@ -1603,7 +1603,7 @@ mvc_bind_idxbat_wrap(Client cntxt, MalBl
                                BUN l, h;
                                /* here we align the parts to multiples of 
'BAT_ALIGN', needed for efficient 'msk' slices */
                                psz = cnt ? (cnt / nr_parts) : 0;
-                               psz = ALIGN(psz, BAT_ALIGN);
+                               //psz = ALIGN(psz, BAT_ALIGN);
                                l = part_nr * psz;
                                if (l > cnt)
                                        l = cnt;
@@ -1624,7 +1624,7 @@ mvc_bind_idxbat_wrap(Client cntxt, MalBl
                                }
                                cnt = BATcount(c);
                                psz = cnt ? (cnt / nr_parts) : 0;
-                               psz = ALIGN(psz, BAT_ALIGN);
+                               //psz = ALIGN(psz, BAT_ALIGN);
                                l = part_nr * psz;
                                if (l > cnt)
                                        l = cnt;
@@ -2486,13 +2486,8 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
        sql_trans *tr;
        const char *sname = *getArgReference_str(stk, pci, 2);
        const char *tname = *getArgReference_str(stk, pci, 3);
-
        sql_schema *s;
        sql_table *t;
-       sql_column *c;
-       BAT *tids = NULL;
-       size_t nr, dcnt;
-       oid sb = 0;
 
        *res = bat_nil;
        if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
@@ -2506,82 +2501,17 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
        t = mvc_bind_table(m, s, tname);
        if (t == NULL)
                throw(SQL, "sql.tid", SQLSTATE(42S02) "Table missing 
%s.%s",sname,tname);
-       c = t->columns.set->h->data;
 
        sqlstore *store = m->store;
-       nr = store->storage_api.count_col(tr, c, 0);
+       /* we have full table count, nr of deleted (unused rows) */
+       int part_nr = 0;
+       int nr_parts = 1;
        if (pci->argc == 6) {   /* partitioned version */
-               size_t cnt = nr;
-               int part_nr = *getArgReference_int(stk, pci, 4);
-               int nr_parts = *getArgReference_int(stk, pci, 5);
-
-               nr /= nr_parts;
-               nr = ALIGN(nr, BAT_ALIGN);
-               sb = (oid) (part_nr * nr);
-               if (sb > cnt)
-                       sb = cnt;
-               if (nr_parts == (part_nr + 1))          /* last part gets 
remainder */
-                       nr = (cnt > (part_nr*nr))?cnt - (part_nr * nr):0;       
/* keep rest */
-               if (sb+nr > cnt)
-                       nr = cnt-sb;
+               part_nr = *getArgReference_int(stk, pci, 4);
+               nr_parts = *getArgReference_int(stk, pci, 5);
        }
-
-       /* check if we have deletes, iff get bit msk */
-       if ((dcnt = store->storage_api.count_del(tr, t, 0)) > 0 || 
store->storage_api.count_del(tr, t, 2) > 0) {
-               //setVarType(mb, getArg(pci, 0), 
setCandType(newBatType(TYPE_msk)));
-               BAT *d = store->storage_api.bind_del(tr, t, RDONLY), *bn = NULL;
-
-               if (d) {
-                       bn = BATslice(d, sb, sb+nr);
-                       BBPunfix(d->batCacheid);
-                       d = NULL;
-               }
-               if (bn && store->storage_api.count_del(tr, t, 2) > 0) {
-                       BAT *ui = store->storage_api.bind_del(tr, t, RD_UPD_ID);
-                       BAT *uv = store->storage_api.bind_del(tr, t, 
RD_UPD_VAL);
-                       oid h = sb+nr;
-
-                       h--;
-                       BAT *p = BATselect(ui, NULL, &sb, &h, true, true, 
false);
-                       BAT *nui = NULL, *nuv = NULL;
-
-                       if (p) {
-                               nui = BATproject(p, ui);
-                               nuv = BATproject(p, uv);
-                               BBPunfix(p->batCacheid);
-                       }
-                       if (ui) BBPunfix(ui->batCacheid);
-                       if (uv) BBPunfix(uv->batCacheid);
-
-                       if (!nui || !nuv || BATreplace(bn, nui, nuv, true) != 
GDK_SUCCEED) {
-                               if (bn) BBPunfix(bn->batCacheid);
-                               if (nui) BBPunfix(nui->batCacheid);
-                               if (nuv) BBPunfix(nuv->batCacheid);
-                               throw(MAL, "sql.tids", SQLSTATE(45003) 
"TIDdeletes failed");
-                       }
-                       BBPunfix(nui->batCacheid);
-                       BBPunfix(nuv->batCacheid);
-               }
-               /* true == deleted, need not deleted  */
-               if (bn) {
-                       tids = BATmaskedcands(sb, nr, bn, false);
-                       BBPunfix(bn->batCacheid);
-                       if (tids == NULL) {
-                               throw(MAL, "sql.tids", SQLSTATE(45003) 
"TIDdeletes failed");
-                       }
-                       d = tids;
-               }
-               if(d == NULL)
-                       throw(SQL, "sql.tid", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               *res = d->batCacheid;
-       } else {
-               /* create void,void bat with length and oid's set */
-               tids = BATdense(sb, sb, (BUN) nr);
-               if (tids == NULL)
-                       throw(SQL, "sql.tid", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               *res = tids->batCacheid;
-       }
-
+       BAT *b = store->storage_api.bind_cands(tr, t, nr_parts, part_nr);
+       *res = b->batCacheid;
        BBPkeepref(*res);
        return msg;
 }
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -365,7 +365,7 @@ SQLresetClient(Client c)
        return msg;
 }
 
-MT_Id sqllogthread, idlethread;
+MT_Id sqllogthread;
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to