Changeset: 8c25de4ce971 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8c25de4ce971 Modified Files: monetdb5/optimizer/opt_hitchhiker.c monetdb5/optimizer/opt_prelude.c monetdb5/optimizer/opt_prelude.h sql/backends/monet5/sql.mal sql/backends/monet5/sql_hitchhiker.c sql/backends/monet5/sql_hitchhiker.h Branch: hitchhiker Log Message:
Add hh.move before every sql.tid statement diffs (232 lines): diff --git a/monetdb5/optimizer/opt_hitchhiker.c b/monetdb5/optimizer/opt_hitchhiker.c --- a/monetdb5/optimizer/opt_hitchhiker.c +++ b/monetdb5/optimizer/opt_hitchhiker.c @@ -20,48 +20,58 @@ OPThitchhikerImplementation(Client cntxt str msg; char buf[256]; - int i, limit, slimit, actions = 0; - // InstrPtr p; + int i, limit, slimit, updates = 0, actions = 0; + InstrPtr p, q, *old; lng clk = GDKusec(); - // if (newMalBlkStmt(mb, mb->ssize) < 0) - // throw(MAL, "optimizer.hitchhiker", SQLSTATE(HY013) MAL_MALLOC_FAIL); + // check if optimizer has been applied + if(optimizerIsApplied(mb, "hh")) + return MAL_SUCCEED; limit = mb->stop; slimit = mb->ssize; - // old = mb->stmt; - - // sql in bindRef and tidRef + old = mb->stmt; + + // count the number statements that need to be inserted + // in practice, for every sql.tid we need a hh.move for(i = 0; i < limit; i++) + if(getModuleId(mb->stmt[i]) == sqlRef && getFunctionId(mb->stmt[i]) == tidRef) + updates++; + + if(updates) { - if(getModuleId(mb->stmt[i]) == sqlRef && (getFunctionId(mb->stmt[i]) == bindRef || getFunctionId(mb->stmt[i]) == tidRef)) + // malloc new MAL block statement + if (newMalBlkStmt(mb, mb->ssize + updates) < 0) + throw(MAL, "hitchhiker.optimizer", SQLSTATE(HY013) MAL_MALLOC_FAIL); + + // locate sql.tid and inject hh.move calls before that + for(i = 0; i < limit; i++) { - // if((q = copyInstruction(p)) == NULL) { - // for (; i < slimit; i++) - // if (old[i]) - // freeInstruction(old[i]); - // GDKfree(old); + p = old[i]; - // return createException(MAL, "optimizer.hitchhiker", SQLSTATE(HY013) MAL_MALLOC_FAIL); - // } + // if instruction IS sql.tid first inject the new instruction first + if(getModuleId(p) == sqlRef && getFunctionId(p) == tidRef) + { + // create a new instruction and push it + q = newInstruction(mb, hitchhikerRef, moveRef); + getArg(q, 0) = newTmpVariable(mb, TYPE_any); + // setDestVar(q, newTmpVariable(mb, Typ)); + pushInstruction(mb, q); + actions++; + } - setModuleId(mb->stmt[i], hitchhikerRef); - actions++; + // push the original instructions + if(p) + pushInstruction(mb, p); } - // if(p) - // pushInstruction(mb, p); + // free old + for (; i < slimit; i++) + if (old[i]) + freeInstruction(old[i]); + GDKfree(old); } - // free old - // for (; i < slimit; i++) - // if (old[i]) - // freeInstruction(old[i]); - // GDKfree(old); - - if(mb->errors) - throw(MAL, "optimizer.hitchhiker", SQLSTATE(42000) PROGRAM_GENERAL); - // defense line against incorrect plans msg = chkTypes(cntxt->usermodule, mb, FALSE); if(msg == MAL_SUCCEED) msg = chkFlow(mb); @@ -69,7 +79,7 @@ OPThitchhikerImplementation(Client cntxt clk = GDKusec() - clk; snprintf(buf, 256, "%-20s actions=%2d time=" LLFMT " usec", "optimizer.hitchhiker", actions, clk); - newComment(mb,buf); + newComment(mb, buf); addtoMalBlkHistory(mb); return msg; 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 @@ -187,6 +187,7 @@ str mirrorRef; str mitosisRef; str mkeyRef; str mmathRef; +str moveRef; str mtimeRef; str mulRef; str multicolumnRef; @@ -488,6 +489,7 @@ void optimizerInit(void) mitosisRef = putName("mitosis"); mkeyRef = putName("mkey"); mmathRef = putName("mmath"); + moveRef = putName("move"); mtimeRef = putName("mtime"); mulRef = putName("*"); multicolumnRef = putName("multicolumn"); 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 @@ -186,6 +186,7 @@ mal_export str mirrorRef; mal_export str mitosisRef; mal_export str mkeyRef; mal_export str mmathRef; +mal_export str moveRef; mal_export str mtimeRef; mal_export str mulRef; mal_export str multicolumnRef; diff --git a/sql/backends/monet5/sql.mal b/sql/backends/monet5/sql.mal --- a/sql/backends/monet5/sql.mal +++ b/sql/backends/monet5/sql.mal @@ -209,28 +209,6 @@ comment "Bind the 'schema.table.index' B 1 - inserts 2 - updates"; - - - -pattern hh.bind(mvc:int, schema:str, table:str, column:str, access:int):bat[:any_1] -address hh_bind -comment "Hitchhiker hh.bind"; - -pattern hh.bind(mvc:int, schema:str, table:str, column:str, access:int)(uid:bat[:oid],uval:bat[:any_1]) -address hh_bind -comment "Hitchhiker hh.bind"; - -pattern hh.bind(mvc:int, schema:str, table:str, column:str, access:int, part_nr:int, nr_parts:int):bat[:any_1] -address hh_bind -comment "Hitchhiker hh.bind"; - -pattern hh.bind(mvc:int, schema:str, table:str, column:str, access:int, part_nr:int, nr_parts:int)(uid:bat[:oid],uval:bat[:any_1]) -address hh_bind -comment "Hitchhiker hh.bind"; - - - - pattern emptybind(mvc:int, schema:str, table:str, column:str, access:int ):bat[:any_1] address mvc_bind_wrap; pattern bind(mvc:int, schema:str, table:str, column:str, access:int ):bat[:any_1] @@ -316,6 +294,14 @@ unsafe pattern clear_table(sname:str, tn address mvc_clear_table_wrap comment "Clear the table sname.tname."; + + +pattern hh.move() :void +address hh_move +comment "Hitchhiker migrate to another database"; + + + pattern tid( mvc:int, sname:str, tname:str):bat[:oid] address SQLtid comment "Return a column with the valid tuple identifiers associated with the table sname.tname."; @@ -323,18 +309,6 @@ pattern tid( mvc:int, sname:str, tname:s address SQLtid comment "Return the tables tid column."; - - - -pattern hh.tid(mvc:int, sname:str, tname:str):bat[:oid] -address hh_tid -comment "Hitchhiker hh.tid"; -pattern hh.tid(mvc:int, sname:str, tname:str, part_nr:int, nr_parts:int):bat[:oid] -address hh_tid -comment "Hitchhiker hh.tid"; - - - unsafe pattern delete(mvc:int, sname:str, tname:str, b:any):int address mvc_delete_wrap comment "Delete a row from a table. Returns sequence number for order dependece."; diff --git a/sql/backends/monet5/sql_hitchhiker.c b/sql/backends/monet5/sql_hitchhiker.c --- a/sql/backends/monet5/sql_hitchhiker.c +++ b/sql/backends/monet5/sql_hitchhiker.c @@ -11,14 +11,12 @@ str -hh_tid(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +hh_move(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - return SQLtid(cntxt, mb, stk, pci); + (void) cntxt; + (void) mb; + (void) stk; + (void) pci; + + return MAL_SUCCEED; } - - -str -hh_bind(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) -{ - return mvc_bind_wrap(cntxt, mb, stk, pci); -} diff --git a/sql/backends/monet5/sql_hitchhiker.h b/sql/backends/monet5/sql_hitchhiker.h --- a/sql/backends/monet5/sql_hitchhiker.h +++ b/sql/backends/monet5/sql_hitchhiker.h @@ -21,7 +21,6 @@ #define sql5_export extern #endif -sql5_export str hh_tid(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); -sql5_export str hh_bind(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +sql5_export str hh_move(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); #endif /* _SQL_HITCHHIKER_ */ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list