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

Reply via email to