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