Changeset: f781975f23d0 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f781975f23d0 Modified Files: sql/backends/monet5/sql_rank.c sql/test/analytics/Tests/analytics01.sql sql/test/analytics/Tests/analytics01.stable.out Branch: Nov2019 Log Message:
Merge with Apr2019 diffs (116 lines): diff --git a/sql/backends/monet5/sql_rank.c b/sql/backends/monet5/sql_rank.c --- a/sql/backends/monet5/sql_rank.c +++ b/sql/backends/monet5/sql_rank.c @@ -996,19 +996,25 @@ SQLnth_value(Client cntxt, MalBlkPtr mb, return MAL_SUCCEED; } -#define CHECK_L_VALUE(TPE) \ - do { \ - TPE rval = *getArgReference_##TPE(stk, pci, 2); \ - l_value = is_##TPE##_nil(rval) ? BUN_NONE : (rval > 0 ? (BUN)rval : (BUN)(-1 * rval)); \ +#define CHECK_L_VALUE(TPE) \ + do { \ + TPE rval = *getArgReference_##TPE(stk, pci, 2); \ + if (!is_##TPE##_nil(rval) && rval < 0) { \ + gdk_call = dual; \ + rval *= -1; \ + } \ + l_value = is_##TPE##_nil(rval) ? BUN_NONE : (BUN)rval; \ } while(0); -static str /* the variable m is used to fix the multiplier */ +static str do_lead_lag(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, const char* op, const char* desc, - gdk_return (*func)(BAT *, BAT *, BAT *, BUN, const void* restrict, int)) + gdk_return (*func)(BAT *, BAT *, BAT *, BUN, const void* restrict, int), + gdk_return (*dual)(BAT *, BAT *, BAT *, BUN, const void* restrict, int)) { int tp1, tp2, tp3, base = 2; BUN l_value = 1; const void *restrict default_value; + gdk_return (*gdk_call)(BAT *, BAT *, BAT *, BUN, const void* restrict, int) = func; (void)cntxt; if (pci->argc < 4 || pci->argc > 6) @@ -1079,11 +1085,11 @@ do_lead_lag(Client cntxt, MalBlkPtr mb, } } - gdk_code = func(r, b, p, l_value, default_value, tp1); + gdk_code = gdk_call(r, b, p, l_value, default_value, tp1); BATsetcount(r, cnt); BBPunfix(b->batCacheid); - if(gdk_code == GDK_SUCCEED) + if (gdk_code == GDK_SUCCEED) BBPkeepref(*res = r->batCacheid); else throw(SQL, op, GDK_EXCEPTION); @@ -1103,13 +1109,13 @@ do_lead_lag(Client cntxt, MalBlkPtr mb, str SQLlag(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - return do_lead_lag(cntxt, mb, stk, pci, "sql.lag", "lag", GDKanalyticallag); + return do_lead_lag(cntxt, mb, stk, pci, "sql.lag", "lag", GDKanalyticallag, GDKanalyticallead); } str SQLlead(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - return do_lead_lag(cntxt, mb, stk, pci, "sql.lead", "lead", GDKanalyticallead); + return do_lead_lag(cntxt, mb, stk, pci, "sql.lead", "lead", GDKanalyticallead, GDKanalyticallag); } /* we will keep the ordering bat here although is not needed, but maybe later with varied sized windows */ diff --git a/sql/test/analytics/Tests/analytics01.sql b/sql/test/analytics/Tests/analytics01.sql --- a/sql/test/analytics/Tests/analytics01.sql +++ b/sql/test/analytics/Tests/analytics01.sql @@ -211,6 +211,9 @@ create table t1 (col1 int, col2 int); insert into t1 values (8481, 0), (8489, 0), (8489, 1), (8498, 0), (8498, 1), (8498, 2), (8507, 0), (8507, 1), (8507, 2); select col1, col2, lag(col2) over (partition by col1 ORDER BY col2), lag(col2, 2) over (partition by col1 ORDER BY col2), lag(col2, 3) over (partition by col1 ORDER BY col2) from t1; +select lag(col2, -1) over (partition by col1 ORDER BY col2), lag(col2, 1) over (partition by col1 ORDER BY col2), lag(col2, 2) over (partition by col1 ORDER BY col2) from t1; +select lead(col2, -1) over (partition by col1 ORDER BY col2), lead(col2, 1) over (partition by col1 ORDER BY col2), lead(col2, 2) over (partition by col1 ORDER BY col2) from t1; + rollback; select ntile(aa) over () from analytics; --error diff --git a/sql/test/analytics/Tests/analytics01.stable.out b/sql/test/analytics/Tests/analytics01.stable.out --- a/sql/test/analytics/Tests/analytics01.stable.out +++ b/sql/test/analytics/Tests/analytics01.stable.out @@ -2522,6 +2522,34 @@ stdout of test 'analytics01` in director [ 8507, 0, NULL, NULL, NULL ] [ 8507, 1, 0, NULL, NULL ] [ 8507, 2, 1, 0, NULL ] +#select lag(col2, -1) over (partition by col1 ORDER BY col2), lag(col2, 1) over (partition by col1 ORDER BY col2), lag(col2, 2) over (partition by col1 ORDER BY col2) from t1; +% sys.L3, sys.L7, sys.L13 # table_name +% L3, L7, L13 # name +% int, int, int # type +% 1, 1, 1 # length +[ NULL, NULL, NULL ] +[ 1, NULL, NULL ] +[ NULL, 0, NULL ] +[ 1, NULL, NULL ] +[ 2, 0, NULL ] +[ NULL, 1, 0 ] +[ 1, NULL, NULL ] +[ 2, 0, NULL ] +[ NULL, 1, 0 ] +#select lead(col2, -1) over (partition by col1 ORDER BY col2), lead(col2, 1) over (partition by col1 ORDER BY col2), lead(col2, 2) over (partition by col1 ORDER BY col2) from t1; +% sys.L3, sys.L7, sys.L13 # table_name +% L3, L7, L13 # name +% int, int, int # type +% 1, 1, 1 # length +[ NULL, NULL, NULL ] +[ NULL, 1, NULL ] +[ 0, NULL, NULL ] +[ NULL, 1, 2 ] +[ 0, 2, NULL ] +[ 1, NULL, NULL ] +[ NULL, 1, 2 ] +[ 0, 2, NULL ] +[ 1, NULL, NULL ] #rollback; #drop table analytics; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list