Changeset: 5f8e2e0f6c80 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5f8e2e0f6c80 Modified Files: sql/backends/monet5/sql.c sql/backends/monet5/sql_scenario.c sql/storage/bat/bat_storage.c sql/storage/store.c Branch: Oct2020 Log Message:
merged with Jun2020 diffs (264 lines): 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 @@ -1597,7 +1597,7 @@ str mvc_append_column(sql_trans *t, sql_column *c, BAT *ins) { int res = store_funcs.append_col(t, c, ins, TYPE_bat); - if (res != 0) + if (res != LOG_OK) throw(SQL, "sql.append", SQLSTATE(42000) "Cannot append values"); return MAL_SUCCEED; } @@ -1653,7 +1653,7 @@ mvc_append_wrap(Client cntxt, MalBlkPtr const char *tname = *getArgReference_str(stk, pci, 3); const char *cname = *getArgReference_str(stk, pci, 4); ptr ins = getArgReference(stk, pci, 5); - int tpe = getArgType(mb, pci, 5); + int tpe = getArgType(mb, pci, 5), err = 0; sql_schema *s; sql_table *t; sql_column *c; @@ -1688,12 +1688,15 @@ mvc_append_wrap(Client cntxt, MalBlkPtr if( b && BATcount(b) > 4096 && !b->batTransient) BATmsync(b); if (cname[0] != '%' && (c = mvc_bind_column(m, t, cname)) != NULL) { - store_funcs.append_col(m->session->tr, c, ins, tpe); + if (store_funcs.append_col(m->session->tr, c, ins, tpe) != LOG_OK) + err = 1; } else if (cname[0] == '%') { sql_idx *i = mvc_bind_idx(m, s, cname + 1); - if (i) - store_funcs.append_idx(m->session->tr, i, ins, tpe); - } + if (i && store_funcs.append_idx(m->session->tr, i, ins, tpe) != LOG_OK) + err = 1; + } + if (err) + throw(SQL, "sql.append", SQLSTATE(42S02) "append failed"); if (b) { BBPunfix(b->batCacheid); } @@ -1713,7 +1716,7 @@ mvc_update_wrap(Client cntxt, MalBlkPtr bat Tids = *getArgReference_bat(stk, pci, 5); bat Upd = *getArgReference_bat(stk, pci, 6); BAT *tids, *upd; - int tpe = getArgType(mb, pci, 6); + int tpe = getArgType(mb, pci, 6), err = 0; sql_schema *s; sql_table *t; sql_column *c; @@ -1755,14 +1758,17 @@ mvc_update_wrap(Client cntxt, MalBlkPtr if( tids && BATcount(tids) > 4096 && !tids->batTransient) BATmsync(tids); if (cname[0] != '%' && (c = mvc_bind_column(m, t, cname)) != NULL) { - store_funcs.update_col(m->session->tr, c, tids, upd, TYPE_bat); + if (store_funcs.update_col(m->session->tr, c, tids, upd, TYPE_bat) != LOG_OK) + err = 1; } else if (cname[0] == '%') { sql_idx *i = mvc_bind_idx(m, s, cname + 1); - if (i) - store_funcs.update_idx(m->session->tr, i, tids, upd, TYPE_bat); + if (i && store_funcs.update_idx(m->session->tr, i, tids, upd, TYPE_bat) != LOG_OK) + err = 1; } BBPunfix(tids->batCacheid); BBPunfix(upd->batCacheid); + if (err) + throw(SQL, "sql.update", SQLSTATE(42S02) "update failed"); return MAL_SUCCEED; } @@ -1789,6 +1795,8 @@ mvc_clear_table_wrap(Client cntxt, MalBl if (t == NULL) throw(SQL, "sql.clear_table", SQLSTATE(42S02) "Table missing %s.%s", sname,tname); *res = mvc_clear_table(m, t); + if (*res == BUN_NONE) + throw(SQL, "sql.clear_table", SQLSTATE(42S02) "clear failed"); return MAL_SUCCEED; } @@ -1836,7 +1844,8 @@ mvc_delete_wrap(Client cntxt, MalBlkPtr } if( b && BATcount(b) > 4096 && !b->batTransient) BATmsync(b); - store_funcs.delete_tab(m->session->tr, t, b, tpe); + if (store_funcs.delete_tab(m->session->tr, t, b, tpe) != LOG_OK) + throw(SQL, "sql.delete", SQLSTATE(3F000) "delete failed"); if (b) BBPunfix(b->batCacheid); return MAL_SUCCEED; @@ -4061,7 +4070,7 @@ vacuum(Client cntxt, MalBlkPtr mb, MalSt bat bid; BAT *b, *del; node *o; - int i, bids[2049]; + int i, bids[2049], err = 0; if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL) return msg; @@ -4126,17 +4135,21 @@ vacuum(Client cntxt, MalBlkPtr mb, MalSt } BBPunfix(del->batCacheid); - mvc_clear_table(m, t); + if (mvc_clear_table(m, t) == BUN_NONE) + throw(SQL, name, SQLSTATE(42000) "vacumm: clear failed"); for (o = t->columns.set->h, i = 0; o; o = o->next, i++) { sql_column *c = o->data; BAT *ins = BATdescriptor(bids[i]); /* use the insert bat */ if( ins){ - store_funcs.append_col(tr, c, ins, TYPE_bat); + if (store_funcs.append_col(tr, c, ins, TYPE_bat) != LOG_OK) + err = 1; BBPunfix(ins->batCacheid); } BBPrelease(bids[i]); } + if (err) + throw(SQL, name, SQLSTATE(42000) "vacuum: reappend failed"); /* TODO indices */ return MAL_SUCCEED; } 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 @@ -792,6 +792,8 @@ SQLreader(Client c) go = msg == MAL_SUCCEED; commit_done = true; } + if (m->session->tr && m->session->tr->active) + c->idle = 0; if (go && in->pos >= in->len) { ssize_t rd; diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c --- a/sql/storage/bat/bat_storage.c +++ b/sql/storage/bat/bat_storage.c @@ -2024,7 +2024,7 @@ static BUN clear_col(sql_trans *tr, sql_column *c) { if (bind_col_data(tr, c) == LOG_ERR) - return 0; + return BUN_NONE; c->t->s->base.wtime = c->t->base.wtime = c->base.wtime = tr->wstime; if (c->data) return clear_delta(tr, c->data); @@ -2037,7 +2037,7 @@ clear_idx(sql_trans *tr, sql_idx *i) if (!isTable(i->t) || (hash_index(i->type) && list_length(i->columns) <= 1) || !idx_has_column(i->type)) return 0; if (bind_idx_data(tr, i) == LOG_ERR) - return 0; + return BUN_NONE; i->t->s->base.wtime = i->t->base.wtime = i->base.wtime = tr->wstime; if (i->data) return clear_delta(tr, i->data); @@ -2076,7 +2076,7 @@ clear_del(sql_trans *tr, sql_table *t) { if (bind_del_data(tr, t) == LOG_ERR) - return 0; + return BUN_NONE; t->s->base.wtime = t->base.wtime = tr->wstime; return clear_dbat(tr, t->data); } @@ -2771,9 +2771,11 @@ update_table(sql_trans *tr, sql_table *f oc->data = timestamp_delta(o->data, oc->base.stime); } assert(oc->data); - if (tr_merge_delta(tr, oc->data, oc->unique == 1) != LOG_OK) - ok = LOG_ERR; - cc->data = NULL; + if (cc->base.wtime) { + if (tr_merge_delta(tr, oc->data, oc->unique == 1) != LOG_OK) + ok = LOG_ERR; + cc->data = NULL; + } } else if (cc->data) { tr_handle_snapshot(tr, cc->data); oc->data = cc->data; @@ -2852,9 +2854,11 @@ update_table(sql_trans *tr, sql_table *f oi->data = timestamp_delta(o->data, oi->base.stime); } assert(oi->data); - if (tr_merge_delta(tr, oi->data, 0) != LOG_OK) - ok = LOG_ERR; - ci->data = NULL; + if (ci->base.wtime) { + if (tr_merge_delta(tr, oi->data, 0) != LOG_OK) + ok = LOG_ERR; + ci->data = NULL; + } } else if (ci->data) { tr_handle_snapshot(tr, ci->data); oi->data = ci->data; diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -37,6 +37,7 @@ store_type active_store_type = store_bat int store_readonly = 0; int store_singleuser = 0; int store_initialized = 0; +int store_debug = 0; store_functions store_funcs; table_functions table_funcs; @@ -2076,6 +2077,7 @@ store_init(sql_allocator *pa, int debug, store_readonly = readonly; store_singleuser = singleuser; + store_debug = debug; MT_lock_set(&bs_lock); @@ -6513,28 +6515,34 @@ sql_trans_clear_table(sql_trans *tr, sql { node *n = t->columns.set->h; sql_column *c = n->data; - BUN sz = 0; + BUN sz = 0, nsz = 0; t->cleared = 1; t->base.wtime = t->s->base.wtime = tr->wtime = tr->wstime; c->base.wtime = tr->wstime; - sz += store_funcs.clear_col(tr, c); - sz -= store_funcs.clear_del(tr, t); + if ((nsz = store_funcs.clear_col(tr, c)) == BUN_NONE) + return BUN_NONE; + sz += nsz; + if ((nsz = store_funcs.clear_del(tr, t)) == BUN_NONE) + return BUN_NONE; + sz -= nsz; for (n = n->next; n; n = n->next) { c = n->data; c->base.wtime = tr->wstime; - (void)store_funcs.clear_col(tr, c); + if (store_funcs.clear_col(tr, c) == BUN_NONE) + return BUN_NONE; } if (t->idxs.set) { for (n = t->idxs.set->h; n; n = n->next) { sql_idx *ci = n->data; ci->base.wtime = tr->wstime; - if (isTable(ci->t) && idx_has_column(ci->type)) - (void)store_funcs.clear_idx(tr, ci); + if (isTable(ci->t) && idx_has_column(ci->type) && + store_funcs.clear_idx(tr, ci) == BUN_NONE) + return BUN_NONE; } } return sz; @@ -7611,7 +7619,7 @@ sql_trans_begin(sql_session *s) int snr = tr->schema_number; /* add wait when flush is realy needed */ - while (ATOMIC_GET(&flusher.flush_now)) { + while ((store_debug&16)==16 && ATOMIC_GET(&flusher.flush_now)) { MT_lock_unset(&bs_lock); MT_sleep_ms(sleeptime); MT_lock_set(&bs_lock); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list