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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list