Changeset: b342c0fb2582 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b342c0fb2582 Modified Files: gdk/gdk_analytic_func.c gdk/gdk_subquery.c sql/test/analytics/Tests/analytics02.test Branch: default Log Message:
Fixing atomvarsized vs atomfixed atoms
diffs (truncated from 422 to 300 lines):
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
@@ -221,11 +221,20 @@ GDKanalyticalfirst(BAT *r, BAT *b, BAT *
ANALYTICAL_FIRST_FIXED(dbl);
break;
default:{
- for (; k < cnt; k++) {
- const void *curval = (end[k] > start[k]) ? BUNtail(bpi,
start[k]) : nil;
- if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) !=
GDK_SUCCEED)
- return GDK_FAIL;
- has_nils |= atomcmp(curval, nil) == 0;
+ if (ATOMvarsized(tpe)) {
+ for (; k < cnt; k++) {
+ const void *curval = (end[k] > start[k]) ?
BUNtail(bpi, start[k]) : nil;
+ if (tfastins_nocheckVAR(r, k, curval, Tsize(r))
!= GDK_SUCCEED)
+ return GDK_FAIL;
+ has_nils |= atomcmp(curval, nil) == 0;
+ }
+ } else {
+ for (; k < cnt; k++) {
+ const void *curval = (end[k] > start[k]) ?
BUNtail(bpi, start[k]) : nil;
+ if (BUNappend(r, curval, TRUE) != GDK_SUCCEED)
+ return GDK_FAIL;
+ has_nils |= atomcmp(curval, nil) == 0;
+ }
}
}
}
@@ -281,11 +290,20 @@ GDKanalyticallast(BAT *r, BAT *b, BAT *s
ANALYTICAL_LAST_FIXED(dbl);
break;
default:{
- for (; k < cnt; k++) {
- const void *curval = (end[k] > start[k]) ? BUNtail(bpi,
end[k] - 1) : nil;
- if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) !=
GDK_SUCCEED)
- return GDK_FAIL;
- has_nils |= atomcmp(curval, nil) == 0;
+ if (ATOMvarsized(tpe)) {
+ for (; k < cnt; k++) {
+ const void *curval = (end[k] > start[k]) ?
BUNtail(bpi, end[k] - 1) : nil;
+ if (tfastins_nocheckVAR(r, k, curval, Tsize(r))
!= GDK_SUCCEED)
+ return GDK_FAIL;
+ has_nils |= atomcmp(curval, nil) == 0;
+ }
+ } else {
+ for (; k < cnt; k++) {
+ const void *curval = (end[k] > start[k]) ?
BUNtail(bpi, end[k] - 1) : nil;
+ if (BUNappend(r, curval, TRUE) != GDK_SUCCEED)
+ return GDK_FAIL;
+ has_nils |= atomcmp(curval, nil) == 0;
+ }
}
}
}
@@ -373,18 +391,34 @@ GDKanalyticalnthvalue(BAT *r, BAT *b, BA
break;
default:{
const void *curval = nil;
- for (; k < cnt; k++) {
- lng lnth = tp[k];
- if (!is_lng_nil(nth) && nth <= 0) goto
invalidnth;
- if (is_lng_nil(lnth) || end[k] <= start[k] ||
lnth - 1 > (lng)(end[k] - start[k])) {
- curval = (void *) nil;
- has_nils = true;
- } else {
- curval = BUNtail(bpi, start[k] +
(oid)(lnth - 1));
- has_nils |= atomcmp(curval, nil) == 0;
+ if (ATOMvarsized(tpe)) {
+ for (; k < cnt; k++) {
+ lng lnth = tp[k];
+ if (!is_lng_nil(nth) && nth <= 0) goto
invalidnth;
+ if (is_lng_nil(lnth) || end[k] <=
start[k] || lnth - 1 > (lng)(end[k] - start[k])) {
+ curval = (void *) nil;
+ has_nils = true;
+ } else {
+ curval = BUNtail(bpi, start[k]
+ (oid)(lnth - 1));
+ has_nils |= atomcmp(curval,
nil) == 0;
+ }
+ if (tfastins_nocheckVAR(r, k, curval,
Tsize(r)) != GDK_SUCCEED)
+ return GDK_FAIL;
}
- if (tfastins_nocheckVAR(r, k, curval, Tsize(r))
!= GDK_SUCCEED)
- return GDK_FAIL;
+ } else {
+ for (; k < cnt; k++) {
+ lng lnth = tp[k];
+ if (!is_lng_nil(nth) && nth <= 0) goto
invalidnth;
+ if (is_lng_nil(lnth) || end[k] <=
start[k] || lnth - 1 > (lng)(end[k] - start[k])) {
+ curval = (void *) nil;
+ has_nils = true;
+ } else {
+ curval = BUNtail(bpi, start[k]
+ (oid)(lnth - 1));
+ has_nils |= atomcmp(curval,
nil) == 0;
+ }
+ if (BUNappend(r, curval, TRUE) !=
GDK_SUCCEED)
+ return GDK_FAIL;
+ }
}
}
}
@@ -416,18 +450,35 @@ GDKanalyticalnthvalue(BAT *r, BAT *b, BA
ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED(dbl);
break;
default:{
- if (is_lng_nil(nth)) {
- has_nils = true;
- for (; k < cnt; k++)
- if (tfastins_nocheckVAR(r, k, nil,
Tsize(r)) != GDK_SUCCEED)
- return GDK_FAIL;
+ if (ATOMvarsized(tpe)) {
+ if (is_lng_nil(nth)) {
+ has_nils = true;
+ for (; k < cnt; k++)
+ if (tfastins_nocheckVAR(r, k,
nil, Tsize(r)) != GDK_SUCCEED)
+ return GDK_FAIL;
+ } else {
+ nth--;
+ for (; k < cnt; k++) {
+ const void *curval = (end[k] >
start[k] && nth < (lng)(end[k] - start[k])) ? BUNtail(bpi, start[k] + (oid)
nth) : nil;
+ if (tfastins_nocheckVAR(r, k,
curval, Tsize(r)) != GDK_SUCCEED)
+ return GDK_FAIL;
+ has_nils |= atomcmp(curval,
nil) == 0;
+ }
+ }
} else {
- nth--;
- for (; k < cnt; k++) {
- const void *curval = (end[k] > start[k]
&& nth < (lng)(end[k] - start[k])) ? BUNtail(bpi, start[k] + (oid) nth) : nil;
- if (tfastins_nocheckVAR(r, k, curval,
Tsize(r)) != GDK_SUCCEED)
- return GDK_FAIL;
- has_nils |= atomcmp(curval, nil) == 0;
+ if (is_lng_nil(nth)) {
+ has_nils = true;
+ for (; k < cnt; k++)
+ if (BUNappend(r, nil, TRUE) !=
GDK_SUCCEED)
+ return GDK_FAIL;
+ } else {
+ nth--;
+ for (; k < cnt; k++) {
+ const void *curval = (end[k] >
start[k] && nth < (lng)(end[k] - start[k])) ? BUNtail(bpi, start[k] + (oid)
nth) : nil;
+ if (BUNappend(r, curval, TRUE)
!= GDK_SUCCEED)
+ return GDK_FAIL;
+ has_nils |= atomcmp(curval,
nil) == 0;
+ }
}
}
}
@@ -824,48 +875,92 @@ 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; \
- do { \
- void *next = BUNtail(bpi, k); \
+ if (ATOMvarsized(tpe)) { \
+ for (; k < i;) { \
+ j = k; \
+ do { \
+ void *next = BUNtail(bpi, k); \
+ if (atomcmp(next, nil) != 0) {
\
+ if (atomcmp(curval, nil) == 0)
\
+ curval = next;
\
+ else
\
+ 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; \
+ has_nils |= atomcmp(curval, nil) == 0;
\
+ } \
+ } else { \
+ for (; k < i;) { \
+ j = k; \
+ do { \
+ void *next = BUNtail(bpi, k); \
+ if (atomcmp(next, nil) != 0) {
\
+ if (atomcmp(curval, nil) == 0)
\
+ curval = next;
\
+ else
\
+ curval = atomcmp(next,
curval) GT_LT 0 ? curval : next; \
+ }
\
+ k++; \
+ } while (k < i && !op[k]); \
+ for (; j < k; j++) \
+ if (BUNappend(r, curval, TRUE) !=
GDK_SUCCEED) \
+ return GDK_FAIL; \
+ has_nils |= atomcmp(curval, nil) == 0;
\
+ } \
+ } \
+ } while (0)
+
+#define ANALYTICAL_MIN_MAX_CALC_VARSIZED_CURRENT_ROW_TILL_UNBOUNDED(GT_LT)
\
+ do { \
+ const void *curval = nil; \
+ l = i - 1; \
+ if (ATOMvarsized(tpe)) { \
+ for (j = l; ; j--) { \
+ void *next = BUNtail(bpi, j); \
if (atomcmp(next, nil) != 0) { \
if (atomcmp(curval, nil) == 0) \
curval = next; \
else \
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; \
- has_nils |= atomcmp(curval, nil) == 0; \
- } \
- } while (0)
-
-#define ANALYTICAL_MIN_MAX_CALC_VARSIZED_CURRENT_ROW_TILL_UNBOUNDED(GT_LT)
\
- do { \
- const void *curval = nil; \
- l = i - 1; \
- for (j = l; ; j--) { \
- void *next = BUNtail(bpi, j); \
- if (atomcmp(next, nil) != 0) { \
- if (atomcmp(curval, nil) == 0) \
- curval = next; \
- else \
- curval = atomcmp(next, curval) GT_LT 0
? curval : next; \
- } \
- if (op[j] || j == k) { \
- for (; ; l--) { \
- if (tfastins_nocheckVAR(r, l, curval,
Tsize(r)) != GDK_SUCCEED) \
- return GDK_FAIL; \
- if (l == j) \
+ if (op[j] || j == k) { \
+ for (; ; l--) { \
+ if (tfastins_nocheckVAR(r, l,
curval, Tsize(r)) != GDK_SUCCEED) \
+ return GDK_FAIL; \
+ if (l == j) \
+ break; \
+ } \
+ has_nils |= atomcmp(curval, nil) == 0;
\
+ if (j == k) \
break; \
- } \
- has_nils |= atomcmp(curval, nil) == 0;
\
- if (j == k) \
- break; \
- l = j - 1; \
+ l = j - 1; \
+ } \
+ } \
+ } else { \
+ for (j = l; ; j--) { \
+ void *next = BUNtail(bpi, j); \
+ if (atomcmp(next, nil) != 0) { \
+ if (atomcmp(curval, nil) == 0) \
+ curval = next; \
+ else \
+ curval = atomcmp(next, curval)
GT_LT 0 ? curval : next; \
+ } \
+ if (op[j] || j == k) { \
+ for (; ; l--) { \
+ if (BUNappend(r, curval, TRUE)
!= GDK_SUCCEED) \
+ return GDK_FAIL; \
+ if (l == j) \
+ break; \
+ } \
+ has_nils |= atomcmp(curval, nil) == 0;
\
+ if (j == k) \
+ break; \
+ l = j - 1; \
+ } \
} \
} \
k = i; \
@@ -874,29 +969,53 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
#define ANALYTICAL_MIN_MAX_CALC_VARSIZED_ALL_ROWS(GT_LT) \
do { \
void *curval = (void*) nil; \
- for (j = k; j < i; j++) { \
- void *next = BUNtail(bpi, j); \
- if (atomcmp(next, nil) != 0) { \
- if (atomcmp(curval, nil) == 0) \
- curval = next; \
- else \
- curval = atomcmp(next, curval) GT_LT 0
? curval : next; \
- } \
- } \
- for (; k < i; k++) \
- if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) !=
GDK_SUCCEED) \
- return GDK_FAIL; \
+ if (ATOMvarsized(tpe)) { \
+ for (j = k; j < i; j++) { \
+ void *next = BUNtail(bpi, j); \
+ if (atomcmp(next, nil) != 0) { \
+ if (atomcmp(curval, nil) == 0) \
+ curval = next; \
+ else \
+ curval = atomcmp(next, curval)
GT_LT 0 ? curval : next; \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
