Changeset: 2191e791ee62 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2191e791ee62
Modified Files:
        monetdb5/optimizer/opt_parappend.c
Branch: default
Log Message:

Make opt_parappend a lot less ambitious


diffs (137 lines):

diff --git a/monetdb5/optimizer/opt_parappend.c 
b/monetdb5/optimizer/opt_parappend.c
--- a/monetdb5/optimizer/opt_parappend.c
+++ b/monetdb5/optimizer/opt_parappend.c
@@ -20,11 +20,9 @@ typedef struct parstate {
        InstrPtr finish_stmt;
 } parstate;
 
-static str transform(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr 
importTable, const char *execRef, const char *prepRef, int *actions);
-static int setup_append_prep(parstate *state, Client cntxt, MalBlkPtr mb, 
InstrPtr old, const char *prepRef);
+static str transform(parstate *state, MalBlkPtr mb, InstrPtr importTable, 
const char *execRef, const char *prepRef, int *actions);
+static int setup_append_prep(parstate *state, MalBlkPtr mb, InstrPtr old, 
const char *prepRef);
 static void flush_finish_stmt(parstate *state, MalBlkPtr mb);
-static void pull_prep_towards_beginning(Client cntxt, MalBlkPtr mb, InstrPtr 
instr);
-static bool needs_chain_var(parstate *state, InstrPtr instr);
 
 
 str
@@ -68,13 +66,11 @@ OPTparappendImplementation(Client cntxt,
        for (size_t i = 0; i < old_stop; i++) {
                InstrPtr p = old_mb_stmt[i];
                if (p->modname == sqlRef && p->fcnname == appendRef) {
-                       msg = transform(&state, cntxt, mb, p, 
putName("append_exec"), putName("append_prep"), &actions);
+                       msg = transform(&state, mb, p, putName("append_exec"), 
putName("append_prep"), &actions);
                } else if (p->modname == sqlRef && p->fcnname == updateRef) {
-                       msg = transform(&state, cntxt, mb, p, 
putName("update_exec"), putName("update_prep"), &actions);
+                       msg = transform(&state, mb, p, putName("update_exec"), 
putName("update_prep"), &actions);
                } else {
-                       if (p->barrier != 0 || mayhaveSideEffects(cntxt, mb, p, 
false) || needs_chain_var(&state, p)) {
-                               flush_finish_stmt(&state, mb);
-                       }
+                       flush_finish_stmt(&state, mb);
                        pushInstruction(mb, p);
                }
                if (msg != MAL_SUCCEED)
@@ -115,7 +111,7 @@ end:
 }
 
 static str
-transform(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr old, const 
char *opRef, const char *prepRef, int *actions)
+transform(parstate *state, MalBlkPtr mb, InstrPtr old, const char *opRef, 
const char *prepRef, int *actions)
 {
        int sname_var;
        int tname_var;
@@ -158,7 +154,7 @@ transform(parstate *state, Client cntxt,
 
        *actions += 1;
 
-       int cookie_var = setup_append_prep(state, cntxt, mb, old, prepRef);
+       int cookie_var = setup_append_prep(state, mb, old, prepRef);
 
        int ret_cookie = newTmpVariable(mb, TYPE_ptr);
        InstrPtr e = newFcnCall(mb, sqlRef, opRef);
@@ -175,7 +171,7 @@ transform(parstate *state, Client cntxt,
 }
 
 static int
-setup_append_prep(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr old, 
const char *prepRef)
+setup_append_prep(parstate *state, MalBlkPtr mb, InstrPtr old, const char 
*prepRef)
 {
        // take the old instruction apart
        assert(old->retc == 1);
@@ -253,8 +249,6 @@ setup_append_prep(parstate *state, Clien
                setReturnArgument(f, chain_out_var);
                f = pushArgument(mb, f, chain);
                state->finish_stmt = f;
-
-               pull_prep_towards_beginning(cntxt, mb, p);
        } else {
                // Append to existing first, to ensure there is room
                prep_stmt = pushArgument(mb, prep_stmt, cname_var);
@@ -284,66 +278,3 @@ flush_finish_stmt(parstate *state, MalBl
        state->prep_stmt = NULL;
        state->finish_stmt = NULL;
 }
-
-
-static bool
-can_swap_prep_with(Client cntxt, MalBlkPtr mb, InstrPtr prep, InstrPtr other)
-{
-       if (mayhaveSideEffects(cntxt, mb, other, false)) {
-               // probably not safe to pull it across a side effect, and 
chainflow wouldn't benefit anyway
-               return false;
-       }
-
-       if (other->barrier != 0) {
-               // be wary of control flow
-               return false;
-       }
-
-       int chain_var = getArg(prep, prep->retc);
-       for (int i = 0; i < other->retc; i++) {
-               int other_ret = getArg(other, i);
-               if (chain_var == other_ret) {
-                       // it defines the chain var we use, we must not violate 
causality
-                       return false;
-               }
-       }
-
-       return true; // okay
-}
-
-static bool
-needs_chain_var(parstate *state, InstrPtr instr)
-{
-       if (state->finish_stmt == NULL)
-               return false;
-
-       int chain_var = getArg(state->finish_stmt, 0);
-
-       for (int i = 0; i < instr->argc; i++) {
-               int var = getArg(instr, i);
-               if (var == chain_var)
-                       return true;
-       }
-
-       return false;
-}
-
-static void
-pull_prep_towards_beginning(Client cntxt, MalBlkPtr mb, InstrPtr prep)
-{
-       int prep_loc = prep->pc;
-       int tgt = prep_loc;
-
-       while (tgt > 0) {
-               int new_tgt = tgt - 1;
-               InstrPtr other = getInstrPtr(mb, new_tgt);
-               if (!can_swap_prep_with(cntxt, mb, prep, other))
-                       break;
-               tgt = new_tgt;
-       }
-
-       if (tgt != prep_loc) {
-               moveInstruction(mb, prep_loc, tgt);
-       } else {
-       }
-}
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to