Changeset: 5adfcc15e509 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5adfcc15e509
Modified Files:
        monetdb5/optimizer/opt_append.c
        monetdb5/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
        monetdb5/optimizer/opt_support.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
Branch: copybinary
Log Message:

Try to get the sql.append_exec's to run in parallel

it crashes, though. on a memory corruption bug.


diffs (200 lines):

diff --git a/monetdb5/optimizer/opt_append.c b/monetdb5/optimizer/opt_append.c
--- a/monetdb5/optimizer/opt_append.c
+++ b/monetdb5/optimizer/opt_append.c
@@ -16,10 +16,12 @@
 
 typedef struct parstate {
        InstrPtr prep_stmt;
+       InstrPtr finish_stmt;
 } parstate;
 
 static str transform(parstate *state, MalBlkPtr mb, InstrPtr importTable);
 static int setup_append_prep(parstate *state, MalBlkPtr mb, InstrPtr old);
+static void flush_finish_stmt(parstate *state, MalBlkPtr mb);
 
 
 str
@@ -58,13 +60,14 @@ OPTparappendImplementation(Client cntxt,
                        msg = transform(&state, mb, p);
                } else {
                        if (mayhaveSideEffects(cntxt, mb, p, false)) {
-                               state = (parstate) { NULL };
+                               flush_finish_stmt(&state, mb);
                        }
                        pushInstruction(mb, p);
                }
                if (msg != MAL_SUCCEED)
                        return msg;
        }
+       assert(state.prep_stmt == NULL);
 
 end:
        if (old_mb_stmt)
