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

Reply via email to