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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list