@@ -97,10 +100,13 @@ transform(parstate *state, MalBlkPtr mb,
        int cookie_var = setup_append_prep(state, mb, old);
 
        str append_execRef = putName("append_exec");
+       int ret_cookie = newTmpVariable(mb, TYPE_ptr);
        InstrPtr e = newFcnCall(mb, sqlRef, append_execRef);
+       setReturnArgument(e, ret_cookie);
        pushArgument(mb, e, cookie_var);
        pushArgument(mb, e, data_var);
 
+       pushArgument(mb, state->finish_stmt, ret_cookie);
        // fprintf(stderr, "TRIGGER\n");
 
        return MAL_SUCCEED;
@@ -162,15 +168,22 @@ setup_append_prep(parstate *state, MalBl
 
        int cookie_var = newTmpVariable(mb, TYPE_ptr);
        if (prep_stmt == NULL) {
-               str append_prepRef = putName("append_prep");
+               flush_finish_stmt(state, mb);
+
+               int chain = newTmpVariable(mb, TYPE_int);
                InstrPtr p = newFcnCall(mb, sqlRef, append_prepRef);
-               setReturnArgument(p, chain_out_var);
+               setReturnArgument(p, chain);
                pushReturn(mb, p, cookie_var);
                pushArgument(mb, p, chain_in_var);
                pushArgument(mb, p, sname_var);
                pushArgument(mb, p, tname_var);
                pushArgument(mb, p, cname_var);
                state->prep_stmt = p;
+
+               InstrPtr f = newInstructionArgs(mb, sqlRef, append_finishRef, 
2);
+               state->finish_stmt = f;
+               setReturnArgument(f, chain_out_var);
+               pushArgument(mb, f, chain);
        } else {
                // Append to existing first, to ensure there is room
                pushArgument(mb, prep_stmt, cname_var);
@@ -180,9 +193,21 @@ setup_append_prep(parstate *state, MalBl
                        setArg(prep_stmt, i, getArg(prep_stmt, i - 1));
                setArg(prep_stmt, prep_stmt->retc, cookie_var);
                prep_stmt->retc += 1;
+
                // Always use the chain_out of the latest sql_append:
-               setArg(prep_stmt, 0, chain_out_var);
+               setArg(state->finish_stmt, 0, chain_out_var);
        }
 
        return cookie_var;
 }
+
+
+static void
+flush_finish_stmt(parstate *state, MalBlkPtr mb)
+{
+       if (state->finish_stmt) {
+               pushInstruction(mb, state->finish_stmt);
+       }
+       state->prep_stmt = NULL;
+       state->finish_stmt = NULL;
+}
diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c
--- a/monetdb5/optimizer/opt_prelude.c
+++ b/monetdb5/optimizer/opt_prelude.c
@@ -42,6 +42,9 @@ str andRef;
 str appendidxRef;
 str appendBulkRef;
 str appendRef;
+str append_prepRef;
+str append_execRef;
+str append_finishRef;
 str arrayRef;
 str assertRef;
 str attachRef;
@@ -350,6 +353,9 @@ void optimizerInit(void)
        appendidxRef = putName("append_idxbat");
        appendBulkRef = putName("appendBulk");
        appendRef = putName("append");
+       append_prepRef = putName("append_prep");
+       append_execRef = putName("append_exec");
+       append_finishRef = putName("append_finish");
        arrayRef = putName("array");
        assertRef = putName("assert");
        attachRef = putName("attach");
diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h
--- a/monetdb5/optimizer/opt_prelude.h
+++ b/monetdb5/optimizer/opt_prelude.h
@@ -38,6 +38,9 @@ mal_export  str andRef;
 mal_export  str appendidxRef;
 mal_export  str appendBulkRef;
 mal_export  str appendRef;
+mal_export  str append_prepRef;
+mal_export  str append_execRef;
+mal_export  str append_finishRef;
 mal_export  str arrayRef;
 mal_export  str assertRef;
 mal_export  str attachRef;
diff --git a/monetdb5/optimizer/opt_support.c b/monetdb5/optimizer/opt_support.c
--- a/monetdb5/optimizer/opt_support.c
+++ b/monetdb5/optimizer/opt_support.c
@@ -368,6 +368,7 @@ hasSideEffects(MalBlkPtr mb, InstrPtr p,
                if (getFunctionId(p) == mvcRef) return FALSE;
                if (getFunctionId(p) == singleRef) return FALSE;
                if (getFunctionId(p) == importColumnRef) return FALSE;
+               if (getFunctionId(p) == append_execRef) return FALSE;
                return TRUE;
        }
        if( getModuleId(p) == mapiRef){
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
@@ -1850,6 +1850,23 @@ mvc_append_exec_wrap(Client cntxt, MalBl
        return MAL_SUCCEED;
 }
 
+
+// chain_out := sql.append_prep(chain_in, cookie_1, ... cookie_N);
+str
+mvc_append_finish_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       int *chain_out = getArgReference_int(stk, pci, 0);
+       int chain_in = *getArgReference_int(stk, pci, 1);
+
+       *chain_out = chain_in;
+       (void)cntxt;
+       (void)mb;
+       (void)stk;
+       (void)pci;
+       return MAL_SUCCEED;
+}
+
+
 /*mvc_update_wrap(int *bid, str *sname, str *tname, str *cname, ptr d) */
 str
 mvc_update_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
@@ -5419,12 +5436,19 @@ static mel_func sql_init_funcs[] = {
                
arg("mvc",int),arg("sname",str),arg("tname",str),vararg("cname",str))),
  pattern("sql", "append_exec", mvc_append_exec_wrap, false, "Perform the 
actual append",
     args(1,3,
-               arg("",void),
+               arg("",ptr),
                arg("cookie",ptr),batargany("ins",1))),
 
     // tmp_1, cookie_1 := sql.append_prep(chain_0, s, t, c_1);
     // done_1 := sql.append_exec(cookie_1, bat_1);
 
+ pattern("sql", "append_finish", mvc_append_finish_wrap, false,
+       "Reconvene the sql.append_prep/sql.append_exec workflow",
+    args(1,3,
+               arg("",int),
+               arg("mvc",int),vararg("cookie",ptr))),
+
+
 
 
  pattern("sql", "update", mvc_update_wrap, false, "Update the values of the 
column tname.cname. Returns sequence number for order dependence)", args(1,7, 
arg("",int),arg("mvc",int),arg("sname",str),arg("tname",str),arg("cname",str),argany("rids",0),argany("upd",0))),
diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h
--- a/sql/backends/monet5/sql.h
+++ b/sql/backends/monet5/sql.h
@@ -69,6 +69,7 @@ sql5_export str mvc_append_wrap(Client c
 sql5_export str mvc_append_bat_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str mvc_append_prep_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
 sql5_export str mvc_append_exec_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
+sql5_export str mvc_append_finish_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
 sql5_export str mvc_append_column(sql_trans *t, sql_column *c, BAT *ins);
 
 sql5_export str mvc_update_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to