Changeset: 209bc2c008f2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=209bc2c008f2
Modified Files:
monetdb5/optimizer/opt_prelude.c
monetdb5/optimizer/opt_prelude.h
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql.h
sql/backends/monet5/sql.mal
sql/backends/monet5/sql_gencode.c
sql/backends/monet5/sql_statement.c
sql/backends/monet5/sql_statement.h
sql/include/sql_catalog.h
sql/include/sql_relation.h
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_optimizer.c
sql/server/rel_planner.c
sql/server/rel_schema.c
sql/server/rel_select.c
sql/server/sql_mvc.c
sql/server/sql_mvc.h
sql/storage/store.c
Branch: arrays
Log Message:
dimensions are materialised before showing the results.
However, for some reason all values of dimension are 0.
diffs (truncated from 845 to 300 lines):
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
@@ -55,6 +55,7 @@ str projectdeltaRef;
str binddbatRef;
str bindidxRef;
str bindRef;
+str createDimRef;
str bpmRef;
str bstreamRef;
str calcRef;
@@ -310,6 +311,7 @@ void optimizerInit(void)
binddbatRef = putName("bind_dbat",9);
bindidxRef = putName("bind_idxbat",11);
bindRef = putName("bind",4);
+ createDimRef = putName("create_dimension",16);
bpmRef = putName("bpm",3);
bstreamRef = putName("bstream",7);
calcRef = putName("calc",4);
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
@@ -53,6 +53,7 @@ opt_export str projectdeltaRef;
opt_export str binddbatRef;
opt_export str bindidxRef;
opt_export str bindRef;
+opt_export str createDimRef;
opt_export str bpmRef;
opt_export str bstreamRef;
opt_export str calcRef;
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
@@ -546,6 +546,7 @@ exp_bin(mvc *sql, sql_exp *e, stmt *left
if (exp_card(e) > CARD_AGGR)
s->nrcols = 2;
} break;
+ case e_dimension: //not sure what the result is used for
case e_column: {
if (right) /* check relation names */
s = bin_find_column(sql->sa, right, e->l, e->r);
@@ -758,7 +759,7 @@ stmt_col( mvc *sql, sql_column *c, stmt
{
stmt *sc = stmt_bat(sql->sa, c, RDONLY);
- if (isTable(c->t) && c->t->access != TABLE_READONLY &&
+ if ((isTable(c->t) || isArray(c->t)) && c->t->access != TABLE_READONLY
&&
(c->base.flag != TR_NEW || c->t->base.flag != TR_NEW /* alter */) &&
(c->t->persistence == SQL_PERSIST || c->t->persistence ==
SQL_DECLARED_TABLE) && !c->t->commit_action) {
stmt *i = stmt_bat(sql->sa, c, RD_INS);
@@ -1208,9 +1209,13 @@ rel2bin_basetable( mvc *sql, sql_rel *re
s = stmt_idx(sql, i, dels);
} else {
- sql_column *c = find_sql_column(t, oname);
-
- s = stmt_col(sql, c, dels);
+ if(exp->type == e_dimension) {
+ sql_dimension *dim = find_sql_dimension(t,
oname);
+ s = stmt_dimension(sql->sa, dim);
+ } else {
+ sql_column *c = find_sql_column(t, oname);
+ s = stmt_col(sql, c, dels);
+ }
}
s->tname = rname;
s->cname = exp->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
@@ -1636,6 +1636,92 @@ mvc_bind(mvc *m, char *sname, char *tnam
}
static BAT *
+mvc_create_dimension_bat(mvc *m, char *sname, char *tname, char *dname)
+{
+ BAT *b = NULL;
+ sql_schema *s = NULL;
+ sql_table *t = NULL;
+ sql_dimension *dim = NULL;
+ long repeat1 = 0, repeat2 =0, totalElements =0;
+ long i=0, j=0;
+
+ s = mvc_bind_schema(m, sname);
+ if (s == NULL)
+ return NULL;
+ t = mvc_bind_table(m, s, tname);
+ if (t == NULL)
+ return NULL;
+ dim = mvc_bind_dimension(m, t, dname);
+ if (dim == NULL)
+ return NULL;
+
+ repeat1 = dim->lvl1_repeatsNum;
+ repeat2 = dim->lvl2_repeatsNum;
+
+#define materialiseDim(TPE, min, step, max) \
+ do { \
+ TPE it, *elements; \
+ totalElements = floor((max - min )/ step)+1; \
+\
+ if((b = BATnew(TYPE_void, TYPE_##TPE,
totalElements*repeat1*repeat2, TRANSIENT)) == NULL) \
+ return NULL; \
+\
+ elements = (TPE*) Tloc(b, BUNfirst(b)); \
+\
+ totalElements = 0; \
+ for(j=0; j<repeat2; j++) { \
+ for(it = min ; it <= max ; it += step) { \
+ for(i=0; i<repeat1; i++) { \
+ *elements = (TPE) it; \
+ elements++; \
+ totalElements++; \
+ } \
+ } \
+ } \
+\
+ b->tsorted = 0; \
+ b->trevsorted = 0; \
+ } while (0)
+
+ atom_cast(dim->min, &dim->type);
+ atom_cast(dim->step, &dim->type);
+ atom_cast(dim->max, &dim->type);
+
+ switch (dim->type.type->localtype) {
+ case TYPE_bte:
+ materialiseDim(bte, dim->min->data.val.btval,
dim->step->data.val.btval, dim->max->data.val.btval);
+ break;
+ case TYPE_sht:
+ materialiseDim(sht, dim->min->data.val.shval,
dim->step->data.val.shval, dim->max->data.val.shval);
+ break;
+ case TYPE_int:
+ materialiseDim(int, dim->min->data.val.ival,
dim->step->data.val.ival, dim->max->data.val.ival);
+ break;
+ case TYPE_lng:
+ materialiseDim(lng, dim->min->data.val.lval,
dim->step->data.val.lval, dim->max->data.val.lval);
+ break;
+#ifdef HAVE_HGE
+ case TYPE_hge:
+ materialiseDim(hge, dim->min->data.val.hval,
dim->step->data.val.hval, dim->max->data.val.hval);
+ break;
+#endif
+ case TYPE_flt:
+ materialiseDim(flt, dim->min->data.val.fval,
dim->step->data.val.fval, dim->max->data.val.fval);
+ break;
+ case TYPE_dbl:
+ materialiseDim(dbl, dim->min->data.val.dval,
dim->step->data.val.dval, dim->max->data.val.dval);
+ break;
+ default:
+ fprintf(stderr, "mvc_create_dimension_bat: dimension
type not handled\n");
+ }
+
+ BATsetcount(b,totalElements);
+ BATderiveProps(b,FALSE);
+
+ return b;
+}
+
+static BAT *
mvc_bind_dbat(mvc *m, char *sname, char *tname, int access)
{
sql_trans *tr = m->session->tr;
@@ -1757,6 +1843,33 @@ mvc_bind_wrap(Client cntxt, MalBlkPtr mb
throw(SQL, "sql.bind", "unable to find %s(%s)", *tname, *cname);
}
+str
+mvc_create_dimension_bat_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci)
+{
+ int upd = (pci->argc == 7 || pci->argc == 9);
+ BAT *b = NULL;
+ bat *bid = getArgReference_bat(stk, pci, 0);
+ mvc *m = NULL;
+ str msg;
+ str *sname = getArgReference_str(stk, pci, 2 + upd);
+ str *tname = getArgReference_str(stk, pci, 3 + upd);
+ str *dname = getArgReference_str(stk, pci, 4 + upd);
+
+ if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
+ return msg;
+ if ((msg = checkSQLContext(cntxt)) != NULL)
+ return msg;
+ b = mvc_create_dimension_bat(m, *sname, *tname, *dname);
+ if(b) {
+ BBPkeepref(*bid = b->batCacheid);
+ return MAL_SUCCEED;
+ }
+ if (*sname && strcmp(*sname, str_nil) != 0)
+ throw(SQL, "sql.create_dimension", "unable to find %s.%s(%s)",
*sname, *tname, *dname);
+ throw(SQL, "sql.create_dimension", "unable to find %s(%s)", *tname,
*dname);
+
+ }
+
/* str mvc_bind_idxbat_wrap(int *bid, str *sname, str *tname, str *iname, int
*access); */
str
mvc_bind_idxbat_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
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
@@ -88,6 +88,7 @@ sql5_export str SQLcatalog(Client cntxt,
sql5_export str mvc_append_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str mvc_update_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str mvc_bind_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
+sql5_export str mvc_create_dimension_bat_wrap(Client cntxt, MalBlkPtr mb,
MalStkPtr stk, InstrPtr pci);
sql5_export str mvc_bind_idxbat_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
sql5_export str mvc_clear_table_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
sql5_export str mvc_delete_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
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
@@ -218,6 +218,10 @@ comment "Bind the 'schema.table.column'
1 - inserts
2 - updates";
+pattern create_dimension(mvc:int, schema:str, table:str,
dimension:str):bat[:oid,:any_1]
+address mvc_create_dimension_bat_wrap
+comment "Bind the 'schema.table.dimension' BAT;
+
command delta ( col:bat[:oid,:any_3], uid:bat[:oid,:oid],
uval:bat[:oid,:any_3], ins:bat[:oid,:any_3] )
:bat[:oid,:any_3]
address DELTAbat
diff --git a/sql/backends/monet5/sql_gencode.c
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -2508,6 +2508,38 @@ static int
if (q == NULL)
return -1;
} break;
+ case st_dimension: {
+ int ht = TYPE_oid;
+ int tt = s->op4.dval->type.type->localtype;
+ sql_table *t = s->op4.dval->t;
+/*
+ int min=0, step=0, max=0;
+
+ if ((min = _dumpstmt(sql, mb, s->op1)) < 0)
+ return -1;
+ if ((step = _dumpstmt(sql, mb, s->op2)) < 0)
+ return -1;
+ if ((max = _dumpstmt(sql, mb, s->op3)) < 0)
+ return -1;
+ assert(min >= 0 && step >= 0 && max >= 0);
+
+
+ q = newStmt2(mb, sqlRef, "dimension_bat");
+*/
+ q = newStmt2(mb, sqlRef, createDimRef);
+ if (q == NULL)
+ return -1;
+ setVarType(mb, getArg(q, 0), newBatType(ht, tt));
+ setVarUDFtype(mb, getArg(q, 0));
+
+ q = pushArgument(mb, q, sql->mvc_var);
+ q = pushSchema(mb, q, t);
+ q = pushStr(mb, q, t->base.name);
+ q = pushStr(mb, q, s->op4.dval->base.name);
+ if (q == NULL)
+ return -1;
+ s->nr = getDestVar(q);
+ } break;
}
if (mb->errors)
return -1;
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
@@ -412,6 +412,7 @@ stmt_deps(list *dep_list, stmt *s, int d
case st_atom:
case st_trans:
case st_catalog:
+ case st_dimension:
break;
}
}
@@ -829,6 +830,14 @@ stmt_atom(sql_allocator *sa, atom *op1)
return s;
}
+stmt* stmt_dimension(sql_allocator *sa, sql_dimension* dim) {
+ stmt *s = stmt_create(sa, st_dimension);
+ s->op4.dval = dim;
+ s->nrcols = 1;
+
+ return s;
+}
+
stmt *
stmt_genselect(sql_allocator *sa, stmt *lops, stmt *rops, sql_subfunc *f, stmt
*sub)
{
@@ -1314,6 +1323,8 @@ tail_type(stmt *st)
return NULL;
case st_table:
return sql_bind_localtype("bat");
+ case st_dimension:
+ return &st->op4.dval->type;
default:
fprintf(stderr, "missing tail type %u: %s\n", st->type,
st_type2string(st->type));
assert(0);
diff --git a/sql/backends/monet5/sql_statement.h
b/sql/backends/monet5/sql_statement.h
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list