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

small fixes (ie don't assert but throw errors)
set seqbase

join over equal dict value bat (not sure about joins over 2 sides dictionaries 
with different value bats yet)


diffs (110 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
@@ -133,6 +133,20 @@ OPTdictImplementation(Client cntxt, MalB
 
                                        done = 1;
                                        break;
+                               } else if (j == 2 && p->argc > j+1 && 
getModuleId(p) == algebraRef && getFunctionId(p) == joinRef
+                                               && varisdict[getArg(p, j+1)] && 
vardictvalue[k] == vardictvalue[getArg(p, j+1)]) {
+                                       /* (r1, r2) = join(col1, col2, cand1, 
cand2, ...) with
+                                        *              col1 = 
dict.decompress(o1,u1), col2 = dict.decompress(o2,u2)
+                                        *              iff u1 == u2
+                                        *                      (r1, r2) = 
join(o1, o2, cand1, cand2, ...)
+                                        *              else go for decompress 
*/
+                                       int l = getArg(p, j+1);
+                                       InstrPtr r = copyInstruction(p);
+                                       getArg(r, j+0) = varisdict[k];
+                                       getArg(r, j+1) = varisdict[l];
+                                       pushInstruction(mb,r);
+                                       done = 1;
+                                       break;
                                } else if ((isMapOp(p) || isMap2Op(p)) && 
allConstExcept(mb, p, j)) {
                                        /* batcalc.-(1, col) with col = 
dict.decompress(o,u)
                                         * v1 = batcalc.-(1, u)
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
@@ -25,11 +25,14 @@ DICTcompress(Client cntxt, MalBlkPtr mb,
        tr = be->mvc->session->tr;
 
        sql_schema *s = find_sql_schema(tr, sname);
-       assert(s);
+       if (!s)
+               throw(SQL, "sql.dict_compress", SQLSTATE(3F000) "schema '%s' 
unknown", sname);
        sql_table *t = find_sql_table(tr, s, tname);
-       assert(t);
+       if (!t)
+               throw(SQL, "sql.dict_compress", SQLSTATE(3F000) "table '%s.%s' 
unknown", sname, tname);
        sql_column *c = find_sql_column(t, cname);
-       assert(c);
+       if (!c)
+               throw(SQL, "sql.dict_compress", SQLSTATE(3F000) "column 
'%s.%s.%s' unknown", sname, tname, cname);
 
        sqlstore *store = tr->store;
        BAT *b = store->storage_api.bind_col(tr, c, RDONLY);
@@ -61,11 +64,12 @@ DICTcompress(Client cntxt, MalBlkPtr mb,
        bat_destroy(uv);
        u = uu;
 
-       BAT *o = COLnew(0, tt, BATcount(b), PERSISTENT);
+       BAT *o = COLnew(b->hseqbase, tt, BATcount(b), PERSISTENT);
        if (!o || BAThash(u) != GDK_SUCCEED) {
                bat_destroy(u);
                throw(SQL, "sql.dict_compress", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
        }
+
        BUN p, q;
        BATiter bi = bat_iterator(b);
        BATiter ui = bat_iterator_nolock(u);
@@ -83,8 +87,10 @@ DICTcompress(Client cntxt, MalBlkPtr mb,
                o->tnil = b->tnil;
                o->tnonil = b->tnonil;
                o->tkey = b->tkey;
-               if (sql_trans_alter_storage(tr, c, "DICT") != LOG_OK || 
store->storage_api.col_dict(tr, c, o, u) != LOG_OK)
+               if (sql_trans_alter_storage(tr, c, "DICT") != LOG_OK || 
store->storage_api.col_dict(tr, c, o, u) != LOG_OK) {
+                       bat_iterator_end(&bi);
                        throw(SQL, "sql.dict_compress", SQLSTATE(HY013) 
"alter_storage failed");
+               }
        } else if (tt == TYPE_sht) {
                sht *op = (sht*)Tloc(o, 0);
                BATloop(b, p, q) {
@@ -99,8 +105,10 @@ DICTcompress(Client cntxt, MalBlkPtr mb,
                o->tnil = b->tnil;
                o->tnonil = b->tnonil;
                o->tkey = b->tkey;
-               if (sql_trans_alter_storage(tr, c, "DICT") != LOG_OK || 
store->storage_api.col_dict(tr, c, o, u) != LOG_OK)
+               if (sql_trans_alter_storage(tr, c, "DICT") != LOG_OK || 
store->storage_api.col_dict(tr, c, o, u) != LOG_OK) {
+                       bat_iterator_end(&bi);
                        throw(SQL, "sql.dict_compress", SQLSTATE(HY013) 
"alter_storage failed");
+               }
        } else {
                printf("implement int cases \n");
        }
@@ -131,12 +139,11 @@ DICTdecompress(Client cntxt, MalBlkPtr m
                bat_destroy(u);
                throw(SQL, "sql.dict_compress", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
        }
-       BAT *b = COLnew(0, u->ttype, BATcount(o), TRANSIENT);
 
+       BAT *b = COLnew(o->hseqbase, u->ttype, BATcount(o), TRANSIENT);
        BUN p, q;
        BATiter oi = bat_iterator(o);
        BATiter ui = bat_iterator_nolock(u);
-       //if (ATOMvarsized(u->ttype)) {
        if (o->ttype == TYPE_bte) {
                unsigned char *op = Tloc(o, 0);
                BATloop(o, p, q) {
@@ -190,10 +197,10 @@ DICTconvert(Client cntxt, MalBlkPtr mb, 
        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);
+       BAT *b = COLnew(o->hseqbase, rt, BATcount(o), TRANSIENT);
 
        BUN p, q;
+       BATiter oi = bat_iterator(o);
        if (rt == TYPE_bte) {
                unsigned char *rp = Tloc(b, 0);
                oid *op = Tloc(o, 0);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to