Changeset: 46ebe7af2dcb for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=46ebe7af2dcb Modified Files: monetdb5/modules/mal/remote.c sql/storage/bat/bat_storage.c sql/storage/bat/bat_table.c sql/test/BugTracker-2016/Tests/RELEASE_SAVEPOINT_after_UPDATE_crash.Bug-4010.stable.err Branch: no-wrd Log Message:
Merge with default branch. diffs (202 lines): diff --git a/monetdb5/modules/mal/remote.c b/monetdb5/modules/mal/remote.c --- a/monetdb5/modules/mal/remote.c +++ b/monetdb5/modules/mal/remote.c @@ -70,7 +70,7 @@ #ifdef HAVE_MAPI static connection conns = NULL; -static unsigned char localtype = 0; +static unsigned char localtype = 0177; static inline str RMTquery(MapiHdl *ret, str func, Mapi conn, str query); static inline str RMTinternalcopyfrom(BAT **ret, char *hdr, stream *in); @@ -495,7 +495,7 @@ str RMTget(Client cntxt, MalBlkPtr mb, M } GDKfree(rt); - if (isaBatType(rtype) && (localtype == 0 || localtype != c->type )) + if (isaBatType(rtype) && (localtype == 0177 || localtype != c->type )) { int t, s; ptr r; @@ -528,7 +528,7 @@ str RMTget(Client cntxt, MalBlkPtr mb, M if (ATOMvarsized(t)) { while (mapi_fetch_row(mhdl)) { - var = mapi_fetch_field(mhdl, 0); + var = mapi_fetch_field(mhdl, 1); if( var == NULL) BUNappend(b, str_nil, FALSE); else @@ -536,7 +536,7 @@ str RMTget(Client cntxt, MalBlkPtr mb, M } } else while (mapi_fetch_row(mhdl)) { - var = mapi_fetch_field(mhdl, 0); + var = mapi_fetch_field(mhdl, 1); if (var == NULL) var = "nil"; s = 0; @@ -679,12 +679,12 @@ str RMTput(Client cntxt, MalBlkPtr mb, M msg = createException(MAL, "remote.put", "unsupported type: %s", tpe); GDKfree(tpe); return msg; - } else if (isaBatType(type) && *(int*) value != 0) { + } else if (isaBatType(type) && *(bat*) value != 0) { BATiter bi; /* naive approach using bat.new() and bat.insert() calls */ char *tail; char qbuf[BUFSIZ]; - int bid; + bat bid; BAT *b = NULL; BUN p, q; str tailv; @@ -692,7 +692,7 @@ str RMTput(Client cntxt, MalBlkPtr mb, M tail = getTypeIdentifier(getColumnType(type)); - bid = *(int *)value; + bid = *(bat *)value; if (bid != 0) { if ((b = BATdescriptor(bid)) == NULL){ MT_lock_unset(&c->lock); 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 @@ -1686,7 +1686,7 @@ gtr_update_delta( sql_trans *tr, sql_del } bat_destroy(ins); - if (cbat->ucnt) { + if (cbat->ucnt && cbat->uibid) { BAT *ui = temp_descriptor(cbat->uibid); BAT *uv = temp_descriptor(cbat->uvbid); /* any updates */ @@ -1945,7 +1945,7 @@ tr_update_delta( sql_trans *tr, sql_delt } bat_destroy(ins); - if (cbat->ucnt || cleared) { + if ((cbat->ucnt || cleared) && cbat->uibid) { BAT *ui = temp_descriptor(cbat->uibid); BAT *uv = temp_descriptor(cbat->uvbid); @@ -2144,6 +2144,11 @@ update_table(sql_trans *tr, sql_table *f } else if (tt->data && ft->base.allocated) { tr_update_dbat(tr, tt->data, ft->data, ft->cleared); } else if (store_nr_active == 1 && !ft->base.allocated) { + if (!tt->data && tt->po) { + sql_table *ot = tr_find_table(tr->parent, tt); + tt->data = timestamp_dbat(ot->data, tr->stime); + } + assert(tt->data); tr_merge_dbat(tr, tt->data); ft->data = NULL; } else if (ft->data) { @@ -2179,6 +2184,11 @@ update_table(sql_trans *tr, sql_table *f } else if (oc->data && cc->base.allocated) { tr_update_delta(tr, oc->data, cc->data, cc->unique == 1); } else if (store_nr_active == 1 && !cc->base.allocated) { + if (!oc->data) { + sql_column *o = tr_find_column(tr->parent, oc); + oc->data = timestamp_delta(o->data, tr->stime); + } + assert(oc->data); tr_merge_delta(tr, oc->data, oc->unique == 1); cc->data = NULL; } else if (cc->data) { @@ -2239,6 +2249,11 @@ update_table(sql_trans *tr, sql_table *f } else if (oi->data && ci->base.allocated) { tr_update_delta(tr, oi->data, ci->data, 0); } else if (store_nr_active == 1 && !ci->base.allocated) { + if (!oi->data) { + sql_idx *o = tr_find_idx(tr->parent, oi); + oi->data = timestamp_delta(o->data, tr->stime); + } + assert(oi->data); tr_merge_delta(tr, oi->data, 0); ci->data = NULL; } else if (ci->data) { @@ -2294,7 +2309,7 @@ tr_log_delta( sql_trans *tr, sql_delta * } bat_destroy(ins); - if (cbat->ucnt) { + if (cbat->ucnt && cbat->uibid) { BAT *ui = temp_descriptor(cbat->uibid); BAT *uv = temp_descriptor(cbat->uvbid); /* any updates */ diff --git a/sql/storage/bat/bat_table.c b/sql/storage/bat/bat_table.c --- a/sql/storage/bat/bat_table.c +++ b/sql/storage/bat/bat_table.c @@ -142,7 +142,37 @@ full_destroy(sql_column *c, BAT *b) bat_destroy(b); } -static oid column_find_row(sql_trans *tr, sql_column *c, const void *value, ...); +static oid +column_find_oid(sql_trans *tr, sql_column *c, const int *vid) +{ + BAT *b = NULL, *s = NULL; + oid rid = oid_nil; + + b = full_column(tr, c); + if (!b) + return oid_nil; + + if (store_funcs.count_del(tr, c->t)) + s = store_funcs.bind_del(tr, c->t, RD_INS); + + if (BAThash(b, 0) == GDK_SUCCEED) { + BATiter cni = bat_iterator(b); + BUN p; + + HASHloop(cni, cni.b->T->hash, p, vid) { + oid pos = p; + + if (!s || BUNfnd(s, &pos) == BUN_NONE) { + rid = p; + break; + } + } + } + if (s) + bat_destroy(s); + return rid; +} + static oid column_find_row(sql_trans *tr, sql_column *c, const void *value, ...) { @@ -151,14 +181,17 @@ column_find_row(sql_trans *tr, sql_colum oid rid = oid_nil; sql_column *n = NULL; + va_start(va, value); + if ((n = va_arg(va, sql_column *)) == NULL && c->type.type->localtype ==TYPE_int) + return column_find_oid(tr, c, value); + s = delta_cands(tr, c->t); if (!s) return oid_nil; - va_start(va, value); b = full_column(tr, c); if (!b) return oid_nil; - if ((n = va_arg(va, sql_column *)) == NULL) { + if (!n) { if (BAThash(b, 0) == GDK_SUCCEED) { BATiter cni = bat_iterator(b); BUN p; diff --git a/sql/test/BugTracker-2016/Tests/RELEASE_SAVEPOINT_after_UPDATE_crash.Bug-4010.stable.err b/sql/test/BugTracker-2016/Tests/RELEASE_SAVEPOINT_after_UPDATE_crash.Bug-4010.stable.err --- a/sql/test/BugTracker-2016/Tests/RELEASE_SAVEPOINT_after_UPDATE_crash.Bug-4010.stable.err +++ b/sql/test/BugTracker-2016/Tests/RELEASE_SAVEPOINT_after_UPDATE_crash.Bug-4010.stable.err @@ -30,6 +30,7 @@ stderr of test 'RELEASE_SAVEPOINT_after_ MAPI = (monetdb) /var/tmp/mtest-27142/.s.monetdb.39308 QUERY = DROP TABLE t; +ERROR = !DROP TABLE: no such table 't' # 16:19:12 > _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list