Changeset: 3cb9dc0d85f5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3cb9dc0d85f5
Modified Files:
clients/Tests/exports.stable.out
monetdb5/optimizer/opt_parappend.c
monetdb5/optimizer/opt_prelude.c
monetdb5/optimizer/opt_prelude.h
monetdb5/optimizer/opt_support.c
Branch: copybinary
Log Message:
Use update_prep and update_exec from opt_parappend
diffs (213 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1699,6 +1699,7 @@ str transaction_rollbackRef;
void trimMalVariables(MalBlkPtr mb, MalStkPtr stk);
void trimMalVariables_(MalBlkPtr mb, MalStkPtr glb);
void typeChecker(Module scope, MalBlkPtr mb, InstrPtr p, int p_idx, int
silent);
+str update_execRef;
str uniqueRef;
str unlockRef;
str unpackRef;
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,8 +20,8 @@ typedef struct parstate {
InstrPtr finish_stmt;
} parstate;
-static str transform(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr
importTable, int *actions);
-static int setup_append_prep(parstate *state, Client cntxt, MalBlkPtr mb,
InstrPtr old);
+static str transform(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr
importTable, str execRef, str prepRef, int *actions);
+static int setup_append_prep(parstate *state, Client cntxt, MalBlkPtr mb,
InstrPtr old, str 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);
@@ -45,14 +45,22 @@ OPTparappendImplementation(Client cntxt,
int found_at = -1;
for (int i = 0; i < mb->stop; i++) {
InstrPtr p = getInstrPtr(mb, i);
- if (p->modname == sqlRef && p->fcnname == appendRef) {
- found_at = i;
- break;
+ if (p->modname == sqlRef) {
+ if (p->fcnname == appendRef || p->fcnname == updateRef)
{
+ found_at = i;
+ break;
+ }
}
}
if (found_at == -1)
return MAL_SUCCEED;
+
+ // stream *s1;
+ // s1 = open_wastream("a");
+ // printFunction(s1, mb, stk, LIST_MAL_ALL);
+ // mnstr_close(s1);
+
old_mb_stmt = mb->stmt;
size_t old_ssize = mb->ssize;
size_t old_stop = mb->stop;
@@ -64,7 +72,9 @@ 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, &actions);
+ msg = transform(&state, cntxt, 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);
} else {
if (p->barrier != 0 || mayhaveSideEffects(cntxt, mb, p,
false) || needs_chain_var(&state, p)) {
flush_finish_stmt(&state, mb);
@@ -76,6 +86,11 @@ OPTparappendImplementation(Client cntxt,
}
assert(state.prep_stmt == NULL);
+ // stream *s2;
+ // s2 = open_wastream("b");
+ // printFunction(s2, mb, stk, LIST_MAL_ALL);
+ // mnstr_close(s2);
+
end:
if (old_mb_stmt) {
for (size_t i = old_stop; i < old_ssize; i++) {
@@ -109,15 +124,35 @@ end:
}
static str
-transform(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr old, int
*actions)
+transform(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr old, str
opRef, str prepRef, int *actions)
{
+ int sname_var;
+ int tname_var;
+ int cname_var;
+ int data_var;
+ int cand_var;
+
// take the old instruction apart
assert(old->retc == 1);
- assert(old->argc == 1 + 5);
- int sname_var = getArg(old, 2);
- int tname_var = getArg(old, 3);
- int cname_var = getArg(old, 4);
- int data_var = getArg(old, 5);
+ assert(old->argc == 6 || old->argc == 7);
+ switch (old->argc) {
+ case 6:
+ sname_var = getArg(old, 2);
+ tname_var = getArg(old, 3);
+ cname_var = getArg(old, 4);
+ data_var = getArg(old, 5);
+ cand_var = 0;
+ break;
+ case 7:
+ sname_var = getArg(old, 2);
+ tname_var = getArg(old, 3);
+ cname_var = getArg(old, 4);
+ cand_var = getArg(old, 5);
+ data_var = getArg(old, 6);
+ break;
+ default:
+ throw(MAL, "optimizer.parappend", "internal error:
append/update instr should have argc 6 or 7, not %d", old->argc);
+ }
bool sname_constant = isVarConstant(mb, sname_var);
bool tname_constant = isVarConstant(mb, tname_var);
@@ -132,28 +167,28 @@ transform(parstate *state, Client cntxt,
*actions += 1;
- int cookie_var = setup_append_prep(state, cntxt, mb, old);
+ int cookie_var = setup_append_prep(state, cntxt, mb, old, prepRef);
- str append_execRef = putName("append_exec");
int ret_cookie = newTmpVariable(mb, TYPE_ptr);
- InstrPtr e = newFcnCall(mb, sqlRef, append_execRef);
+ InstrPtr e = newFcnCall(mb, sqlRef, opRef);
setReturnArgument(e, ret_cookie);
e = pushArgument(mb, e, cookie_var);
+ if (cand_var)
+ e = pushArgument(mb, e, cand_var);
e = pushArgument(mb, e, data_var);
state->finish_stmt = pushArgument(mb, state->finish_stmt, ret_cookie);
- // fprintf(stderr, "TRIGGER\n");
freeInstruction(old);
return MAL_SUCCEED;
}
static int
-setup_append_prep(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr old)
+setup_append_prep(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr old,
str prepRef)
{
// take the old instruction apart
assert(old->retc == 1);
- assert(old->argc == 1 + 5);
+ assert(old->argc == 6 || old->argc == 7);
int chain_out_var = getArg(old, 0);
int chain_in_var = getArg(old, 1);
int sname_var = getArg(old, 2);
@@ -167,6 +202,11 @@ setup_append_prep(parstate *state, Clien
if (prep_stmt == NULL)
break;
+ if (prep_stmt->fcnname != prepRef) {
+ prep_stmt = NULL;
+ break;
+ }
+
int existing_sname_var = getArg(prep_stmt, prep_stmt->retc + 1);
int existing_tname_var = getArg(prep_stmt, prep_stmt->retc + 2);
@@ -209,7 +249,7 @@ setup_append_prep(parstate *state, Clien
flush_finish_stmt(state, mb);
int chain = newTmpVariable(mb, TYPE_int);
- InstrPtr p = newFcnCall(mb, sqlRef, append_prepRef);
+ InstrPtr p = newFcnCall(mb, sqlRef, prepRef);
setReturnArgument(p, chain);
pushReturn(mb, p, cookie_var);
p = pushArgument(mb, p, chain_in_var);
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
@@ -312,6 +312,7 @@ str transaction_commitRef;
str transactionRef;
str transaction_releaseRef;
str transaction_rollbackRef;
+str update_execRef;
str uniqueRef;
str unlockRef;
str unpackRef;
@@ -624,6 +625,7 @@ void optimizerInit(void)
transactionRef= putName("transaction");
transaction_releaseRef= putName("transaction_release");
transaction_rollbackRef= putName("transaction_rollback");
+ update_execRef = putName("update_exec");
uniqueRef= putName("unique");
unlockRef= putName("unlock");
unpackRef = putName("unpack");
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
@@ -313,6 +313,7 @@ mal_export str transaction_commitRef;
mal_export str transactionRef;
mal_export str transaction_releaseRef;
mal_export str transaction_rollbackRef;
+mal_export str update_execRef;
mal_export str uniqueRef;
mal_export str unlockRef;
mal_export str unpackRef;
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
@@ -369,6 +369,7 @@ hasSideEffects(MalBlkPtr mb, InstrPtr p,
if (getFunctionId(p) == singleRef) return FALSE;
if (getFunctionId(p) == importColumnRef) return FALSE;
if (getFunctionId(p) == append_execRef) return FALSE;
+ if (getFunctionId(p) == update_execRef) return FALSE;
return TRUE;
}
if( getModuleId(p) == mapiRef){
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list