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