Changeset: 8d1f270b29c2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8d1f270b29c2
Modified Files:
        gdk/gdk.h
        gdk/gdk_bat.c
        gdk/gdk_private.h
        sql/backends/monet5/sql_gencode.c
        sql/server/rel_schema.c
Branch: arrays
Log Message:

store the real max value of a dimension and not the one inserted by the user


diffs (133 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -858,6 +858,8 @@ typedef struct {
        char map_hheap;         /* mmap mode for head atom heap */
        char map_theap;         /* mmap mode for tail atom heap */
 
+       int array; /*the BAT represents an array*/
+
        /* delta status administration */
        BUN deleted;            /* start of deleted elements */
        BUN first;              /* to store next deletion */
@@ -967,6 +969,8 @@ typedef int (*GDKfcn) ();
 #define batMaptail     S->map_tail
 #define batMaphheap    S->map_hheap
 #define batMaptheap    S->map_theap
+
+#define batArray S->array
 /*
  * @- Heap Management
  * Heaps are the low-level entities of mass storage in
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -247,6 +247,7 @@ BATnewstorage(int ht, int tt, BUN cap, i
 
        BATsetdims(bn);
        bn->batCapacity = cap;
+       bn->batArray = 0; /*by default is not an aray*/
 
        /* alloc the main heaps */
        if (ht && HEAPalloc(&bn->H->heap, cap, bn->H->width) < 0) {
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -479,6 +479,7 @@ fprintf(stderr, "createDimension: %ld to
         BATsetcount(resBAT,elementRepeats+groupRepeats+1); \
         BATseqbase(resBAT,0); \
         BATderiveProps(resBAT,FALSE); \
+               resBAT->batArray=1; \
                resBAT; \
        })
 
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
@@ -1337,14 +1337,9 @@ static int
                                switch (s->flag) {
                                case cmp_equal:{
                                        q = newStmt2(mb, algebraRef, cmd);
-                                       if(s->op1->type == st_dimension) {      
                                        
-                                               q = pushArgument(mb, q, l);
-                                       } else {
-                                               q = pushArgument(mb, q, l);
-                                               if (sub > 0)
-                                                       q = pushArgument(mb, q, 
sub);
-                                       }
-                               
+                                       q = pushArgument(mb, q, l);
+                                       if (sub > 0)
+                                               q = pushArgument(mb, q, sub);
                                        q = pushArgument(mb, q, r);
                                        q = pushArgument(mb, q, r);
                                        q = pushBit(mb, q, TRUE);
@@ -1655,9 +1650,9 @@ static int
                                }
                                /* projections, ie left is void headed */
                                if(s->op2->type == st_dimension) {
-                                       if(s->op1->type == st_uselect && 
s->op1->op1->type == st_bat)
-                                               q = newStmt1(mb, algebraRef, 
"non_dimension_leftfetchjoin");
-                                       else
+//                                     if(s->op1->type == st_uselect && 
s->op1->op1->type == st_bat)
+//                                             q = newStmt1(mb, algebraRef, 
"non_dimension_leftfetchjoin");
+//                                     else
                                                q = newStmt1(mb, algebraRef, 
"dimension_leftfetchjoin");
                                } else {
                                        if (cmp == cmp_project)
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -473,34 +473,51 @@ static int dimension_range(mvc *sql, sql
                break;  
     }
 
+       //make sure that the maximum element is stored
        atom_cast(dim->min, &dim->type);
     atom_cast(dim->step, &dim->type);
     atom_cast(dim->max, &dim->type);
 
+
     if(!dim->unbounded_min && !dim->unbounded_max) {
-        switch(dim->type.type->localtype) {
+#define maxElement(TPE, min, max, step) \
+       ({ \
+        TPE it, maxE; \
+        for(it = min ; it <= max ; it += step) \
+                       maxE = it; \
+               maxE; \
+    })
+       switch(dim->type.type->localtype) {
         case TYPE_bte:
+                       dim->max->data.val.btval = maxElement(bte, 
dim->min->data.val.btval, dim->max->data.val.btval, dim->step->data.val.btval);
             dim->elementsNum = floor((dim->max->data.val.btval - 
dim->min->data.val.btval )/ dim->step->data.val.btval)+1;
             break;
         case TYPE_sht:
+            dim->max->data.val.shval = maxElement(sht, 
dim->min->data.val.shval, dim->max->data.val.shval, dim->step->data.val.shval);
             dim->elementsNum = floor((dim->max->data.val.shval - 
dim->min->data.val.shval )/ dim->step->data.val.shval)+1;
             break;
         case TYPE_int:
+            dim->max->data.val.ival = maxElement(int, dim->min->data.val.ival, 
dim->max->data.val.ival, dim->step->data.val.ival);
             dim->elementsNum = floor((dim->max->data.val.ival - 
dim->min->data.val.ival )/ dim->step->data.val.ival)+1;
             break;
         case TYPE_wrd:
+            dim->max->data.val.wval = maxElement(wrd, dim->min->data.val.wval, 
dim->max->data.val.wval, dim->step->data.val.wval);
             dim->elementsNum = floor((dim->max->data.val.wval - 
dim->min->data.val.wval )/ dim->step->data.val.wval)+1;
             break;
         case TYPE_oid:
+            dim->max->data.val.oval = maxElement(oid, dim->min->data.val.oval, 
dim->max->data.val.oval, dim->step->data.val.oval);
             dim->elementsNum = floor((dim->max->data.val.oval - 
dim->min->data.val.oval )/ dim->step->data.val.oval)+1;
             break;
         case TYPE_lng:
+            dim->max->data.val.lval = maxElement(lng, dim->min->data.val.lval, 
dim->max->data.val.lval, dim->step->data.val.lval);
             dim->elementsNum = floor((dim->max->data.val.lval - 
dim->min->data.val.lval )/ dim->step->data.val.lval)+1;
             break;
         case TYPE_dbl:
+            dim->max->data.val.dval = maxElement(dbl, dim->min->data.val.dval, 
dim->max->data.val.dval, dim->step->data.val.dval);
             dim->elementsNum = floor((dim->max->data.val.dval - 
dim->min->data.val.dval )/ dim->step->data.val.dval)+1;
             break;
         case TYPE_flt:
+            dim->max->data.val.fval = maxElement(flt, dim->min->data.val.fval, 
dim->max->data.val.fval, dim->step->data.val.fval);
             dim->elementsNum = floor((dim->max->data.val.fval - 
dim->min->data.val.fval )/ dim->step->data.val.fval)+1;
             break;
         default:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to