Changeset: 69661b487660 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/69661b487660 Added Files: monetdb5/optimizer/opt_dict.c monetdb5/optimizer/opt_dict.h Modified Files: monetdb5/optimizer/CMakeLists.txt monetdb5/optimizer/opt_pipes.c monetdb5/optimizer/opt_prelude.c monetdb5/optimizer/opt_prelude.h monetdb5/optimizer/opt_wrapper.c monetdb5/optimizer/optimizer.c sql/backends/monet5/sql_statement.c Branch: dict Log Message:
initial optimizer push decompress passed projection and subslice diffs (259 lines): diff --git a/monetdb5/optimizer/CMakeLists.txt b/monetdb5/optimizer/CMakeLists.txt --- a/monetdb5/optimizer/CMakeLists.txt +++ b/monetdb5/optimizer/CMakeLists.txt @@ -19,6 +19,7 @@ target_sources(optimizer opt_constants.c opt_constants.h opt_costModel.c opt_costModel.h opt_dataflow.c opt_dataflow.h + opt_dict.c opt_dict.h opt_deadcode.c opt_deadcode.h opt_emptybind.c opt_emptybind.h opt_evaluate.c opt_evaluate.h diff --git a/monetdb5/optimizer/opt_dict.c b/monetdb5/optimizer/opt_dict.c new file mode 100644 --- /dev/null +++ b/monetdb5/optimizer/opt_dict.c @@ -0,0 +1,115 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 1997 - July 2008 CWI, August 2008 - 2021 MonetDB B.V. + */ + +#include "monetdb_config.h" +#include "opt_dict.h" + +str +OPTdictImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + int i, j, k, limit, slimit; + InstrPtr p=0, *old=NULL; + int actions = 0; + int *varisdict=NULL, *vardictvalue=NULL; + str msg= MAL_SUCCEED; + + (void) cntxt; + (void) stk; /* to fool compilers */ + + if (mb->inlineProp) + goto wrapup; + + varisdict = GDKzalloc(2 * mb->vtop * sizeof(int)); + vardictvalue = GDKzalloc(2 * mb->vtop * sizeof(int)); + if (varisdict == NULL || vardictvalue == NULL) + goto wrapup; + + limit = mb->stop; + slimit = mb->ssize; + old = mb->stmt; + if (newMalBlkStmt(mb, mb->ssize) < 0) { + GDKfree(varisdict); + throw(MAL,"optimizer.dict", SQLSTATE(HY013) MAL_MALLOC_FAIL); + } + + // Consolidate the actual need for variables + for (i = 0; i < limit; i++) { + p = old[i]; + if( p == 0) + continue; //left behind by others? + if (p->retc == 1 && getModuleId(p) == sqlRef && getFunctionId(p) == dict_decompressRef) { + // remember we have encountered a dict decompress function + k = getArg(p,0); + varisdict[k] = getArg(p,1); + vardictvalue[k] = getArg(p, 2); + continue; + } + int done = 0; + for(j=p->retc; j< p->argc; j++){ + k = getArg(p,j); + if (varisdict[k]) { // maybe we could delay this usage + if (getModuleId(p) == algebraRef && getFunctionId(p) == projectionRef) { + /* projection(cand, col) with col = dict.decompress(o,u) + * v1 = projection(cand, o) + * dict.decompress(v1, u) */ + InstrPtr r = copyInstruction(p); + int tpe = getVarType(mb, varisdict[k]); + int l = getArg(r, 0); + getArg(r, 0) = newTmpVariable(mb, tpe); + getArg(r, j) = varisdict[k]; + varisdict[l] = getArg(r,0); + vardictvalue[l] = vardictvalue[k]; + pushInstruction(mb,r); + done = 1; + break; + } else if (getModuleId(p) == algebraRef && getFunctionId(p) == subsliceRef) { + /* pos = subslice(col, l, h) with col = dict.decompress(o,u) + * pos = subslice(o, l, h) */ + InstrPtr r = copyInstruction(p); + getArg(r, j) = varisdict[k]; + pushInstruction(mb,r); + done = 1; + break; + } else { + /* need to decompress */ + int tpe = getArgType(mb, p, j); + InstrPtr r = newInstruction(mb, sqlRef, dict_decompressRef); + getArg(r, 0) = newTmpVariable(mb, tpe); + r = addArgument(mb, r, varisdict[k]); + r = addArgument(mb, r, vardictvalue[k]); + pushInstruction(mb, r); + + getArg(p, j) = getArg(r, 0); + } + } + } + if (!done) + pushInstruction(mb, p); + } + + for(; i<slimit; i++) + if (old[i]) + pushInstruction(mb, old[i]); + /* Defense line against incorrect plans */ + if (actions > 0){ + msg = chkTypes(cntxt->usermodule, mb, FALSE); + if (!msg) + msg = chkFlow(mb); + if (!msg) + msg = chkDeclarations(mb); + } + /* keep all actions taken as a post block comment */ +wrapup: + /* keep actions taken as a fake argument*/ + (void) pushInt(mb, pci, actions); + + GDKfree(old); + GDKfree(varisdict); + GDKfree(vardictvalue); + return msg; +} diff --git a/monetdb5/optimizer/opt_dict.h b/monetdb5/optimizer/opt_dict.h new file mode 100644 --- /dev/null +++ b/monetdb5/optimizer/opt_dict.h @@ -0,0 +1,19 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 1997 - July 2008 CWI, August 2008 - 2021 MonetDB B.V. + */ + +#ifndef _OPT_DICT_ +#define _OPT_DICT_ +#include "opt_prelude.h" +#include "opt_support.h" +#include "mal_interpreter.h" +#include "mal_instruction.h" +#include "mal_function.h" + +extern str OPTdictImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); + +#endif diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c --- a/monetdb5/optimizer/opt_pipes.c +++ b/monetdb5/optimizer/opt_pipes.c @@ -47,9 +47,10 @@ static struct PIPELINES { "optimizer.remap();" "optimizer.bincopyfrom();" "optimizer.deadcode();" + "optimizer.dict();" "optimizer.multiplex();" "optimizer.generator();" - "optimizer.profiler();" + "optimizer.profiler();" //"optimizer.candidates();" only for decoration in explain //"optimizer.mask();" "optimizer.garbageCollector();", @@ -77,6 +78,7 @@ static struct PIPELINES { "optimizer.deadcode();" /* Feb2021 update, I pushed deadcode optimizer earlier in the pipeline so it runs before mitosis, thus removing less instructions */ "optimizer.pushselect();" "optimizer.aliases();" + "optimizer.dict();" "optimizer.mitosis();" "optimizer.mergetable();" "optimizer.bincopyfrom();" 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 @@ -107,6 +107,7 @@ const char *deleteRef; const char *deltaRef; const char *dense_rankRef; const char *deregisterRef; +const char *dict_decompressRef; const char *diffcandRef; const char *differenceRef; const char *disconnectRef; @@ -417,6 +418,7 @@ void optimizerInit(void) deltaRef = putName("delta"); dense_rankRef = putName("dense_rank"); deregisterRef = putName("deregister"); + dict_decompressRef = putName("dict_decompress"); diffcandRef= putName("diffcand"); differenceRef = putName("difference"); disconnectRef= putName("disconnect"); 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 @@ -103,6 +103,7 @@ mal_export const char *deleteRef; mal_export const char *deltaRef; mal_export const char *dense_rankRef; mal_export const char *deregisterRef; +mal_export const char *dict_decompressRef; mal_export const char *diffcandRef; mal_export const char *differenceRef; mal_export const char *diffRef; diff --git a/monetdb5/optimizer/opt_wrapper.c b/monetdb5/optimizer/opt_wrapper.c --- a/monetdb5/optimizer/opt_wrapper.c +++ b/monetdb5/optimizer/opt_wrapper.c @@ -41,6 +41,7 @@ #include "opt_oltp.h" #include "opt_postfix.h" #include "opt_mask.h" +#include "opt_dict.h" #include "opt_mergetable.h" #include "opt_mitosis.h" #include "opt_multiplex.h" @@ -81,6 +82,7 @@ struct{ {"jit", &OPTjitImplementation,0,0}, {"json", &OPTjsonImplementation,0,0}, {"mask", &OPTmaskImplementation,0,0}, + {"dict", &OPTdictImplementation,0,0}, {"matpack", &OPTmatpackImplementation,0,0}, {"mergetable", &OPTmergetableImplementation,0,0}, {"minimalfast", &OPTminimalfastImplementation,0,0}, @@ -106,7 +108,7 @@ static void fillcodehash(void) { int i, idx; - + for( i=0; i< 256; i++) codehash[i] = -1; for (i=0; codes[i].nme; i++){ diff --git a/monetdb5/optimizer/optimizer.c b/monetdb5/optimizer/optimizer.c --- a/monetdb5/optimizer/optimizer.c +++ b/monetdb5/optimizer/optimizer.c @@ -131,6 +131,7 @@ static mel_func optimizer_init_funcs[] = optwrapper_pattern("oltp", "Inject the OLTP locking primitives"), optwrapper_pattern("wlc", "Inject the workload capture-replay primitives"), optwrapper_pattern("postfix", "Postfix the plan,e.g. pushing projections"), + optwrapper_pattern("dict", "Push dict decompress down"), pattern("optimizer", "mask", OPTwrapper, false, "", args(1,1, arg("",str))), pattern("optimizer", "mask", OPTwrapper, false, "Manipulate the MSK objects", args(1,3, arg("",str),arg("mod",str),arg("fcn",str))), { .imp=NULL } diff --git a/sql/backends/monet5/sql_statement.c b/sql/backends/monet5/sql_statement.c --- a/sql/backends/monet5/sql_statement.c +++ b/sql/backends/monet5/sql_statement.c @@ -2271,7 +2271,7 @@ stmt_dict(backend *be, stmt *op1, stmt * if (op1->nr < 0 || op2->nr < 0) return NULL; - q = newStmt(mb, sqlRef, "dict_decompress"); + q = newStmt(mb, sqlRef, dict_decompressRef); q = pushArgument(mb, q, op1->nr); q = pushArgument(mb, q, op2->nr); _______________________________________________ checkin-list mailing list [email protected] https://www.monetdb.org/mailman/listinfo/checkin-list
