Changeset: 4c818e5217c5 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4c818e5217c5 Modified Files: gdk/gdk_analytic_bounds.c sql/server/rel_select.c sql/test/analytics/Tests/analytics02.sql sql/test/analytics/Tests/analytics02.stable.err sql/test/analytics/Tests/analytics06.stable.err sql/test/analytics/Tests/analytics06.stable.out Branch: window-tunning Log Message:
For a more strict SQL compliance, the range frame will be available to numeric types only. Added shortcut in the range bounds for 'current row' case, ie peer rows diffs (truncated from 784 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 @@ -230,7 +230,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p ANALYTICAL_WINDOW_BOUNDS_GROUPS##IMP(TPE, LIMIT, UPCAST); \ } while (0) -#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_PRECEDING(TPE1, LIMIT, TPE2) \ +#define ANALYTICAL_WINDOW_BOUNDS_RANGE_PRECEDING(TPE1, LIMIT, TPE2) \ do { \ lng m = k - 1; \ TPE1 v, calc; \ @@ -281,7 +281,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p } \ } while (0) -#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_FOLLOWING(TPE1, LIMIT, TPE2) \ +#define ANALYTICAL_WINDOW_BOUNDS_RANGE_FOLLOWING(TPE1, LIMIT, TPE2) \ do { \ TPE1 v, calc; \ TPE2 rlimit; \ @@ -325,7 +325,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p } \ } while (0) -#define ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(TPE1, IMP, LIMIT, TPE2) \ +#define ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(TPE1, IMP, LIMIT, TPE2) \ do { \ TPE1 *restrict bp = (TPE1*)Tloc(b, 0); \ if (np) { \ @@ -338,122 +338,23 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p IMP(TPE1, LIMIT, TPE2); \ } while (0) -#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_PRECEDING(LIMIT, TPE) \ - do { \ - lng m = k - 1; \ - TPE rlimit = 0; \ - if (b->tnonil) { \ - for (; k < i; k++) { \ - TPE olimit = LIMIT; \ - if (is_##TPE##_nil(olimit) || olimit < 0) \ - goto invalid_bound; \ - rlimit = (TPE) olimit; \ - void *v = BUNtail(bpi, (BUN) k); \ - for (j = k; ; j--) { \ - void *next; \ - if (j == m) \ - break; \ - next = BUNtail(bpi, (BUN) j); \ - if (ABSOLUTE((TPE) atomcmp(v, next)) > olimit) \ - break; \ - } \ - rb[k] = ++j; \ - } \ - } else { \ - for (; k < i; k++) { \ - TPE olimit = LIMIT; \ - if (is_##TPE##_nil(olimit) || olimit < 0) \ - goto invalid_bound; \ - rlimit = (TPE) olimit; \ - void *v = BUNtail(bpi, (BUN) k); \ - if (atomcmp(v, nil) == 0) { \ - for (j = k; ; j--) { \ - if (j == m) \ - break; \ - if (atomcmp(BUNtail(bpi, (BUN) j), nil) != 0) \ - break; \ - } \ - } else { \ - for (j = k; ; j--) { \ - void *next; \ - if (j == m) \ - break; \ - next = BUNtail(bpi, (BUN) j); \ - if (atomcmp(next, nil) == 0) \ - break; \ - if (ABSOLUTE((TPE) atomcmp(v, next)) > rlimit) \ - break; \ - } \ - } \ - rb[k] = ++j; \ - } \ - } \ - } while (0) - -#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_FOLLOWING(LIMIT, TPE) \ - do { \ - if (b->tnonil) { \ - for (; k < i; k++) { \ - void *v = BUNtail(bpi, (BUN) k); \ - for (j = k + 1; j < i; j++) { \ - void *next = BUNtail(bpi, (BUN) j); \ - if (ABSOLUTE((TPE) atomcmp(v, next)) > (TPE) LIMIT) \ - break; \ - } \ - rb[k] = j; \ - } \ - } else { \ - for (; k < i; k++) { \ - void *v = BUNtail(bpi, (BUN) k); \ - if (atomcmp(v, nil) == 0) { \ - for (j = k + 1; j < i; j++) { \ - if (atomcmp(BUNtail(bpi, (BUN) j), nil) != 0) \ - break; \ - } \ - } else { \ - for (j = k + 1; j < i; j++) { \ - void *next = BUNtail(bpi, (BUN) j); \ - if (atomcmp(next, nil) == 0) \ - break; \ - if (ABSOLUTE((TPE) atomcmp(v, next)) > (TPE) LIMIT) \ - break; \ - } \ - } \ - rb[k] = j; \ - } \ - } \ - } while (0) - #define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_NUM(IMP, LIMIT, CAST) \ do { \ switch (tp1) { \ - case TYPE_bit: \ - case TYPE_flt: \ - case TYPE_dbl: \ - goto type_not_supported; \ case TYPE_bte: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(bte, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, lng); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(bte, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, lng); \ break; \ case TYPE_sht: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(sht, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, lng); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(sht, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, lng); \ break; \ case TYPE_int: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(int, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, lng); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(int, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, lng); \ break; \ case TYPE_lng: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(lng, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, lng); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(lng, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, lng); \ break; \ - default: { \ - if (p) { \ - np = (bit*)Tloc(p, 0); \ - for (; i < cnt; i++) { \ - if (np[i]) \ - ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT, CAST); \ - } \ - } \ - i = cnt; \ - ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT, CAST); \ - } \ + default: \ + goto type_not_supported; \ } \ } while (0) @@ -461,7 +362,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p do { \ switch (tp1) { \ case TYPE_flt: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(flt, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, flt); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(flt, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, flt); \ break; \ default: \ goto type_not_supported; \ @@ -472,7 +373,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p do { \ switch (tp1) { \ case TYPE_dbl: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(dbl, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, dbl); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(dbl, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, dbl); \ break; \ default: \ goto type_not_supported; \ @@ -483,36 +384,23 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p #define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_HGE(IMP, LIMIT) \ do { \ switch (tp1) { \ - case TYPE_bit: \ - case TYPE_flt: \ - case TYPE_dbl: \ - goto type_not_supported; \ case TYPE_bte: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(bte, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, hge); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(bte, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \ break; \ case TYPE_sht: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(sht, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, hge); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(sht, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \ break; \ case TYPE_int: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(int, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, hge); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(int, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \ break; \ case TYPE_lng: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(lng, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, hge); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(lng, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \ break; \ case TYPE_hge: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(hge, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, hge); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(hge, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \ break; \ - default: { \ - if (p) { \ - np = (bit*)Tloc(p, 0); \ - for (; i < cnt; i++) { \ - if (np[i]) \ - ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT, hge); \ - } \ - } \ - i = cnt; \ - ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT, hge); \ - } \ + default: \ + goto type_not_supported; \ } \ } while (0) #endif @@ -527,7 +415,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p #define timestamp_add_msec(T,M) timestamp_add_usec(T, (M)*1000) #define timestamp_sub_msec(T,M) timestamp_add_usec(T, -(M)*1000) -#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_MTIME_PRECEDING(TPE1, LIMIT, TPE2, SUB, ADD) \ +#define ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME_PRECEDING(TPE1, LIMIT, TPE2, SUB, ADD) \ do { \ lng m = k - 1; \ TPE1 v, vmin, vmax; \ @@ -579,7 +467,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p } \ } while(0) -#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_MTIME_FOLLOWING(TPE1, LIMIT, TPE2, SUB, ADD) \ +#define ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME_FOLLOWING(TPE1, LIMIT, TPE2, SUB, ADD) \ do { \ TPE1 v, vmin, vmax; \ if (b->tnonil) { \ @@ -624,7 +512,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p } \ } while(0) -#define ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED_MTIME(TPE1, IMP, LIMIT, TPE2, SUB, ADD) \ +#define ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(TPE1, IMP, LIMIT, TPE2, SUB, ADD) \ do { \ TPE1 *restrict bp = (TPE1*)Tloc(b, 0); \ if (p) { \ @@ -639,26 +527,33 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p #define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_MTIME_MONTH_INTERVAL(IMP, LIMIT) \ do { \ - if (tp1 == TYPE_date) { \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED_MTIME(date, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_MTIME##IMP, LIMIT, int, date_sub_month, date_add_month); \ - } else if (tp1 == TYPE_timestamp) { \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED_MTIME(timestamp, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_MTIME##IMP, LIMIT, int, timestamp_sub_month, timestamp_add_month); \ - } else { \ - goto type_not_supported; \ - } \ + switch (tp1) { \ + case TYPE_date: \ + ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(date, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, int, date_sub_month, date_add_month); \ + break; \ + case TYPE_timestamp: \ + ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(timestamp, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, int, timestamp_sub_month, timestamp_add_month); \ + break; \ + default: \ + goto type_not_supported; \ + } \ } while(0) #define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_MTIME_SEC_INTERVAL(IMP, LIMIT) \ do { \ - if (tp1 == TYPE_daytime) { \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED_MTIME(daytime, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_MTIME##IMP, LIMIT, lng, daytime_sub_msec, daytime_add_msec); \ - } else if (tp1 == TYPE_date) { \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED_MTIME(date, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_MTIME##IMP, LIMIT, lng, date_sub_msec, date_add_msec); \ - } else if (tp1 == TYPE_timestamp) { \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED_MTIME(timestamp, ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_MTIME##IMP, LIMIT, lng, timestamp_sub_msec, timestamp_add_msec); \ - } else { \ - goto type_not_supported; \ - } \ + switch (tp1) { \ + case TYPE_date: \ + ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(date, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, lng, date_sub_msec, date_add_msec); \ + break; \ + case TYPE_daytime: \ + ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(daytime, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, lng, daytime_sub_msec, daytime_add_msec); \ + break; \ + case TYPE_timestamp: \ + ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(timestamp, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, lng, timestamp_sub_msec, timestamp_add_msec); \ + break; \ + default: \ + goto type_not_supported; \ + } \ } while(0) static gdk_return @@ -701,6 +596,197 @@ GDKanalyticalallbounds(BAT *r, BAT *b, B return GDK_SUCCEED; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list