Changeset: 06e1859ea8ea for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=06e1859ea8ea
Modified Files:
monetdb5/optimizer/opt_append.c
Branch: copybinary
Log Message:
Try to pull the sql.append_prep statement to the beginning of the block
diffs (104 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
@@ -19,9 +19,10 @@ typedef struct parstate {
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 str transform(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr
importTable);
+static int setup_append_prep(parstate *state, Client cntxt, MalBlkPtr mb,
InstrPtr old);
static void flush_finish_stmt(parstate *state, MalBlkPtr mb);
+static void pull_prep_towards_beginning(Client cntxt, MalBlkPtr mb, InstrPtr
instr);
str
@@ -57,7 +58,7 @@ OPTparappendImplementation(Client cntxt,
for (int i = 0; i < old_stop; i++) {
InstrPtr p = old_mb_stmt[i];
if (p->modname == sqlRef && p->fcnname == appendRef &&
isaBatType(getArgType(mb, p, 5))) {
- msg = transform(&state, mb, p);
+ msg = transform(&state, cntxt, mb, p);
} else {
if (mayhaveSideEffects(cntxt, mb, p, false)) {
flush_finish_stmt(&state, mb);
@@ -76,7 +77,7 @@ end:
}
static str
-transform(parstate *state, MalBlkPtr mb, InstrPtr old)
+transform(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr old)
{
// take the old instruction apart
assert(old->retc == 1);
@@ -97,7 +98,7 @@ transform(parstate *state, MalBlkPtr mb,
}
- int cookie_var = setup_append_prep(state, mb, old);
+ int cookie_var = setup_append_prep(state, cntxt, mb, old);
str append_execRef = putName("append_exec");
int ret_cookie = newTmpVariable(mb, TYPE_ptr);
@@ -113,7 +114,7 @@ transform(parstate *state, MalBlkPtr mb,
}
static int
-setup_append_prep(parstate *state, MalBlkPtr mb, InstrPtr old)
+setup_append_prep(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr old)
{
// take the old instruction apart
assert(old->retc == 1);
@@ -184,6 +185,8 @@ setup_append_prep(parstate *state, MalBl
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);
@@ -213,3 +216,42 @@ 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;
+ }
+
+ int chain_var = getArg(prep, prep->retc);
+ for (int i = 0; i < other->retc; i++)
+ if (chain_var == getArg(other, i)) {
+ // it defines the chain var we use, we must not violate
causality
+ break;
+ }
+
+ return true; // okay
+}
+
+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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list