Changeset: 8f22a888bb79 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8f22a888bb79
Modified Files:
gdk/gdk_analytic_func.c
sql/test/analytics/Tests/analytics02.test
Branch: default
Log Message:
I can do better. Tomorrow I will finish
diffs (242 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
@@ -229,10 +229,12 @@ GDKanalyticalfirst(BAT *r, BAT *b, BAT *
has_nils |= atomcmp(curval, nil) == 0;
}
} else {
+ uint16_t width = r->twidth;
+ uint8_t *restrict rcast = (uint8_t *) Tloc(r, 0);
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;
+ memcpy(rcast, curval, width);
+ rcast += width;
has_nils |= atomcmp(curval, nil) == 0;
}
}
@@ -298,10 +300,12 @@ GDKanalyticallast(BAT *r, BAT *b, BAT *s
has_nils |= atomcmp(curval, nil) == 0;
}
} else {
+ uint16_t width = r->twidth;
+ uint8_t *restrict rcast = (uint8_t *) Tloc(r, 0);
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;
+ memcpy(rcast, curval, width);
+ rcast += width;
has_nils |= atomcmp(curval, nil) == 0;
}
}
@@ -406,6 +410,8 @@ GDKanalyticalnthvalue(BAT *r, BAT *b, BA
return GDK_FAIL;
}
} else {
+ uint8_t *restrict rcast = (uint8_t *) Tloc(r,
0);
+ uint16_t width = r->twidth;
for (; k < cnt; k++) {
lng lnth = tp[k];
if (!is_lng_nil(nth) && nth <= 0) goto
invalidnth;
@@ -416,8 +422,8 @@ GDKanalyticalnthvalue(BAT *r, BAT *b, BA
curval = BUNtail(bpi, start[k]
+ (oid)(lnth - 1));
has_nils |= atomcmp(curval,
nil) == 0;
}
- if (BUNappend(r, curval, TRUE) !=
GDK_SUCCEED)
- return GDK_FAIL;
+ memcpy(rcast, curval, width);
+ rcast += width;
}
}
}
@@ -466,17 +472,20 @@ GDKanalyticalnthvalue(BAT *r, BAT *b, BA
}
}
} else {
+ uint16_t width = r->twidth;
+ uint8_t *restrict rcast = (uint8_t *) Tloc(r,
0);
if (is_lng_nil(nth)) {
has_nils = true;
- for (; k < cnt; k++)
- if (BUNappend(r, nil, TRUE) !=
GDK_SUCCEED)
- return GDK_FAIL;
+ for (; k < cnt; k++) {
+ memcpy(rcast, nil, width);
+ rcast += width;
+ }
} 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;
+ memcpy(rcast, curval, width);
+ rcast += width;
has_nils |= atomcmp(curval,
nil) == 0;
}
}
@@ -872,7 +881,7 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
j = k; \
} while (0)
-#define ANALYTICAL_MIN_MAX_CALC_VARSIZED_UNBOUNDED_TILL_CURRENT_ROW(GT_LT)
\
+#define ANALYTICAL_MIN_MAX_CALC_OTHERS_UNBOUNDED_TILL_CURRENT_ROW(GT_LT)
\
do { \
const void *curval = nil; \
if (ATOMvarsized(tpe)) { \
@@ -906,15 +915,16 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
}
\
k++; \
} while (k < i && !op[k]); \
- for (; j < k; j++) \
- if (BUNappend(r, curval, TRUE) !=
GDK_SUCCEED) \
- return GDK_FAIL; \
+ for (; j < k; j++) { \
+ memcpy(rcast, curval, width); \
+ rcast += width; \
+ } \
has_nils |= atomcmp(curval, nil) == 0;
\
} \
} \
} while (0)
-#define ANALYTICAL_MIN_MAX_CALC_VARSIZED_CURRENT_ROW_TILL_UNBOUNDED(GT_LT)
\
+#define ANALYTICAL_MIN_MAX_CALC_OTHERS_CURRENT_ROW_TILL_UNBOUNDED(GT_LT)
\
do { \
const void *curval = nil; \
l = i - 1; \
@@ -950,9 +960,10 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
curval = atomcmp(next, curval)
GT_LT 0 ? curval : next; \
} \
if (op[j] || j == k) { \
+ BUN x = l * width; \
for (; ; l--) { \
- if (BUNappend(r, curval, TRUE)
!= GDK_SUCCEED) \
- return GDK_FAIL; \
+ memcpy(rcast + x, curval,
width); \
+ x -= width; \
if (l == j) \
break; \
} \
@@ -966,7 +977,7 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
k = i; \
} while (0)
-#define ANALYTICAL_MIN_MAX_CALC_VARSIZED_ALL_ROWS(GT_LT) \
+#define ANALYTICAL_MIN_MAX_CALC_OTHERS_ALL_ROWS(GT_LT) \
do { \
void *curval = (void*) nil; \
if (ATOMvarsized(tpe)) { \
@@ -992,14 +1003,15 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
curval = atomcmp(next, curval)
GT_LT 0 ? curval : next; \
} \
} \
- for (; k < i; k++) \
- if (BUNappend(r, curval, TRUE) != GDK_SUCCEED) \
- return GDK_FAIL; \
+ for (; k < i; k++) { \
+ memcpy(rcast, curval, width); \
+ rcast += width; \
+ } \
} \
has_nils |= atomcmp(curval, nil) == 0; \
} while (0)
-#define ANALYTICAL_MIN_MAX_CALC_VARSIZED_CURRENT_ROW(GT_LT) \
+#define ANALYTICAL_MIN_MAX_CALC_OTHERS_CURRENT_ROW(GT_LT) \
do { \
if (ATOMvarsized(tpe)) { \
for (; k < i; k++) { \
@@ -1011,22 +1023,22 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
} else { \
for (; k < i; k++) { \
void *next = BUNtail(bpi, k); \
- if (BUNappend(r, next, TRUE) != GDK_SUCCEED) \
- return GDK_FAIL; \
+ memcpy(rcast, next, width); \
+ rcast += width; \
has_nils |= atomcmp(next, nil) == 0;
\
} \
} \
} while (0)
-#define INIT_AGGREGATE_MIN_MAX_VARSIZED(GT_LT, NOTHING1, NOTHING2) \
+#define INIT_AGGREGATE_MIN_MAX_OTHERS(GT_LT, NOTHING1, NOTHING2) \
do { \
computed = (void*) nil; \
} while (0)
-#define COMPUTE_LEVEL0_MIN_MAX_VARSIZED(X, GT_LT, NOTHING1, NOTHING2) \
+#define COMPUTE_LEVEL0_MIN_MAX_OTHERS(X, GT_LT, NOTHING1, NOTHING2) \
do { \
computed = BUNtail(bpi, j + X); \
} while (0)
-#define COMPUTE_LEVELN_MIN_MAX_VARSIZED(VAL, GT_LT, NOTHING1, NOTHING2) \
+#define COMPUTE_LEVELN_MIN_MAX_OTHERS(VAL, GT_LT, NOTHING1, NOTHING2) \
do { \
if (atomcmp(VAL, nil) != 0) { \
if (atomcmp(computed, nil) == 0) \
@@ -1035,25 +1047,25 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
computed = atomcmp(VAL, computed) GT_LT 0 ?
computed : VAL; \
} \
} while (0)
-#define FINALIZE_AGGREGATE_MIN_MAX_VARSIZED(GT_LT, NOTHING1, NOTHING2) \
+#define FINALIZE_AGGREGATE_MIN_MAX_OTHERS(GT_LT, NOTHING1, NOTHING2) \
do { \
if (ATOMvarsized(tpe)) { \
if ((res = tfastins_nocheckVAR(r, k, computed,
Tsize(r))) != GDK_SUCCEED) \
goto cleanup; \
} else { \
- if (BUNappend(r, computed, TRUE) != GDK_SUCCEED) \
- return GDK_FAIL; \
+ memcpy(rcast, computed, width); \
+ rcast += width; \
} \
has_nils |= atomcmp(computed, nil) == 0; \
} while (0)
-#define ANALYTICAL_MIN_MAX_CALC_VARSIZED_OTHERS(GT_LT) \
+#define ANALYTICAL_MIN_MAX_CALC_OTHERS_OTHERS(GT_LT) \
do { \
oid ncount = i - k; \
if ((res = GDKrebuild_segment_tree(ncount, sizeof(void*),
&segment_tree, &tree_capacity, &levels_offset, &nlevels)) != GDK_SUCCEED) \
goto cleanup; \
- populate_segment_tree(void*, ncount,
INIT_AGGREGATE_MIN_MAX_VARSIZED, COMPUTE_LEVEL0_MIN_MAX_VARSIZED,
COMPUTE_LEVELN_MIN_MAX_VARSIZED, GT_LT, NOTHING, NOTHING); \
+ populate_segment_tree(void*, ncount,
INIT_AGGREGATE_MIN_MAX_OTHERS, COMPUTE_LEVEL0_MIN_MAX_OTHERS,
COMPUTE_LEVELN_MIN_MAX_OTHERS, GT_LT, NOTHING, NOTHING); \
for (; k < i; k++) \
- compute_on_segment_tree(void*, start[k] - j, end[k] -
j, INIT_AGGREGATE_MIN_MAX_VARSIZED, COMPUTE_LEVELN_MIN_MAX_VARSIZED,
FINALIZE_AGGREGATE_MIN_MAX_VARSIZED, GT_LT, NOTHING, NOTHING); \
+ compute_on_segment_tree(void*, start[k] - j, end[k] -
j, INIT_AGGREGATE_MIN_MAX_OTHERS, COMPUTE_LEVELN_MIN_MAX_OTHERS,
FINALIZE_AGGREGATE_MIN_MAX_OTHERS, GT_LT, NOTHING, NOTHING); \
j = k; \
} while (0)
@@ -1111,7 +1123,7 @@ minmaxfixed##TPE##IMP: \
for (; i < cnt; i++) { \
if (np[i]) { \
minmaxvarsized##IMP: \
-
ANALYTICAL_MIN_MAX_CALC_VARSIZED_##IMP(GT_LT); \
+
ANALYTICAL_MIN_MAX_CALC_OTHERS_##IMP(GT_LT); \
} \
}
\
} \
@@ -1137,6 +1149,8 @@ GDKanalytical##OP(BAT *r, BAT *p, BAT *o
int (*atomcmp)(const void *, const void *) = ATOMcompare(tpe); \
void *segment_tree = NULL; \
gdk_return res = GDK_SUCCEED; \
+ uint16_t width = r->twidth; \
+ uint8_t *restrict rcast = (uint8_t *) Tloc(r, 0); \
\
if (cnt > 0) { \
switch (frame_type) { \
diff --git a/sql/test/analytics/Tests/analytics02.test
b/sql/test/analytics/Tests/analytics02.test
--- a/sql/test/analytics/Tests/analytics02.test
+++ b/sql/test/analytics/Tests/analytics02.test
@@ -1524,3 +1524,9 @@ select min(a) over () from (values (uuid
----
aee1a538-aca1-381b-d9f4-8c29ef3f5f34
aee1a538-aca1-381b-d9f4-8c29ef3f5f34
+
+query T rowsort
+select min(a) over (order by a range between current row and unbounded
following) from (values (uuid 'AEE1A538-ACA1-381B-D9F4-8C29EF3F5F34'), (uuid
'AEE1A538-ACA1-381B-D9F4-8C29EF3F5F35')) as a(a)
+----
+aee1a538-aca1-381b-d9f4-8c29ef3f5f34
+aee1a538-aca1-381b-d9f4-8c29ef3f5f35
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list