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