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