Changeset: 66e2ebc7edc0 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=66e2ebc7edc0 Modified Files: gdk/gdk_analytic.h gdk/gdk_analytic_func.c sql/backends/monet5/sql.c sql/backends/monet5/sql_rank.c sql/backends/monet5/sql_rank.h Branch: window-tunning Log Message:
Updating nth_value, but still fixes to be made diffs (truncated from 843 to 300 lines): diff --git a/gdk/gdk_analytic.h b/gdk/gdk_analytic.h --- a/gdk/gdk_analytic.h +++ b/gdk/gdk_analytic.h @@ -27,7 +27,7 @@ gdk_export gdk_return GDKanalyticalwindo gdk_export gdk_return GDKanalyticalfirst(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int frame_type); gdk_export gdk_return GDKanalyticallast(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int frame_type); -gdk_export gdk_return GDKanalyticalnthvalue(BAT *r, BAT *b, BAT *s, BAT *e, BAT *l, const void *restrict bound, int tp1, int tp2); +gdk_export gdk_return GDKanalyticalnthvalue(BAT *r, BAT *b, BAT *p, BAT *s, BAT *e, BAT *l, const void *restrict bound, int tp1, int tp2, int frame_type); gdk_export gdk_return GDKanalyticalmin(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int frame_type); gdk_export gdk_return GDKanalyticalmax(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int frame_type); 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 @@ -148,7 +148,7 @@ GDKanalyticalntile(BAT *r, BAT *b, BAT * r->tnil = has_nils; return GDK_SUCCEED; nosupport: - GDKerror("type %s not supported for the ntile type.\n", ATOMname(tpe)); + GDKerror("42000!type %s not supported for the ntile type.\n", ATOMname(tpe)); return GDK_FAIL; } @@ -370,104 +370,308 @@ GDKanalyticallast(BAT *r, BAT *p, BAT *o return GDK_SUCCEED; } -#define ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED(TPE1) \ +#define ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_TRIVIAL(TPE1) \ + do { \ + TPE1 *bp = (TPE1*)Tloc(b, 0), *restrict rb = (TPE1*)Tloc(r, 0); \ + TPE1 curval = !is_lng_nil(nth) && nth <= i - k ? bp[nth - 1 + k] : TPE1##_nil; \ + for (; k < i; k++) \ + rb[k] = curval; \ + has_nils |= is_##TPE1##_nil(curval); \ + } while (0) + +#define ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_CURRENT_ROW(TPE1) \ do { \ - TPE1 *bp = (TPE1*)Tloc(b, 0), *bs, *be, curval, *restrict rb = (TPE1*)Tloc(r, 0); \ + TPE1 *bp = (TPE1*)Tloc(b, 0), *restrict rb = (TPE1*)Tloc(r, 0); \ + for (; k < i; k++) { \ + rb[k] = nth == 1 ? bp[k] : TPE1##_nil; \ + has_nils |= is_##TPE1##_nil(rb[k]); \ + } \ + } while (0) + +#define ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_OTHERS(TPE1) \ + do { \ + TPE1 *bp = (TPE1*)Tloc(b, 0), *restrict rb = (TPE1*)Tloc(r, 0); \ if (is_lng_nil(nth)) { \ has_nils = true; \ - for (; i < cnt; i++, rb++) \ - *rb = TPE1##_nil; \ + for (; k < i; k++) \ + rb[k] = TPE1##_nil; \ } else { \ nth--; \ - for (; i < cnt; i++, rb++) { \ - bs = bp + start[i]; \ - be = bp + end[i]; \ - curval = (be > bs && nth < (end[i] - start[i])) ? *(bs + nth) : TPE1##_nil; \ - *rb = curval; \ + for (; k < i; k++) { \ + TPE1 *bs = bp + start[k]; \ + TPE1 *be = bp + end[k]; \ + TPE1 curval = (be > bs && nth < (end[k] - start[k])) ? *(bs + nth) : TPE1##_nil; \ + rb[k] = curval; \ has_nils |= is_##TPE1##_nil(curval); \ } \ } \ } while (0) -#define ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED(TPE1, TPE2, TPE3) \ +#define ANALYTICAL_NTHVALUE_IMP_SINGLE_VARSIZED_TRIVIAL \ + do { \ + const void *curval = !is_lng_nil(nth) && nth <= i - k ? BUNtail(bpi, (BUN) (nth - 1 + k)) : nil; \ + for (; k < i; k++) \ + if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != GDK_SUCCEED) \ + return GDK_FAIL; \ + has_nils |= atomcmp(curval, nil) == 0; \ + } while (0) + +#define ANALYTICAL_NTHVALUE_IMP_SINGLE_VARSIZED_CURRENT_ROW \ + do { \ + for (; k < i; k++) { \ + const void *curval = nth == 1 ? BUNtail(bpi, (BUN) k) : nil; \ + if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != GDK_SUCCEED) \ + return GDK_FAIL; \ + has_nils |= atomcmp(curval, nil) == 0; \ + } \ + } while (0) + +#define ANALYTICAL_NTHVALUE_IMP_SINGLE_VARSIZED_OTHERS \ + do { \ + if (is_lng_nil(nth)) { \ + has_nils = true; \ + for (; k < i; k++) \ + if (tfastins_nocheckVAR(r, k, nil, Tsize(r)) != GDK_SUCCEED) \ + return GDK_FAIL; \ + } else { \ + nth--; \ + for (; k < i; k++) { \ + const void *curval = (end[k] > start[k] && nth < (end[k] - start[k])) ? BUNtail(bpi, (BUN) (start[k] + nth)) : nil; \ + if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != GDK_SUCCEED) \ + return GDK_FAIL; \ + has_nils |= atomcmp(curval, nil) == 0; \ + } \ + } \ + } while (0) + +#define ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_TRIVIAL(TPE1, TPE2, TPE3) \ do { \ TPE2 *restrict lp = (TPE2*)Tloc(l, 0); \ - for (; i < cnt; i++, rb++) { \ - TPE2 lnth = lp[i]; \ - bs = bp + start[i]; \ - be = bp + end[i]; \ - if (is_##TPE2##_nil(lnth) || be <= bs || (TPE3)(lnth - 1) > (TPE3)(end[i] - start[i])) { \ + for (; k < i; k++) { \ + if (!is_##TPE2##_nil(lp[k]) && lp[k] <= 0) goto invalidnth; \ + rb[k] = !is_##TPE2##_nil(lp[k]) && lp[k] <= i - k ? bp[lp[k] - 1 + k] : TPE1##_nil; \ + has_nils |= is_##TPE1##_nil(rb[k]); \ + } \ + } while (0) + +#define ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_CURRENT_ROW(TPE1, TPE2, TPE3) \ + do { \ + TPE2 *restrict lp = (TPE2*)Tloc(l, 0); \ + for (; k < i; k++) { \ + if (!is_##TPE2##_nil(lp[k]) && lp[k] <= 0) goto invalidnth; \ + rb[k] = lp[k] == 1 ? bp[k] : TPE1##_nil; \ + has_nils |= is_##TPE1##_nil(rb[k]); \ + } \ + } while (0) + +#define ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_OTHERS(TPE1, TPE2, TPE3) \ + do { \ + TPE1 curval; \ + TPE2 *restrict lp = (TPE2*)Tloc(l, 0); \ + for (; k < i; k++) { \ + TPE2 lnth = lp[k]; \ + TPE1 *bs = bp + start[k]; \ + TPE1 *be = bp + end[k]; \ + if (!is_##TPE2##_nil(nth) && nth <= 0) goto invalidnth; \ + if (is_##TPE2##_nil(lnth) || be <= bs || (TPE3)(lnth - 1) > (TPE3)(end[k] - start[k])) { \ curval = TPE1##_nil; \ has_nils = true; \ } else { \ curval = *(bs + lnth - 1); \ has_nils |= is_##TPE1##_nil(curval); \ } \ - *rb = curval; \ + rb[k] = curval; \ + } \ + } while (0) + +#define ANALYTICAL_NTHVALUE_IMP_MULTI_VARSIZED_TRIVIAL(TPE1, TPE2) \ + do { \ + const void *curval = nil; \ + TPE2 *restrict lp = (TPE2*)Tloc(l, 0); \ + for (; k < i; k++) { \ + if (!is_##TPE2##_nil(lp[k]) && lp[k] <= 0) goto invalidnth; \ + curval = !is_##TPE2##_nil(lp[k]) && lp[k] <= i - k ? BUNtail(bpi, (BUN) (lp[k] - 1 + k)) : nil; \ + if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != GDK_SUCCEED) \ + return GDK_FAIL; \ + has_nils |= atomcmp(curval, nil) == 0; \ + } \ + } while (0) + +#define ANALYTICAL_NTHVALUE_IMP_MULTI_VARSIZED_CURRENT_ROW(TPE1, TPE2) \ + do { \ + const void *curval = nil; \ + TPE2 *restrict lp = (TPE2*)Tloc(l, 0); \ + for (; k < i; k++) { \ + if (!is_##TPE2##_nil(lp[k]) && lp[k] <= 0) goto invalidnth; \ + curval = lp[k] == 1 ? BUNtail(bpi, (BUN) lp[k]) : nil; \ + if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != GDK_SUCCEED) \ + return GDK_FAIL; \ + has_nils |= atomcmp(curval, nil) == 0; \ + } \ + } while (0) + +#define ANALYTICAL_NTHVALUE_IMP_MULTI_VARSIZED_OTHERS(TPE1, TPE2) \ + do { \ + const void *curval = nil; \ + TPE1 *restrict lp = (TPE1*)Tloc(l, 0); \ + for (; k < i; k++) { \ + TPE1 lnth = lp[k]; \ + if (!is_##TPE1##_nil(nth) && nth <= 0) goto invalidnth; \ + if (is_##TPE1##_nil(lnth) || end[k] <= start[k] || (TPE2)(lnth - 1) > (TPE2)(end[k] - start[k])) { \ + curval = (void *) nil; \ + has_nils = true; \ + } else { \ + curval = BUNtail(bpi, (BUN) (start[k] + lnth - 1)); \ + has_nils |= atomcmp(curval, nil) == 0; \ + } \ + if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != GDK_SUCCEED) \ + return GDK_FAIL; \ } \ } while (0) #ifdef HAVE_HGE -#define ANALYTICAL_NTHVALUE_CALC_FIXED_HGE(TPE1) \ +#define ANALYTICAL_NTHVALUE_CALC_FIXED_HGE(TPE1, IMP) \ case TYPE_hge: \ - ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED(TPE1, hge, hge); \ + ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_##IMP(TPE1, hge, hge); \ break; #else -#define ANALYTICAL_NTHVALUE_CALC_FIXED_HGE(TPE1) +#define ANALYTICAL_NTHVALUE_CALC_FIXED_HGE(TPE1, IMP) #endif -#define ANALYTICAL_NTHVALUE_CALC_FIXED(TPE1) \ +#define ANALYTICAL_NTHVALUE_MULTI_FIXED(TPE1, IMP) \ do { \ - TPE1 *bp = (TPE1*)Tloc(b, 0), *bs, *be, curval, *restrict rb = (TPE1*)Tloc(r, 0); \ + TPE1 *bp = (TPE1*)Tloc(b, 0), *restrict rb = (TPE1*)Tloc(r, 0); \ switch (tp2) { \ case TYPE_bte: \ - ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED(TPE1, bte, lng); \ + ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_##IMP(TPE1, bte, lng); \ break; \ case TYPE_sht: \ - ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED(TPE1, sht, lng); \ + ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_##IMP(TPE1, sht, lng); \ break; \ case TYPE_int: \ - ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED(TPE1, int, lng); \ + ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_##IMP(TPE1, int, lng); \ break; \ case TYPE_lng: \ - ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED(TPE1, lng, lng); \ + ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_##IMP(TPE1, lng, lng); \ break; \ - ANALYTICAL_NTHVALUE_CALC_FIXED_HGE(TPE1) \ + ANALYTICAL_NTHVALUE_CALC_FIXED_HGE(TPE1, IMP) \ default: \ goto nosupport; \ } \ } while (0) -#define ANALYTICAL_NTHVALUE_IMP_MULTI_VARSIZED(TPE1, TPE2) \ - do { \ - TPE1 *restrict lp = (TPE1*)Tloc(l, 0); \ - for (; i < cnt; i++) { \ - TPE1 lnth = lp[i]; \ - if (is_##TPE1##_nil(lnth) || end[i] <= start[i] || (TPE2)(lnth - 1) > (TPE2)(end[i] - start[i])) { \ - curval = (void *) nil; \ - has_nils = true; \ - } else { \ - curval = BUNtail(bpi, (BUN) (start[i] + lnth - 1)); \ - has_nils |= atomcmp(curval, nil) == 0; \ +#ifdef HAVE_HGE +#define ANALYTICAL_NTH_VALUE_SINGLE_LIMIT(IMP) \ + case TYPE_hge: \ + ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_##IMP(hge); \ + break; +#define ANALYTICAL_NTHVALUE_MULTI_FIXED_LIMIT(IMP) \ + case TYPE_hge: \ + ANALYTICAL_NTHVALUE_MULTI_FIXED(hge, IMP); \ + break; +#define ANALYTICAL_NTHVALUE_MULTI_VARSIZED_LIMIT(IMP) \ + case TYPE_hge: \ + ANALYTICAL_NTHVALUE_IMP_MULTI_VARSIZED_##IMP(hge, hge); \ + break; +#else +#define ANALYTICAL_NTH_VALUE_SINGLE_LIMIT(IMP) +#define ANALYTICAL_NTHVALUE_MULTI_FIXED_LIMIT(IMP) +#define ANALYTICAL_NTHVALUE_MULTI_FIXED_VARSIZED(IMP) +#endif + +#define ANALYTICAL_NTH_VALUE_BRANCHES(IMP) \ + do { \ + if (bound) { \ + switch (ATOMbasetype(tp1)) { \ + case TYPE_bte: \ + ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_##IMP(bte); \ + break; \ + case TYPE_sht: \ + ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_##IMP(sht); \ + break; \ + case TYPE_int: \ + ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_##IMP(int); \ + break; \ + case TYPE_lng: \ + ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_##IMP(lng); \ + break; \ + ANALYTICAL_NTH_VALUE_SINGLE_LIMIT(IMP) \ + case TYPE_flt: \ + ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_##IMP(flt); \ + break; \ + case TYPE_dbl: \ + ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_##IMP(dbl); \ + break; \ + default: { \ + ANALYTICAL_NTHVALUE_IMP_SINGLE_VARSIZED_##IMP; \ + } \ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list