Changeset: cc2c07ed53cc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cc2c07ed53cc
Modified Files:
        monetdb5/optimizer/opt_dict.c
        sql/backends/monet5/dict.c
        sql/backends/monet5/dict.h
        sql/backends/monet5/sql.c
Branch: dict
Log Message:

handle all selects.
added dict.convert (:bat[:oid]) :bat[bte], etc
to handle offsets > 127

don't clean same bat twice


diffs (106 lines):

diff --git a/monetdb5/optimizer/opt_dict.c b/monetdb5/optimizer/opt_dict.c
--- a/monetdb5/optimizer/opt_dict.c
+++ b/monetdb5/optimizer/opt_dict.c
@@ -101,10 +101,10 @@ OPTdictImplementation(Client cntxt, MalB
                                        pushInstruction(mb,r);
                                        done = 1;
                                        break;
-                               } else if (getModuleId(p) == algebraRef && 
getFunctionId(p) == selectRef) {
+                               } else if (isSelect(p)) {
                                        /* pos = select(col, cand, l, h, ...) 
with col = dict.decompress(o,u)
                                         * tp = select(u, nil, l, h, ...)
-                                        * tp2 = bte/sht/int(tp)
+                                        * tp2 = batcalc.bte/sht/int(tp)
                                         * pos = intersect(o, tp2, cand, nil) */
 
                                        int cand = getArg(p, j+1);
@@ -115,10 +115,9 @@ OPTdictImplementation(Client cntxt, MalB
                                        pushInstruction(mb,r);
 
                                        int tpe = getVarType(mb, varisdict[k]);
-                                       InstrPtr s = newInstructionArgs(mb, 
batcalcRef, putName(ATOMname(getBatType(tpe))), 3);
+                                       InstrPtr s = newInstructionArgs(mb, 
dictRef, putName("convert"), 3);
                                        getArg(s, 0) = newTmpVariable(mb, tpe);
                                        addArgument(mb, s, getArg(r, 0));
-                                       s = pushNil(mb, s, TYPE_bat);
                                        pushInstruction(mb,s);
 
                                        InstrPtr t = newInstructionArgs(mb, 
algebraRef, intersectRef, 5);
diff --git a/sql/backends/monet5/dict.c b/sql/backends/monet5/dict.c
--- a/sql/backends/monet5/dict.c
+++ b/sql/backends/monet5/dict.c
@@ -128,7 +128,7 @@ DICTdecompress(Client cntxt, MalBlkPtr m
        BAT *u = BATdescriptor(U);
        if (!o || !u) {
                bat_destroy(o);
-               bat_destroy(o);
+               bat_destroy(u);
                throw(SQL, "sql.dict_compress", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
        }
        BAT *b = COLnew(0, u->ttype, BATcount(o), TRANSIENT);
@@ -176,3 +176,43 @@ DICTdecompress(Client cntxt, MalBlkPtr m
        bat_destroy(u);
        return MAL_SUCCEED;
 }
+
+str
+DICTconvert(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       /* convert candidates into bte,sht,int offsets */
+       (void)cntxt;
+       bat *r = getArgReference_bat(stk, pci, 0);
+       bat O = *getArgReference_bat(stk, pci, 1);
+       int rt = getBatType(getArgType(mb, pci, 0));
+
+       BAT *o = BATdescriptor(O);
+       if (!o)
+               throw(SQL, "sql.dict_compress", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+
+       BAT *b = COLnew(0, rt, BATcount(o), TRANSIENT);
+       BATiter oi = bat_iterator(o);
+
+       BUN p, q;
+       if (rt == TYPE_bte) {
+               unsigned char *rp = Tloc(b, 0);
+               oid *op = Tloc(o, 0);
+               BATloop(o, p, q) {
+                       rp[p] = op[p];
+               }
+       } else if (rt == TYPE_sht) {
+               unsigned short *rp = Tloc(b, 0);
+               oid *op = Tloc(o, 0);
+               BATloop(o, p, q) {
+                       rp[p] = op[p];
+               }
+       } else {
+               assert(0);
+       }
+       bat_iterator_end(&oi);
+       BATsetcount(b, BATcount(o));
+       /* TODO correct props and set min/max offset */
+       BBPkeepref(*r = b->batCacheid);
+       bat_destroy(o);
+       return MAL_SUCCEED;
+}
diff --git a/sql/backends/monet5/dict.h b/sql/backends/monet5/dict.h
--- a/sql/backends/monet5/dict.h
+++ b/sql/backends/monet5/dict.h
@@ -6,6 +6,7 @@
 
 extern str DICTcompress(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 extern str DICTdecompress(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
+extern str DICTconvert(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 
 #endif /* _DICT_H */
 
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -5170,6 +5170,7 @@ static mel_func sql_init_funcs[] = {
  pattern("sql", "copy_rejects_clear", COPYrejects_clear, true, "", noargs),
  pattern("dict", "compress", DICTcompress, false, "compress a sql column", 
args(0, 3, arg("schema", str), arg("table", str), arg("column", str))),
  pattern("dict", "decompress", DICTdecompress, false, "decompress a dictionary 
compressed (sub)column", args(1, 3, batargany("", 1), batargany("o", 0), 
batargany("u", 1))),
+ pattern("dict", "convert", DICTconvert, false, "convert candidate list into 
compressed offsets", args(1, 2, batargany("", 1), batargany("o", 0))),
  command("calc", "dec_round", bte_dec_round_wrap, false, "round off the value 
v to nearests multiple of r", args(1,3, arg("",bte),arg("v",bte),arg("r",bte))),
  pattern("batcalc", "dec_round", bte_bat_dec_round_wrap, false, "round off the 
value v to nearests multiple of r", args(1,3, 
batarg("",bte),batarg("v",bte),arg("r",bte))),
  pattern("batcalc", "dec_round", bte_bat_dec_round_wrap, false, "round off the 
value v to nearests multiple of r", args(1,4, 
batarg("",bte),batarg("v",bte),arg("r",bte),batarg("s",oid))),
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to