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

Reply via email to