Changeset: 411c2c2b849a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/411c2c2b849a Modified Files: sql/include/sql_catalog.h sql/storage/bat/bat_storage.c sql/storage/store.c Branch: iso Log Message:
merged with jul2021 diffs (truncated from 719 to 300 lines): diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -2358,7 +2358,7 @@ decref(bat i, bool logical, bool release } } } - if (b && b->batCount > b->batInserted) { + if (b && b->batCount > b->batInserted && !isVIEW(b)) { /* if batCount is larger than batInserted and the dirty * bits are off, it may be that a (sub)commit happened * in parallel to an update; we must undo the turning diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c --- a/gdk/gdk_hash.c +++ b/gdk/gdk_hash.c @@ -1069,7 +1069,7 @@ HASHprobe(const Hash *h, const void *v) } } -inline void +void HASHappend_locked(BAT *b, BUN i, const void *v) { Hash *h = b->thash; @@ -1140,7 +1140,7 @@ HASHappend(BAT *b, BUN i, const void *v) } /* insert value v at position p into the hash table of b */ -inline void +void HASHinsert_locked(BAT *b, BUN p, const void *v) { Hash *h = b->thash; @@ -1223,7 +1223,7 @@ HASHinsert(BAT *b, BUN p, const void *v) } /* delete value v at position p from the hash table of b */ -inline void +void HASHdelete_locked(BAT *b, BUN p, const void *v) { Hash *h = b->thash; diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -168,9 +168,6 @@ gdk_return GDKunlink(int farmid, const c __attribute__((__visibility__("hidden"))); void HASHappend(BAT *b, BUN i, const void *v) __attribute__((__visibility__("hidden"))); -#ifdef _MSC_VER -inline -#endif void HASHappend_locked(BAT *b, BUN i, const void *v) __attribute__((__visibility__("hidden"))); void HASHfree(BAT *b) @@ -179,16 +176,10 @@ bool HASHgonebad(BAT *b, const void *v) __attribute__((__visibility__("hidden"))); void HASHdelete(BAT *b, BUN p, const void *v) __attribute__((__visibility__("hidden"))); -#ifdef _MSC_VER -inline -#endif void HASHdelete_locked(BAT *b, BUN p, const void *v) __attribute__((__visibility__("hidden"))); void HASHinsert(BAT *b, BUN p, const void *v) __attribute__((__visibility__("hidden"))); -#ifdef _MSC_VER -inline -#endif void HASHinsert_locked(BAT *b, BUN p, const void *v) __attribute__((__visibility__("hidden"))); BUN HASHmask(BUN cnt) diff --git a/sql/common/sql_changeset.c b/sql/common/sql_changeset.c --- a/sql/common/sql_changeset.c +++ b/sql/common/sql_changeset.c @@ -32,21 +32,21 @@ cs_destroy(changeset * cs, void *data) } void -cs_add(changeset * cs, void *elm, int flags) +cs_add(changeset * cs, void *elm, bool isnew) { if (!cs->set) cs->set = list_new(cs->sa, cs->destroy); list_append(cs->set, elm); - if (newFlagSet(flags) && !cs->nelm) + if (isnew && !cs->nelm) cs->nelm = cs->set->t; } void -cs_del(changeset * cs, void *gdata, node *elm, int flags) +cs_del(changeset * cs, void *gdata, node *elm, bool isnew) { if (cs->nelm == elm) cs->nelm = elm->next; - if (newFlagSet(flags)) { /* remove just added */ + if (isnew) { /* remove just added */ list_remove_node(cs->set, gdata, elm); } else { if (!cs->dset) diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c --- a/sql/common/sql_types.c +++ b/sql/common/sql_types.c @@ -156,11 +156,11 @@ bool is_commutative(const char *fnm) } void -base_init(sql_allocator *sa, sql_base * b, sqlid id, int flags, const char *name) +base_init(sql_allocator *sa, sql_base * b, sqlid id, bool isnew, const char *name) { *b = (sql_base) { .id = id, - .flags = flags, + .new = isnew, .refcnt = 1, .name = (name) ? SA_STRDUP(sa, name) : NULL, }; @@ -603,7 +603,7 @@ sql_create_type(sql_allocator *sa, const { sql_type *t = SA_ZNEW(sa, sql_type); - base_init(sa, &t->base, local_id++, 0, sqlname); + base_init(sa, &t->base, local_id++, false, sqlname); t->impl = sa_strdup(sa, impl); t->digits = digits; t->scale = scale; @@ -653,7 +653,7 @@ sql_create_func_(sql_allocator *sa, cons } if (res) fres = create_arg(sa, NULL, sql_create_subtype(sa, res, 0, 0), ARG_OUT); - base_init(sa, &t->base, local_id++, 0, name); + base_init(sa, &t->base, local_id++, false, name); t->imp = sa_strdup(sa, imp); t->mod = sa_strdup(sa, mod); diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h --- a/sql/include/sql_catalog.h +++ b/sql/include/sql_catalog.h @@ -87,9 +87,6 @@ typedef enum sql_dependency { #define INOUT 6 /* output type equals input type */ #define SCALE_EQ 7 /* user defined functions need equal scales */ -/* Warning TR flags is a bitmask */ -#define TR_NEW 1 - #define RDONLY 0 #define RD_INS 1 #define RD_UPD_ID 2 @@ -196,20 +193,17 @@ typedef int sqlid; typedef void *sql_store; typedef struct sql_base { - int flags; /* todo change into bool new */ - unsigned char + unsigned int new:1, - deleted:1; - int refcnt; + deleted:1, + refcnt:30; sqlid id; char *name; } sql_base; -#define newFlagSet(x) (((x) & TR_NEW) == TR_NEW) -#define removeNewFlag(x) ((x)->base.flags &= ~TR_NEW) -#define isNew(x) (newFlagSet((x)->base.flags)) +#define isNew(x) ((x)->base.new) -extern void base_init(sql_allocator *sa, sql_base * b, sqlid id, int flags, const char *name); +extern void base_init(sql_allocator *sa, sql_base * b, sqlid id, bool isnew, const char *name); typedef struct changeset { sql_allocator *sa; @@ -275,8 +269,8 @@ extern node *ol_rehash(objlist *ol, cons extern void cs_new(changeset * cs, sql_allocator *sa, fdestroy destroy); extern void cs_destroy(changeset * cs, void *data); -extern void cs_add(changeset * cs, void *elm, int flag); -extern void cs_del(changeset * cs, void *gdata, node *elm, int flag); +extern void cs_add(changeset * cs, void *elm, bool isnew); +extern void cs_del(changeset * cs, void *gdata, node *elm, bool isnew); extern int cs_size(changeset * cs); extern node *cs_find_id(changeset * cs, sqlid id); diff --git a/sql/server/sql_qc.c b/sql/server/sql_qc.c --- a/sql/server/sql_qc.c +++ b/sql/server/sql_qc.c @@ -158,7 +158,7 @@ qc_insert(qc *cache, sql_allocator *sa, .ops = params, .res = res, }; - base_init(sa, &f->base, 0, TR_NEW, NULL); + base_init(sa, &f->base, 0, true, NULL); f->base.new = 1; f->base.id = n->id; f->base.name = f->imp = name; 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 @@ -969,6 +969,16 @@ cs_update_bat( sql_trans *tr, column_sto if (!otids) return LOG_ERR; } + if (updates && (updates->ttype == TYPE_msk || mask_cand(updates))) { + oupdates = BATunmask(updates); + if (!oupdates) + return LOG_ERR; + } + if (updates && updates->ttype == TYPE_void) { /* dense later use optimized log structure */ + oupdates = COLcopy(updates, TYPE_oid, true /* make sure we get a oid col */, TRANSIENT); + if (!oupdates) + return LOG_ERR; + } /* When we go to smaller grained update structures we should check for concurrent updates on this column ! */ /* currently only one update delta is possible */ lock_table(tr->store, t->base.id); @@ -985,8 +995,11 @@ cs_update_bat( sql_trans *tr, column_sto if (otids != tids) bat_destroy(otids); otids = sorted; - oupdates = BATproject(order, oupdates); + BAT *noupdates = BATproject(order, oupdates); bat_destroy(order); + if (oupdates != updates) + bat_destroy(oupdates); + oupdates = noupdates; if (!oupdates) { bat_destroy(otids); unlock_table(tr->store, t->base.id); @@ -1255,6 +1268,7 @@ cs_update_val( sql_trans *tr, column_sto if (cs_real_update_bats(cs, &ui, &uv) != LOG_OK) return LOG_ERR; + assert(uv->ttype); assert(BATcount(ui) == BATcount(uv)); if (BUNappend(ui, (ptr) &rid, true) != GDK_SUCCEED || BUNappend(uv, (ptr) upd, true) != GDK_SUCCEED) { @@ -2187,7 +2201,7 @@ static int commit_create_col_( sql_trans *tr, sql_column *c, ulng commit_ts, ulng oldest) { int ok = LOG_OK; - (void)tr; (void)oldest; + (void)oldest; if(!isTempTable(c->t)) { sql_delta *delta = ATOMIC_PTR_GET(&c->data); @@ -2198,7 +2212,8 @@ commit_create_col_( sql_trans *tr, sql_c if (!delta->cs.alter) ok = merge_delta(delta); delta->cs.alter = 0; - c->base.flags = 0; + if (!tr->parent) + c->base.new = 0; } return ok; } @@ -2207,7 +2222,8 @@ static int commit_create_col( sql_trans *tr, sql_change *change, ulng commit_ts, ulng oldest) { sql_column *c = (sql_column*)change->obj; - c->base.flags = 0; + if (!tr->parent) + c->base.new = 0; return commit_create_col_( tr, c, commit_ts, oldest); } @@ -2287,7 +2303,7 @@ static int commit_create_idx_( sql_trans *tr, sql_idx *i, ulng commit_ts, ulng oldest) { int ok = LOG_OK; - (void)tr; (void)oldest; + (void)oldest; if(!isTempTable(i->t)) { sql_delta *delta = ATOMIC_PTR_GET(&i->data); @@ -2296,7 +2312,8 @@ commit_create_idx_( sql_trans *tr, sql_i assert(delta->next == NULL); ok = merge_delta(delta); - i->base.flags = 0; + if (!tr->parent) + i->base.new = 0; } return ok; } @@ -2305,7 +2322,8 @@ static int commit_create_idx( sql_trans *tr, sql_change *change, ulng commit_ts, ulng oldest) { sql_idx *i = (sql_idx*)change->obj; - i->base.flags = 0; + if (!tr->parent) + i->base.new = 0; return commit_create_idx_(tr, i, commit_ts, oldest); } @@ -2514,10 +2532,12 @@ commit_create_del( sql_trans *tr, sql_ch ok = commit_create_idx_(tr, i, commit_ts, oldest); } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list