Changeset: 9b27b8134269 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9b27b8134269
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql.h
sql/backends/monet5/sql.mal
sql/common/sql_types.c
sql/server/rel_distribute.c
sql/server/rel_dump.c
sql/server/rel_optimizer.c
sql/server/sql_mvc.c
sql/storage/bat/bat_storage.c
sql/storage/restrict/restrict_storage.c
sql/storage/sql_storage.h
Branch: default
Log Message:
added initial support for using the var heaps dictionary table from sql.
On the sql level the used var columns can be rewriten into dict's + joins.
With some group by push down this give more efficient execution.
Currently this is not enable, use --set sql_debug=8 to use this.
diffs (truncated from 902 to 300 lines):
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1136,19 +1136,40 @@ static stmt *
rel2bin_basetable( mvc *sql, sql_rel *rel)
{
sql_table *t = rel->l;
+ sql_column *c = rel->r;
list *l = sa_list(sql->sa);
- stmt *dels = stmt_dels( sql, t);
+ stmt *dels;
node *en;
+ if (!t && c)
+ t = c->t;
+ dels = stmt_dels( sql, t);
+
+ /* add aliases */
assert(rel->exps);
- /* add aliases */
for( en = rel->exps->h; en; en = en->next ) {
sql_exp *exp = en->data;
char *rname = exp->rname?exp->rname:exp->l;
char *oname = exp->r;
stmt *s = NULL;
- if (oname[0] == '%' && strcmp(oname, TID) == 0) {
+ if (is_func(exp->type)) {
+ list *exps = exp->l;
+ sql_exp *cexp = exps->h->data;
+ char *cname = cexp->r;
+ list *l = sa_list(sql->sa);
+
+ c = find_sql_column(t, cname);
+ s = stmt_col(sql, c, dels);
+ append(l, s);
+ if (exps->h->next) {
+ sql_exp *at = exps->h->next->data;
+ stmt *u = exp_bin(sql, at, NULL, NULL, NULL,
NULL, NULL, NULL);
+
+ append(l, u);
+ }
+ s = stmt_Nop(sql->sa, stmt_list(sql->sa, l), exp->f);
+ } else if (oname[0] == '%' && strcmp(oname, TID) == 0) {
/* tid function sql.tid(t) */
char *rnme = t->base.name;
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
@@ -4508,3 +4508,191 @@ freeVariables(Client c, MalBlkPtr mb, Ma
}
mb->ptop = j;
}
+
+/* if at least (2*SIZEOF_BUN), also store length (heaps are then
+ * incompatible) */
+#define EXTRALEN ((SIZEOF_BUN + GDK_VARALIGN - 1) & ~(GDK_VARALIGN - 1))
+
+str
+STRindex_int(int *i, str src, bit *u)
+{
+ (void)src; (void)u;
+ *i = 0;
+ return MAL_SUCCEED;
+}
+
+str
+BATSTRindex_int(bat *res, bat *src, bit *u)
+{
+ BAT *s, *r;
+
+ if ((s = BATdescriptor(*src)) == NULL)
+ throw(SQL, "calc.index", "Cannot access descriptor");
+
+ if (*u) {
+ Heap *h = s->T->vheap;
+ size_t pad, pos;
+ const size_t extralen = h->hashash ? EXTRALEN : 0;
+ int v;
+
+ r = BATnew(TYPE_void, TYPE_int, 1024);
+ BATseqbase(r, 0);
+ pos = GDK_STRHASHSIZE;
+ while (pos < h->free) {
+ const char *s;
+
+ pad = GDK_VARALIGN - (pos & (GDK_VARALIGN - 1));
+ if (pad < sizeof(stridx_t))
+ pad += GDK_VARALIGN;
+ pos += pad + extralen;
+ s = h->base + pos;
+ v = pos-GDK_STRHASHSIZE;
+ BUNappend(r, &v, FALSE);
+ pos += GDK_STRLEN(s);
+ }
+ } else {
+ r = VIEWcreate(s, s);
+ r->ttype = TYPE_int;
+ r->tvarsized = 0;
+ r->T->vheap = NULL;
+ }
+ BBPunfix(s->batCacheid);
+ BBPkeepref((*res = r->batCacheid));
+ return MAL_SUCCEED;
+}
+
+str
+STRindex_sht(sht *i, str src, bit *u)
+{
+ (void)src; (void)u;
+ *i = 0;
+ return MAL_SUCCEED;
+}
+
+str
+BATSTRindex_sht(bat *res, bat *src, bit *u)
+{
+ BAT *s, *r;
+
+ if ((s = BATdescriptor(*src)) == NULL)
+ throw(SQL, "calc.index", "Cannot access descriptor");
+
+ if (*u) {
+ Heap *h = s->T->vheap;
+ size_t pad, pos;
+ const size_t extralen = h->hashash ? EXTRALEN : 0;
+ sht v;
+
+ r = BATnew(TYPE_void, TYPE_sht, 1024);
+ BATseqbase(r, 0);
+ pos = GDK_STRHASHSIZE;
+ while (pos < h->free) {
+ const char *s;
+
+ pad = GDK_VARALIGN - (pos & (GDK_VARALIGN - 1));
+ if (pad < sizeof(stridx_t))
+ pad += GDK_VARALIGN;
+ pos += pad + extralen;
+ s = h->base + pos;
+ v = pos-GDK_STRHASHSIZE;
+ BUNappend(r, &v, FALSE);
+ pos += GDK_STRLEN(s);
+ }
+ } else {
+ r = VIEWcreate(s, s);
+ r->ttype = TYPE_sht;
+ r->tvarsized = 0;
+ r->T->vheap = NULL;
+ }
+ BBPunfix(s->batCacheid);
+ BBPkeepref((*res = r->batCacheid));
+ return MAL_SUCCEED;
+}
+
+str
+STRindex_bte(bte *i, str src, bit *u)
+{
+ (void)src; (void)u;
+ *i = 0;
+ return MAL_SUCCEED;
+}
+
+str
+BATSTRindex_bte(bat *res, bat *src, bit *u)
+{
+ BAT *s, *r;
+
+ if ((s = BATdescriptor(*src)) == NULL)
+ throw(SQL, "calc.index", "Cannot access descriptor");
+
+ if (*u) {
+ Heap *h = s->T->vheap;
+ size_t pad, pos;
+ const size_t extralen = h->hashash ? EXTRALEN : 0;
+ bte v;
+
+ r = BATnew(TYPE_void, TYPE_bte, 64);
+ BATseqbase(r, 0);
+ pos = GDK_STRHASHSIZE;
+ while (pos < h->free) {
+ const char *s;
+
+ pad = GDK_VARALIGN - (pos & (GDK_VARALIGN - 1));
+ if (pad < sizeof(stridx_t))
+ pad += GDK_VARALIGN;
+ pos += pad + extralen;
+ s = h->base + pos;
+ v = pos-GDK_STRHASHSIZE;
+ BUNappend(r, &v, FALSE);
+ pos += GDK_STRLEN(s);
+ }
+ } else {
+ r = VIEWcreate(s, s);
+ r->ttype = TYPE_bte;
+ r->tvarsized = 0;
+ r->T->vheap = NULL;
+ }
+ BBPunfix(s->batCacheid);
+ BBPkeepref((*res = r->batCacheid));
+ return MAL_SUCCEED;
+}
+
+str
+STRstrings(str *i, str src)
+{
+ (void)src;
+ *i = 0;
+ return MAL_SUCCEED;
+}
+
+str
+BATSTRstrings(bat *res, bat *src)
+{
+ BAT *s, *r;
+ Heap *h;
+ size_t pad, pos;
+ size_t extralen;
+
+ if ((s = BATdescriptor(*src)) == NULL)
+ throw(SQL, "calc.strings", "Cannot access descriptor");
+
+ h = s->T->vheap;
+ extralen = h->hashash ? EXTRALEN : 0;
+ r = BATnew(TYPE_void, TYPE_str, 1024);
+ BATseqbase(r, 0);
+ pos = GDK_STRHASHSIZE;
+ while (pos < h->free) {
+ const char *s;
+
+ pad = GDK_VARALIGN - (pos & (GDK_VARALIGN - 1));
+ if (pad < sizeof(stridx_t))
+ pad += GDK_VARALIGN;
+ pos += pad + extralen;
+ s = h->base + pos;
+ BUNappend(r, s, FALSE);
+ pos += GDK_STRLEN(s);
+ }
+ BBPunfix(s->batCacheid);
+ BBPkeepref((*res = r->batCacheid));
+ return MAL_SUCCEED;
+}
diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h
--- a/sql/backends/monet5/sql.h
+++ b/sql/backends/monet5/sql.h
@@ -313,4 +313,13 @@ sql5_export str timestamp_2_daytime(dayt
sql5_export str date_2_timestamp(timestamp *res, date *v, int *d);
sql5_export str SQLcurrent_daytime(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str SQLcurrent_timestamp(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
+
+sql5_export str STRindex_int(int *res, str src, bit *u);
+sql5_export str BATSTRindex_int(bat *res, bat *src, bit *u);
+sql5_export str STRindex_sht(sht *res, str src, bit *u);
+sql5_export str BATSTRindex_sht(bat *res, bat *src, bit *u);
+sql5_export str STRindex_bte(bte *res, str src, bit *u);
+sql5_export str BATSTRindex_bte(bat *res, bat *src, bit *u);
+sql5_export str STRstrings(str *res, str src);
+sql5_export str BATSTRstrings(bat *res, bat *src);
#endif /* _SQL_H */
diff --git a/sql/backends/monet5/sql.mal b/sql/backends/monet5/sql.mal
--- a/sql/backends/monet5/sql.mal
+++ b/sql/backends/monet5/sql.mal
@@ -1004,6 +1004,37 @@ command calc.timestamp( v:date, d:int) :
address date_2_timestamp
comment "cast date to a timestamp and check for overflow";
+command calc.index(v:str, u:bit) :bte
+address STRindex_bte
+comment "Return the offsets as an index bat";
+
+command batcalc.index(v:bat[:oid,:str], u:bit) :bat[:oid,:bte]
+address BATSTRindex_bte
+comment "Return the offsets as an index bat";
+
+command calc.index(v:str, u:bit) :sht
+address STRindex_sht
+comment "Return the offsets as an index bat";
+
+command batcalc.index(v:bat[:oid,:str], u:bit) :bat[:oid,:sht]
+address BATSTRindex_sht
+comment "Return the offsets as an index bat";
+
+command calc.index(v:str, u:bit) :int
+address STRindex_int
+comment "Return the offsets as an index bat";
+
+command batcalc.index(v:bat[:oid,:str], u:bit) :bat[:oid,:int]
+address BATSTRindex_int
+comment "Return the offsets as an index bat";
+
+command calc.strings(v:str) :str
+address STRstrings
+comment "Return the strings";
+
+command batcalc.strings(v:bat[:oid,:str]) :bat[:oid,:str]
+address BATSTRstrings
+comment "Return the strings";
include sql_decimal;
include sql_rank;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list