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

Reply via email to