Changeset: ab9aaaf96534 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ab9aaaf96534
Modified Files:
gdk/gdk_analytic_bounds.c
gdk/gdk_analytic_func.c
sql/server/rel_select.c
sql/server/sql_atom.c
sql/server/sql_atom.h
Branch: window-tunning
Log Message:
More bugfixes but more needed
diffs (truncated from 949 to 300 lines):
diff --git a/gdk/gdk_analytic_bounds.c b/gdk/gdk_analytic_bounds.c
--- a/gdk/gdk_analytic_bounds.c
+++ b/gdk/gdk_analytic_bounds.c
@@ -164,12 +164,9 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
if (np[i]) \
ANALYTICAL_WINDOW_BOUNDS_ROWS##IMP(LIMIT); \
} \
- i = cnt; \
- ANALYTICAL_WINDOW_BOUNDS_ROWS##IMP(LIMIT); \
- } else { \
- i = cnt; \
- ANALYTICAL_WINDOW_BOUNDS_ROWS##IMP(LIMIT); \
- } \
+ } \
+ i = cnt; \
+ ANALYTICAL_WINDOW_BOUNDS_ROWS##IMP(LIMIT); \
} while (0)
#define ANALYTICAL_WINDOW_BOUNDS_GROUPS_PRECEDING(LIMIT) \
@@ -214,12 +211,9 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
if (np[i]) \
ANALYTICAL_WINDOW_BOUNDS_GROUPS##IMP(LIMIT); \
} \
- i = cnt; \
- ANALYTICAL_WINDOW_BOUNDS_GROUPS##IMP(LIMIT); \
- } else { \
- i = cnt; \
- ANALYTICAL_WINDOW_BOUNDS_GROUPS##IMP(LIMIT); \
- } \
+ } \
+ i = cnt; \
+ ANALYTICAL_WINDOW_BOUNDS_GROUPS##IMP(LIMIT); \
} while (0)
#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_PRECEDING(TPE1, LIMIT, TPE2) \
@@ -313,12 +307,9 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
if (np[i]) \
IMP(TPE1, LIMIT, TPE2); \
} \
- i = cnt; \
- IMP(TPE1, LIMIT, TPE2); \
- } else { \
- i = cnt; \
- IMP(TPE1, LIMIT, TPE2); \
- } \
+ } \
+ i = cnt; \
+ IMP(TPE1, LIMIT, TPE2); \
} while (0)
#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_PRECEDING(LIMIT, TPE) \
@@ -424,12 +415,9 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
if (np[i]) \
ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT, CAST); \
} \
- i = cnt; \
-
ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT, CAST); \
- } else { \
- i = cnt; \
-
ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT, CAST); \
- } \
+ } \
+ i = cnt; \
+ ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT,
CAST); \
} \
} \
} while (0)
@@ -486,18 +474,55 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
if (np[i]) \
ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT, hge); \
} \
- i = cnt; \
-
ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT, hge); \
- } else { \
- i = cnt; \
-
ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT, hge); \
- } \
+ } \
+ i = cnt; \
+ ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT,
hge); \
} \
} \
} while (0)
#endif
static gdk_return
+GDKanalyticalallbounds(BAT *r, BAT *b, BAT *p, bool preceding)
+{
+ lng *restrict rb = (lng *) Tloc(r, 0), i = 0, k = 0, j = 0, cnt = (lng)
BATcount(b);
+ bit *restrict np = p ? (bit *) Tloc(p, 0) : NULL;
+
+ if (preceding) {
+ if (np) {
+ for (; i < cnt; i++) {
+ if (np[i]) {
+ j = k;
+ for (; k < i; k++)
+ rb[k] = j;
+ }
+ }
+ }
+ i = cnt;
+ j = k;
+ for (; k < i; k++)
+ rb[k] = j;
+ } else { /* following */
+ if (np) {
+ for (; i < cnt; i++) {
+ if (np[i]) {
+ for (; k < i; k++)
+ rb[k] = i;
+ }
+ }
+ }
+ i = cnt;
+ for (; k < i; k++)
+ rb[k] = i;
+ }
+
+ BATsetcount(r, cnt);
+ r->tnonil = false;
+ r->tnil = false;
+ return GDK_SUCCEED;
+}
+
+static gdk_return
GDKanalyticalrowbounds(BAT *r, BAT *b, BAT *p, BAT *l, const void *restrict
bound, int tp2, bool preceding, lng first_half)
{
lng cnt = (BUN) BATcount(b), nils = 0, *restrict rb = (lng *) Tloc(r,
0), i = 0, k = 0, j = 0;
@@ -581,7 +606,9 @@ GDKanalyticalrowbounds(BAT *r, BAT *b, B
default:
goto bound_not_supported;
}
- if (preceding) {
+ if (is_lng_nil(limit)) {
+ return GDKanalyticalallbounds(r, b, p, preceding);
+ } else if (preceding) {
ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_PRECEDING,
limit);
} else {
ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_FOLLOWING,
limit);
@@ -690,22 +717,34 @@ GDKanalyticalrangebounds(BAT *r, BAT *b,
switch (tp2) {
case TYPE_bte:{
bte ll = (*(bte *) bound);
- limit = (lng) ll;
+ if (is_bte_nil(ll)) /* UNBOUNDED PRECEDING
and UNBOUNDED FOLLOWING cases, avoid overflow */
+ return GDKanalyticalallbounds(r, b, p,
preceding);
+ else
+ limit = (lng) ll;
break;
}
case TYPE_sht:{
sht ll = (*(sht *) bound);
- limit = (lng) ll;
+ if (is_sht_nil(ll))
+ return GDKanalyticalallbounds(r, b, p,
preceding);
+ else
+ limit = (lng) ll;
break;
}
case TYPE_int:{
int ll = (*(int *) bound);
- limit = (lng) ll;
+ if (is_int_nil(ll))
+ return GDKanalyticalallbounds(r, b, p,
preceding);
+ else
+ limit = (lng) ll;
break;
}
case TYPE_lng:{
lng ll = (*(lng *) bound);
- limit = (lng) ll;
+ if (is_lng_nil(ll))
+ return GDKanalyticalallbounds(r, b, p,
preceding);
+ else
+ limit = (lng) ll;
break;
}
default:
@@ -720,7 +759,9 @@ GDKanalyticalrangebounds(BAT *r, BAT *b,
}
case TYPE_flt:{
flt limit = (*(flt *) bound);
- if (preceding) {
+ if (is_flt_nil(limit)) {
+ return GDKanalyticalallbounds(r, b, p,
preceding);
+ } else if (preceding) {
ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_FLT(_PRECEDING, limit);
} else {
ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_FLT(_FOLLOWING, limit);
@@ -729,7 +770,9 @@ GDKanalyticalrangebounds(BAT *r, BAT *b,
}
case TYPE_dbl:{
dbl limit = (*(dbl *) bound);
- if (preceding) {
+ if (is_dbl_nil(limit)) {
+ return GDKanalyticalallbounds(r, b, p,
preceding);
+ } else if (preceding) {
ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_DBL(_PRECEDING, limit);
} else {
ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_DBL(_FOLLOWING, limit);
@@ -739,7 +782,9 @@ GDKanalyticalrangebounds(BAT *r, BAT *b,
#ifdef HAVE_HGE
case TYPE_hge:{
hge limit = (*(hge *) bound);
- if (preceding) {
+ if (is_hge_nil(limit)) {
+ return GDKanalyticalallbounds(r, b, p,
preceding);
+ } else if (preceding) {
ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_HGE(_PRECEDING, limit);
} else {
ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_HGE(_FOLLOWING, limit);
@@ -854,7 +899,9 @@ GDKanalyticalgroupsbounds(BAT *r, BAT *b
default:
goto bound_not_supported;
}
- if (preceding) {
+ if (is_lng_nil(limit)) {
+ return GDKanalyticalallbounds(r, b, p, preceding);
+ } else if (preceding) {
ANALYTICAL_WINDOW_BOUNDS_BRANCHES_GROUPS(_PRECEDING,
limit);
} else {
ANALYTICAL_WINDOW_BOUNDS_BRANCHES_GROUPS(_FOLLOWING,
limit);
diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c
--- a/gdk/gdk_analytic_func.c
+++ b/gdk/gdk_analytic_func.c
@@ -789,10 +789,10 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
#define ANALYTICAL_MIN_MAX_CALC_FIXED_UNBOUNDED_TILL_CURRENT_ROW(TPE, MIN_MAX)
\
do { \
+ TPE curval = TPE##_nil; \
for (; k < i;) { \
- j = k++; \
- TPE curval = bp[j]; \
- while (k < i && !op[k]) { \
+ j = k; \
+ do { \
if (!is_##TPE##_nil(bp[k])) { \
if (is_##TPE##_nil(curval)) \
curval = bp[k]; \
@@ -800,7 +800,7 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
curval = MIN_MAX(bp[k],
curval); \
} \
k++; \
- } \
+ } while (k < i && !op[k]); \
for (; j < k; j++) \
rb[j] = curval; \
has_nils |= is_##TPE##_nil(curval); \
@@ -809,18 +809,18 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
#define ANALYTICAL_MIN_MAX_CALC_FIXED_CURRENT_ROW_TILL_UNBOUNDED(TPE, MIN_MAX)
\
do { \
+ TPE curval = TPE##_nil; \
for (j = i - 1; j >= k; ) { \
- l = j--; \
- TPE curval = bp[l]; \
- while (j >= k && !op[j]) { \
+ l = j; \
+ do { \
if (!is_##TPE##_nil(bp[j])) { \
if (is_##TPE##_nil(curval)) \
curval = bp[j]; \
else \
curval = MIN_MAX(bp[j],
curval); \
- } \
+ } \
j--; \
- } \
+ } while (j >= k && !op[j]); \
m = MAX(k, j); \
for (; l >= m; l--) \
rb[l] = curval; \
@@ -880,10 +880,10 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
#define ANALYTICAL_MIN_MAX_CALC_VARSIZED_UNBOUNDED_TILL_CURRENT_ROW(GT_LT)
\
do { \
+ const void *curval = nil; \
for (; k < i;) { \
- j = k++; \
- void *curval = BUNtail(bpi, j); \
- while (k < i && !op[k]) { \
+ j = k; \
+ do { \
void *next = BUNtail(bpi, k); \
if (atomcmp(next, nil) != 0) { \
if (atomcmp(curval, nil) == 0) \
@@ -892,7 +892,7 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
curval = atomcmp(next, curval)
GT_LT 0 ? curval : next; \
} \
k++; \
- } \
+ } while (k < i && !op[k]); \
for (; j < k; j++) \
if (tfastins_nocheckVAR(r, j, curval, Tsize(r))
!= GDK_SUCCEED) \
return GDK_FAIL; \
@@ -902,10 +902,10 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
#define ANALYTICAL_MIN_MAX_CALC_VARSIZED_CURRENT_ROW_TILL_UNBOUNDED(GT_LT)
\
do { \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list