Changeset: 1e56d65707c3 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1e56d65707c3 Modified Files: buildtools/autogen/autogen/msc.py monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows 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_table.c sql/storage/sql_storage.h sql/storage/store.c Branch: default Log Message:
Merge with Dec2016 branch. diffs (truncated from 410 to 300 lines): diff --git a/buildtools/autogen/autogen/msc.py b/buildtools/autogen/autogen/msc.py --- a/buildtools/autogen/autogen/msc.py +++ b/buildtools/autogen/autogen/msc.py @@ -334,7 +334,7 @@ def msc_dep(fd, tar, deplist, msc): if target == "LIB": d, dext = split_filename(deplist[0]) if dext in ("c", "yy.c", "tab.c"): - fd.write('\t$(CC) $(CFLAGS) $(%s_CFLAGS) $(GENDLL) -D_CRT_SECURE_NO_WARNINGS -DLIB%s -Fo"%s" -c "%s"\n' % + fd.write('\t$(CC) $(CFLAGS) $(%s_CFLAGS) $(GENDLL) -D_CRT_SECURE_NO_WARNINGS -DLIB%s "-Fo%s" -c "%s"\n' % (split_filename(msc_basename(src))[0], name, t, src)) if ext == 'res': fd.write("\t$(RC) -fo%s %s\n" % (t, src)) diff --git a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows --- a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows +++ b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows @@ -61,16 +61,16 @@ Ready. % .explain # table_name % mal # name % clob # type -% 129 # length +% 149 # length function user.s8_1():void; - X_38:void := querylog.define("explain copy into ttt from \\'a:\\\\tmp/xyz\\';","default_pipe",10); - X_0 := sql.mvc(); - (X_21:bat[:int],X_22:bat[:int],X_23:bat[:int]) := sql.copy_from(nil,"|","\\n",nil:str,"null","a:\\tmp/xyz",-1,0,0,0,nil:str); - X_25 := sql.append(X_0,"sys","ttt","a",X_21); - X_30 := sql.append(X_25,"sys","ttt","b",X_22); - X_33 := sql.append(X_30,"sys","ttt","c",X_23); - X_35 := aggr.count(X_23); - sql.affectedRows(X_33,X_35); + X_0:void := querylog.define("explain copy into ttt from \\'a:\\\\tmp/xyz\\';","default_pipe",4:int); + X_3 := sql.mvc(); + (X_24:bat[:int],X_25:bat[:int],X_26:bat[:int]) := sql.copy_from(nil:ptr,"|","\\n",nil:str,"null","a:\\tmp/xyz",-1:lng,0:lng,0:int,0:int,nil:str); + X_28 := sql.append(X_3,"sys","ttt","a",X_24); + X_33 := sql.append(X_28,"sys","ttt","b",X_25); + X_36 := sql.append(X_33,"sys","ttt","c",X_26); + X_38 := aggr.count(X_26); + sql.affectedRows(X_36,X_38); end user.s8_1; #inline actions= 0 time=1 usec #remap actions= 0 time=5 usec @@ -115,16 +115,16 @@ end user.s8_1; % .explain # table_name % mal # name % clob # type -% 128 # length +% 148 # length function user.s24_1():void; - X_38:void := querylog.define("explain copy into ttt from \\'Z:/tmp/xyz\\';","user_1",10); - X_0 := sql.mvc(); - (X_21:bat[:int],X_22:bat[:int],X_23:bat[:int]) := sql.copy_from(nil,"|","\\n",nil:str,"null","Z:/tmp/xyz",-1,0,0,0,nil:str); - X_25 := sql.append(X_0,"sys","ttt","a",X_21); - X_30 := sql.append(X_25,"sys","ttt","b",X_22); - X_35 := aggr.count(X_23); - X_33 := sql.append(X_30,"sys","ttt","c",X_23); - sql.affectedRows(X_33,X_35); + X_0:void := querylog.define("explain copy into ttt from \\'Z:/tmp/xyz\\';","user_1",4:int); + X_3 := sql.mvc(); + (X_24:bat[:int],X_25:bat[:int],X_26:bat[:int]) := sql.copy_from(nil:ptr,"|","\\n",nil:str,"null","Z:/tmp/xyz",-1:lng,0:lng,0:int,0:int,nil:str); + X_28 := sql.append(X_3,"sys","ttt","a",X_24); + X_33 := sql.append(X_28,"sys","ttt","b",X_25); + X_38 := aggr.count(X_26); + X_36 := sql.append(X_33,"sys","ttt","c",X_26); + sql.affectedRows(X_36,X_38); end user.s24_1; #inline actions= 0 time=1 usec #remap actions= 0 time=4 usec 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 @@ -4800,6 +4800,7 @@ SQLvacuum(Client cntxt, MalBlkPtr mb, Ma node *o; int ordered = 0; BUN cnt = 0; + BUN dcnt; if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL) return msg; @@ -4841,17 +4842,17 @@ SQLvacuum(Client cntxt, MalBlkPtr mb, Ma if( del == NULL) throw(SQL, "sql.vacuum", "Can not access deletion column"); - if (BATcount(del) > 0) { + dcnt = BATcount(del); + BBPunfix(del->batCacheid); + if (dcnt > 0) { /* now decide on the algorithm */ - BBPunfix(del->batCacheid); if (ordered) { - if (BATcount(del) > cnt / 20) + if (dcnt > cnt / 20) return SQLshrink(cntxt, mb, stk, pci); } else { return SQLreuse(cntxt, mb, stk, pci); } } - BBPunfix(del->batCacheid); 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 @@ -203,7 +203,7 @@ SQLepilogue(void *ret) return res; } -MT_Id sqllogthread, minmaxthread; +MT_Id sqllogthread, idlethread; static str SQLinit(void) @@ -251,12 +251,10 @@ SQLinit(void) throw(SQL, "SQLinit", "Starting log manager failed"); } GDKregister(sqllogthread); -#if 0 - if (MT_create_thread(&minmaxthread, (void (*)(void *)) mvc_minmaxmanager, NULL, MT_THR_JOINABLE) != 0) { - throw(SQL, "SQLinit", "Starting minmax manager failed"); + if (MT_create_thread(&idlethread, (void (*)(void *)) mvc_idlemanager, NULL, MT_THR_JOINABLE) != 0) { + throw(SQL, "SQLinit", "Starting idle manager failed"); } - GDKregister(minmaxthread); -#endif + GDKregister(idlethread); return MAL_SUCCEED; } diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c --- a/sql/server/sql_mvc.c +++ b/sql/server/sql_mvc.c @@ -179,11 +179,11 @@ mvc_logmanager(void) } void -mvc_minmaxmanager(void) +mvc_idlemanager(void) { - Thread thr = THRnew("minmaxmanager"); + Thread thr = THRnew("idlemanager"); - minmax_manager(); + idle_manager(); THRdel(thr); } diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h --- a/sql/server/sql_mvc.h +++ b/sql/server/sql_mvc.h @@ -131,7 +131,7 @@ typedef struct mvc { extern int mvc_init(int debug, store_type store, int ro, int su, backend_stack stk); extern void mvc_exit(void); extern void mvc_logmanager(void); -extern void mvc_minmaxmanager(void); +extern void mvc_idlemanager(void); extern mvc *mvc_create(int clientid, backend_stack stk, int debug, bstream *rs, stream *ws); extern void mvc_reset(mvc *m, bstream *rs, stream *ws, int debug, int globalvars); 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 @@ -892,6 +892,62 @@ count_del(sql_trans *tr, sql_table *t) return d->cnt; } +static size_t +count_col_upd(sql_trans *tr, sql_column *c) +{ + sql_delta *b; + + assert (isTable(c->t)) ; + if (!c->data) { + sql_column *oc = tr_find_column(tr->parent, c); + c->data = timestamp_delta(oc->data, tr->stime); + } + b = c->data; + if (!b) + return 1; + return b->ucnt; +} + +static size_t +count_idx_upd(sql_trans *tr, sql_idx *i) +{ + sql_delta *b; + + assert (isTable(i->t)) ; + if (!i->data) { + sql_idx *oi = tr_find_idx(tr->parent, i); + i->data = timestamp_delta(oi->data, tr->stime); + } + b = i->data; + if (!b) + return 0; + return b->ucnt; +} + +static size_t +count_upd(sql_trans *tr, sql_table *t) +{ + node *n; + + if (!isTable(t)) + return 0; + + for( n = t->columns.set->h; n; n = n->next) { + sql_column *c = n->data; + + if (count_col_upd(tr, c)) + return 1; + } + if (t->idxs.set) + for( n = t->idxs.set->h; n; n = n->next) { + sql_idx *i = n->data; + + if (count_idx_upd(tr, i)) + return 1; + } + return 0; +} + static int sorted_col(sql_trans *tr, sql_column *col) { @@ -2456,6 +2512,7 @@ bat_storage_init( store_functions *sf) sf->delete_tab = (delete_tab_fptr)&delete_tab; sf->count_del = (count_del_fptr)&count_del; + sf->count_upd = (count_upd_fptr)&count_upd; sf->count_col = (count_col_fptr)&count_col; sf->count_idx = (count_idx_fptr)&count_idx; sf->dcount_col = (dcount_col_fptr)&dcount_col; 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 @@ -470,6 +470,32 @@ rids_diff(sql_trans *tr, rids *l, sql_co return l; } +static int +table_vacuum(sql_trans *tr, sql_table *t) +{ + BAT *tids = delta_cands(tr, t); + BAT **cols; + node *n; + + cols = NEW_ARRAY(BAT*, cs_size(&t->columns)); + for (n = t->columns.set->h; n; n = n->next) { + sql_column *c = n->data; + BAT *v = store_funcs.bind_col(tr, c, RDONLY); + + cols[c->colnr] = BATproject(tids, v); + BBPunfix(v->batCacheid); + } + sql_trans_clear_table(tr, t); + for (n = t->columns.set->h; n; n = n->next) { + sql_column *c = n->data; + + store_funcs.append_col(tr, c, cols[c->colnr], TYPE_bat); + BBPunfix(cols[c->colnr]->batCacheid); + } + _DELETE(cols); + return SQL_OK; +} + int bat_table_init( table_functions *tf ) { @@ -479,6 +505,7 @@ bat_table_init( table_functions *tf ) tf->column_update_value = column_update_value; tf->table_insert = table_insert; tf->table_delete = table_delete; + tf->table_vacuum = table_vacuum; tf->rids_select = rids_select; tf->rids_orderby = rids_orderby; diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h --- a/sql/storage/sql_storage.h +++ b/sql/storage/sql_storage.h @@ -47,6 +47,7 @@ typedef void *(*column_find_value_fptr)( typedef int (*column_update_value_fptr)(sql_trans *tr, sql_column *c, oid rid, void *value); typedef int (*table_insert_fptr)(sql_trans *tr, sql_table *t, ...); typedef int (*table_delete_fptr)(sql_trans *tr, sql_table *t, oid rid); +typedef int (*table_vacuum_fptr)(sql_trans *tr, sql_table *t); typedef struct rids { BUN cur; @@ -92,6 +93,7 @@ typedef struct table_functions { column_update_value_fptr column_update_value; table_insert_fptr table_insert; table_delete_fptr table_delete; + table_vacuum_fptr table_vacuum; rids_select_fptr rids_select; rids_orderby_fptr rids_orderby; @@ -130,6 +132,7 @@ typedef int (*delete_tab_fptr) (sql_tran -- check for sortedness */ typedef size_t (*count_del_fptr) (sql_trans *tr, sql_table *t); +typedef size_t (*count_upd_fptr) (sql_trans *tr, sql_table *t); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list