Changeset: 5001ef433a19 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5001ef433a19
Modified Files:
gdk/gdk_join.c
monetdb5/modules/mal/batcalc.c
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
sql/server/rel_select.c
sql/server/rel_updates.c
Branch: arrays
Log Message:
1. materialising dimensions before adding/subtracting etc
2. if oids do not create a dimension proceed as having a relational bat
diffs (225 lines):
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -3228,8 +3228,13 @@ BATproject(BAT *l, BAT *r)
assert(BAThdense(r));
assert(ATOMtype(l->ttype) == TYPE_oid);
- if(isBATarray(r))
- return BATdimensionProject(l, r);
+ if(isBATarray(r)) {
+ bn = BATdimensionProject(l, r);
+ if(bn)
+ return bn;
+ //otherwise it is cannot be expressed as an array and we
proceed as if it is any other BAT
+ r = materialiseDimensionBAT(r);
+ }
if (BATtdense(l) && BATcount(l) > 0) {
lo = l->tseqbase;
@@ -3449,7 +3454,7 @@ BAT* BATdimensionProject(BAT* oidsBAT, B
foundMax=0; \
\
if(elementsInGroup >= 0 &&
elementsInGroup != (cnt-1)) { \
- GDKerror("BATdimensionProject:
dimension not regular (different number of elements among groups %ld vs
%ld)\n", elementsInGroup, cnt); \
+ /* GDKerror("BATdimensionProject:
dimension not regular (different number of elements among groups %ld vs
%ld)\n", elementsInGroup, cnt); */\
return NULL; \
} \
elementsInGroup = cnt-1; /*the current
element does not belong in the group*/\
@@ -3464,15 +3469,15 @@ BAT* BATdimensionProject(BAT* oidsBAT, B
} \
} \
if(flg>0) { \
- GDKerror("BATdimensionProject: dimension not regular
(max %ld more times than min)\n", flg); \
+/* GDKerror("BATdimensionProject: dimension not regular
(max %ld more times than min)\n", flg); */\
return NULL; \
} else if(flg<0) { \
- GDKerror("BATdimensionProject: dimension not regular
(min %ld more times than max)\n", flg); \
+/* GDKerror("BATdimensionProject: dimension not regular
(min %ld more times than max)\n", flg); */\
return NULL; \
} \
/*check the last group*/ \
if(elementsInGroup >= 0 && elementsInGroup != cnt) { \
- GDKerror("BATdimensionProject: dimension not regular
(different number of elements among groups %ld vs %ld)\n", elementsInGroup,
cnt); \
+/* GDKerror("BATdimensionProject: dimension not regular
(different number of elements among groups %ld vs %ld)\n", elementsInGroup,
cnt); */\
return NULL; \
} \
elementsInGroup = cnt; \
@@ -3501,14 +3506,14 @@ fprintf(stderr, "dimensionise: Group:[%l
} \
else { \
if(resElementRepeats >=0 &&
resElementRepeats != r) { \
-
GDKerror("BATdimensionProject: dimension not regular (different number of
repetitions %ld vs %ld)\n", resElementRepeats, r); \
+/*
GDKerror("BATdimensionProject: dimension not regular (different number of
repetitions %ld vs %ld)\n", resElementRepeats, r); */\
return NULL; \
} else if(resElementRepeats <0)
{ \
resElementRepeats = r; \
resStep = el_cur -
el_prev; \
} \
if(resStep != (el_cur -
el_prev)) { \
-
GDKerror("BATdimensionProject: dimension not regular (not equal steps)\n"); \
+/*
GDKerror("BATdimensionProject: dimension not regular (not equal steps)\n"); */\
return NULL; \
} \
el_prev=el_cur; \
@@ -3517,7 +3522,7 @@ fprintf(stderr, "dimensionise: Group:[%l
} \
/*check the last element in the group*/ \
if(resElementRepeats >=0 && resElementRepeats
!= r) { \
- GDKerror("BATdimensionProject:
dimension not regular (different number of repetitions %ld vs %ld)\n",
resElementRepeats, r); \
+/* GDKerror("BATdimensionProject:
dimension not regular (different number of repetitions %ld vs %ld)\n",
resElementRepeats, r); */\
return NULL; \
} else if(resElementRepeats <0) { \
/*It should never reach this*/ \
@@ -3540,14 +3545,14 @@ fprintf(stderr, "dimensionise: Group:[%l
} \
else { \
if(resElementRepeats >=0 && resElementRepeats
!= r) { \
- GDKerror("BATdimensionProject:
dimension not regular (different number of repetitionsi %ld vs %ld)\n",
resElementRepeats, r); \
+/* GDKerror("BATdimensionProject:
dimension not regular (different number of repetitionsi %ld vs %ld)\n",
resElementRepeats, r); */\
return NULL; \
} else if(resElementRepeats <0) { \
resElementRepeats = r; \
resStep = el_cur - el_prev; \
} \
if(resStep != (el_cur - el_prev)) { \
- GDKerror("BATdimensionProject:
dimension not regular (not equal steps)\n"); \
+/* GDKerror("BATdimensionProject:
dimension not regular (not equal steps)\n"); */\
return NULL; \
} \
el_prev=el_cur; \
@@ -3556,7 +3561,7 @@ fprintf(stderr, "dimensionise: Group:[%l
} \
/*check the last element in the group*/ \
if(resElementRepeats >=0 && resElementRepeats != r) { \
- GDKerror("BATdimensionProject: dimension not regular
(different number of repetitions %ld vs %ld)\n", resElementRepeats, r); \
+/* GDKerror("BATdimensionProject: dimension not regular
(different number of repetitions %ld vs %ld)\n", resElementRepeats, r); */\
return NULL; \
} else if(resElementRepeats <0) { \
resElementRepeats = r; \
diff --git a/monetdb5/modules/mal/batcalc.c b/monetdb5/modules/mal/batcalc.c
--- a/monetdb5/modules/mal/batcalc.c
+++ b/monetdb5/modules/mal/batcalc.c
@@ -416,6 +416,8 @@ CMDbatBINARY1(MalStkPtr stk, InstrPtr pc
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
+ if(isBATarray(b))
+ b = materialiseDimensionBAT(b);
assert(BAThdense(b));
if (tp2 == TYPE_bat || isaBatType(tp2)) {
bid = getArgReference_bat(stk, pci, 2);
@@ -426,7 +428,9 @@ CMDbatBINARY1(MalStkPtr stk, InstrPtr pc
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
- assert(BAThdense(b));
+ if(isBATarray(b2))
+ b2 = materialiseDimensionBAT(b2);
+ assert(BAThdense(b2));
}
if (b2) {
bn = (*batfunc)(b, b2, s, abort_on_error);
@@ -444,6 +448,8 @@ CMDbatBINARY1(MalStkPtr stk, InstrPtr pc
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
+ if(isBATarray(b))
+ b = materialiseDimensionBAT(b);
assert(BAThdense(b));
bn = (*batfunc2)(&stk->stk[getArg(pci, 1)], b, s,
abort_on_error);
}
@@ -486,6 +492,8 @@ CMDbatBINARY0(MalStkPtr stk, InstrPtr pc
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
+ if(isBATarray(b))
+ b = materialiseDimensionBAT(b);
assert(BAThdense(b));
if (tp2 == TYPE_bat || isaBatType(tp2)) {
bid = getArgReference_bat(stk, pci, 2);
@@ -496,7 +504,9 @@ CMDbatBINARY0(MalStkPtr stk, InstrPtr pc
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
- assert(BAThdense(b));
+ if(isBATarray(b2))
+ b2 = materialiseDimensionBAT(b2);
+ assert(BAThdense(b2));
}
if (b2) {
bn = (*batfunc)(b, b2, s);
@@ -521,6 +531,8 @@ CMDbatBINARY0(MalStkPtr stk, InstrPtr pc
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
+ if(isBATarray(b))
+ b = materialiseDimensionBAT(b);
assert(BAThdense(b));
bn = (*batfunc2)(&stk->stk[getArg(pci, 1)], b, s);
}
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
@@ -4107,7 +4107,6 @@ rel2bin_update( mvc *sql, sql_rel *rel,
updates = table_update_stmts(sql, t, &nr_cols);
tids = update->op4.lval->h->data;
-
for (m = rel->exps->h; m; m = m->next) {
sql_exp *ce = m->data;
sql_column *c = find_sql_column(t, ce->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
@@ -2329,6 +2329,13 @@ str materialiseDimension(bat* res, bat*
throw(MAL, "sql.materialise_dimension", RUNTIME_OBJECT_MISSING);
}
+ if(!isBATarray(dimensionBAT)) {
+ //ti was planned to be a dimension but somewhere the rules were
not
+ //suttisfied and it was treated as a normal BAT
+ resBAT = dimensionBAT;
+ BBPkeepref(*res = resBAT->batCacheid);
+ return MAL_SUCCEED;
+ }
if(BATcount(dimensionBAT)) {
resBAT=materialiseDimensionBAT(dimensionBAT);
} else {
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -5385,10 +5385,7 @@ rel_select_exp(mvc *sql, sql_rel *rel, S
for(whereExpNode=r->exps->h; whereExpNode;
whereExpNode=whereExpNode->next) {
sql_exp *whereExp = whereExpNode->data;
if(isColumn(whereExp)) {
-// sql_exp *innerExp = whereExp->l;
-// if(innerExp->type == e_column) {
if(!newFilters->cnt) {
- //found a
filter on a non-dimensinal column
/*Assuming a
single array add all dimensions of it to the filtering condition*/
node
*basetableExps;
for(basetableExps = rel->exps->h ; basetableExps; basetableExps =
basetableExps->next) {
@@ -5398,7 +5395,6 @@ rel_select_exp(mvc *sql, sql_rel *rel, S
}
}
}
-// }
}
if(newFilters->cnt)
break;
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -863,9 +863,10 @@ update_table(mvc *sql, dlist *qname, dli
}
/* first create the project */
+ exps = new_exp_list(sql->sa);
e = exp_column(sql->sa, rname = rel_name(r), TID,
sql_bind_localtype("oid"), CARD_MULTI, 0, 1);
- exps = new_exp_list(sql->sa);
append(exps, e);
+
updates = table_update_array(sql, t);
for (n = assignmentlist->h; n; n = n->next) {
symbol *a = NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list