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