Changeset: 4552ffffb044 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4552ffffb044
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
cmake/monetdb-defines.cmake
gdk/gdk_tracer.c
gdk/gdk_tracer.h
sql/backends/monet5/sql.c
sql/backends/monet5/sql_subquery.c
sql/backends/monet5/sql_subquery.h
sql/backends/monet5/sql_subquery.mal
tools/monetdbe/monetdbe.c
Branch: default
Log Message:
merged
diffs (truncated from 625 to 300 lines):
diff --git a/clients/Tests/MAL-signatures.stable.out
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -246,10 +246,12 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "str_group_concat", "pattern
aggr.str_group_concat(X_1:bat[:str], X_2:bat[:str], X_3:bat[:oid], X_4:bit):str
", "CMDBATstr_group_concat;", "" ]
[ "aggr", "str_group_concat", "pattern
aggr.str_group_concat(X_1:bat[:str], X_2:bat[:str], X_3:bit):str ",
"CMDBATstr_group_concat;", "" ]
[ "aggr", "str_group_concat", "pattern
aggr.str_group_concat(X_1:bat[:str], X_2:bit):str ",
"CMDBATstr_group_concat;", "" ]
-[ "aggr", "suballnotequal", "command
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid],
X_4:bat[:oid], X_5:bat[:oid], X_6:bit):bat[:bit] ",
"SQLallnotequal_grp2;", "" ]
+[ "aggr", "suballnotequal", "pattern
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid],
X_4:bat[:oid], X_5:bat[:oid], X_6:bat[:oid], X_7:bit):bat[:bit] ",
"SQLallnotequal_grp2;", "" ]
+[ "aggr", "suballnotequal", "pattern
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid],
X_4:bat[:oid], X_5:bat[:oid], X_6:bit):bat[:bit] ",
"SQLallnotequal_grp2;", "" ]
[ "aggr", "suballnotequal", "pattern
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid],
X_4:bat[:oid], X_5:bat[:oid], X_6:bit):bat[:bit] ",
"SQLallnotequal_grp;", "" ]
[ "aggr", "suballnotequal", "pattern
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid],
X_4:bat[:oid], X_5:bit):bat[:bit] ", "SQLallnotequal_grp;", "" ]
-[ "aggr", "subanyequal", "command aggr.subanyequal(X_1:bat[:any_1],
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:oid],
X_6:bit):bat[:bit] ", "SQLanyequal_grp2;", "" ]
+[ "aggr", "subanyequal", "pattern aggr.subanyequal(X_1:bat[:any_1],
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:oid], X_6:bat[:oid],
X_7:bit):bat[:bit] ", "SQLanyequal_grp2;", "" ]
+[ "aggr", "subanyequal", "pattern aggr.subanyequal(X_1:bat[:any_1],
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:oid],
X_6:bit):bat[:bit] ", "SQLanyequal_grp2;", "" ]
[ "aggr", "subanyequal", "pattern aggr.subanyequal(X_1:bat[:any_1],
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:oid],
X_6:bit):bat[:bit] ", "SQLanyequal_grp;", "" ]
[ "aggr", "subanyequal", "pattern aggr.subanyequal(X_1:bat[:any_1],
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bit):bat[:bit] ",
"SQLanyequal_grp;", "" ]
[ "aggr", "subavg", "command aggr.subavg(X_1:bat[:bte],
X_2:bat[:oid], X_3:bat[:any_1], X_4:bit, X_5:bit):bat[:dbl] ",
"AGGRsubavg1_dbl;", "" ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -286,10 +286,12 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "str_group_concat", "pattern
aggr.str_group_concat(X_1:bat[:str], X_2:bat[:str], X_3:bat[:oid], X_4:bit):str
", "CMDBATstr_group_concat;", "" ]
[ "aggr", "str_group_concat", "pattern
aggr.str_group_concat(X_1:bat[:str], X_2:bat[:str], X_3:bit):str ",
"CMDBATstr_group_concat;", "" ]
[ "aggr", "str_group_concat", "pattern
aggr.str_group_concat(X_1:bat[:str], X_2:bit):str ",
"CMDBATstr_group_concat;", "" ]
-[ "aggr", "suballnotequal", "command
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid],
X_4:bat[:oid], X_5:bat[:oid], X_6:bit):bat[:bit] ",
"SQLallnotequal_grp2;", "" ]
+[ "aggr", "suballnotequal", "pattern
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid],
X_4:bat[:oid], X_5:bat[:oid], X_6:bat[:oid], X_7:bit):bat[:bit] ",
"SQLallnotequal_grp2;", "" ]
+[ "aggr", "suballnotequal", "pattern
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid],
X_4:bat[:oid], X_5:bat[:oid], X_6:bit):bat[:bit] ",
"SQLallnotequal_grp2;", "" ]
[ "aggr", "suballnotequal", "pattern
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid],
X_4:bat[:oid], X_5:bat[:oid], X_6:bit):bat[:bit] ",
"SQLallnotequal_grp;", "" ]
[ "aggr", "suballnotequal", "pattern
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid],
X_4:bat[:oid], X_5:bit):bat[:bit] ", "SQLallnotequal_grp;", "" ]
-[ "aggr", "subanyequal", "command aggr.subanyequal(X_1:bat[:any_1],
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:oid],
X_6:bit):bat[:bit] ", "SQLanyequal_grp2;", "" ]
+[ "aggr", "subanyequal", "pattern aggr.subanyequal(X_1:bat[:any_1],
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:oid], X_6:bat[:oid],
X_7:bit):bat[:bit] ", "SQLanyequal_grp2;", "" ]
+[ "aggr", "subanyequal", "pattern aggr.subanyequal(X_1:bat[:any_1],
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:oid],
X_6:bit):bat[:bit] ", "SQLanyequal_grp2;", "" ]
[ "aggr", "subanyequal", "pattern aggr.subanyequal(X_1:bat[:any_1],
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:oid],
X_6:bit):bat[:bit] ", "SQLanyequal_grp;", "" ]
[ "aggr", "subanyequal", "pattern aggr.subanyequal(X_1:bat[:any_1],
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bit):bat[:bit] ",
"SQLanyequal_grp;", "" ]
[ "aggr", "subavg", "command aggr.subavg(X_1:bat[:bte],
X_2:bat[:oid], X_3:bat[:any_1], X_4:bit, X_5:bit):bat[:dbl] ",
"AGGRsubavg1_dbl;", "" ]
diff --git a/cmake/monetdb-defines.cmake b/cmake/monetdb-defines.cmake
--- a/cmake/monetdb-defines.cmake
+++ b/cmake/monetdb-defines.cmake
@@ -76,7 +76,10 @@ function(monetdb_configure_defines)
check_symbol_exists("ftime" "sys/timeb.h" HAVE_FTIME)
check_function_exists("getexecname" HAVE_GETEXECNAME)
check_function_exists("getlogin" HAVE_GETLOGIN)
- check_symbol_exists("getopt_long" "getopt.h" HAVE_GETOPT_LONG)
+ cmake_push_check_state()
+ set(CMAKE_REQUIRED_INCLUDES "${HAVE_GETOPT_H}")
+ check_symbol_exists("getopt_long" "getopt.h" HAVE_GETOPT_LONG)
+ cmake_pop_check_state()
check_function_exists("getrlimit" HAVE_GETRLIMIT)
check_function_exists("gettimeofday" HAVE_GETTIMEOFDAY)
check_function_exists("getuid" HAVE_GETUID)
diff --git a/gdk/gdk_tracer.c b/gdk/gdk_tracer.c
--- a/gdk/gdk_tracer.c
+++ b/gdk/gdk_tracer.c
@@ -407,6 +407,9 @@ GDKtracer_log(const char *file, const ch
const char *syserr,
const char *fmt, ...)
{
+ if ((adapter_t) ATOMIC_GET(&cur_adapter) == MBEDDED)
+ return;
+
int bytes_written;
char buffer[512]; /* should be plenty big enough for a message */
va_list va;
diff --git a/gdk/gdk_tracer.h b/gdk/gdk_tracer.h
--- a/gdk/gdk_tracer.h
+++ b/gdk/gdk_tracer.h
@@ -39,10 +39,11 @@
// ADAPTERS
-#define FOREACH_ADPTR(ADPTR) \
+#define FOREACH_ADPTR(ADPTR) \
ADPTR( BASIC ) \
ADPTR( PROFILER ) \
- \
+ ADPTR( MBEDDED ) \
+ \
ADPTR( ADAPTERS_COUNT )
typedef enum {
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -6638,10 +6638,12 @@ static mel_func sql_init_funcs[] = {
command("aggr", "allnotequal", SQLallnotequal, false, "if all values in r are
not equal to l return true, else if r has nil nil else false", args(1,3,
arg("",bit),batargany("l",1),batargany("r",1))),
pattern("aggr", "subanyequal", SQLanyequal_grp, false, "if any value in r is
equal to l return true, else if r has nil nil else false", args(1,6,
batarg("",bit),batargany("l",1),batargany("r",1),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))),
pattern("aggr", "subanyequal", SQLanyequal_grp, false, "if any value in r is
equal to l return true, else if r has nil nil else false; with candidate list",
args(1,7,
batarg("",bit),batargany("l",1),batargany("r",1),batarg("g",oid),batarg("e",oid),batarg("s",oid),arg("no_nil",bit))),
- command("aggr", "subanyequal", SQLanyequal_grp2, false, "if any value in r is
equal to l return true, else if r has nil nil else false, except if rid is nil
(ie empty) then false", args(1,7,
batarg("",bit),batargany("l",1),batargany("r",1),batarg("rid",oid),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))),
+ pattern("aggr", "subanyequal", SQLanyequal_grp2, false, "if any value in r is
equal to l return true, else if r has nil nil else false, except if rid is nil
(ie empty) then false", args(1,7,
batarg("",bit),batargany("l",1),batargany("r",1),batarg("rid",oid),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))),
+ pattern("aggr", "subanyequal", SQLanyequal_grp2, false, "if any value in r is
equal to l return true, else if r has nil nil else false, except if rid is nil
(ie empty) then false; with candidate list", args(1,8,
batarg("",bit),batargany("l",1),batargany("r",1),batarg("rid",oid),batarg("g",oid),batarg("e",oid),batarg("s",oid),arg("no_nil",bit))),
pattern("aggr", "suballnotequal", SQLallnotequal_grp, false, "if all values
in r are not equal to l return true, else if r has nil nil else false",
args(1,6,
batarg("",bit),batargany("l",1),batargany("r",1),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))),
pattern("aggr", "suballnotequal", SQLallnotequal_grp, false, "if all values
in r are not equal to l return true, else if r has nil nil else false; with
candidate list", args(1,7,
batarg("",bit),batargany("l",1),batargany("r",1),batarg("g",oid),batarg("e",oid),batarg("s",oid),arg("no_nil",bit))),
- command("aggr", "suballnotequal", SQLallnotequal_grp2, false, "if all values
in r are not equal to l return true, else if r has nil nil else false, except
if rid is nil (ie empty) then true", args(1,7,
batarg("",bit),batargany("l",1),batargany("r",1),batarg("rid",oid),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))),
+ pattern("aggr", "suballnotequal", SQLallnotequal_grp2, false, "if all values
in r are not equal to l return true, else if r has nil nil else false, except
if rid is nil (ie empty) then true", args(1,7,
batarg("",bit),batargany("l",1),batargany("r",1),batarg("rid",oid),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))),
+ pattern("aggr", "suballnotequal", SQLallnotequal_grp2, false, "if all values
in r are not equal to l return true, else if r has nil nil else false, except
if rid is nil (ie empty) then true; with candidate list", args(1,8,
batarg("",bit),batargany("l",1),batargany("r",1),batarg("rid",oid),batarg("g",oid),batarg("e",oid),batarg("s",oid),arg("no_nil",bit))),
// command("aggr", "exist", ALGexist, false, "", args(1,3,
arg("",bit),batargany("b",2),argany("h",1))),
pattern("aggr", "exist", SQLexist, false, "", args(1,2, arg("",bit),
argany("b",1))),
pattern("bataggr", "exist", SQLexist, false, "", args(1,2, batarg("",bit),
argany("b",1))),
diff --git a/sql/backends/monet5/sql_subquery.c
b/sql/backends/monet5/sql_subquery.c
--- a/sql/backends/monet5/sql_subquery.c
+++ b/sql/backends/monet5/sql_subquery.c
@@ -738,73 +738,109 @@ bailout:
return msg;
}
-#define SQLanyequal_or_not_grp2_imp(TPE, VAL1, VAL2) \
- do { \
- TPE *lp = (TPE*)Tloc(l, 0), *rp = (TPE*)Tloc(r, 0); \
- for (BUN q = offset, s = 0; s < o; q++, s++) { \
- TPE lv = lp[q], rv = rp[q]; \
- const oid rid = *(oid*)BUNtail(ii, q); \
- const oid id = *(oid*)BUNtail(gi, s); \
- if (ret[id] != VAL1) { \
- if (rid == oid_nil) { \
- ret[id] = VAL2; \
- } else if (is_##TPE##_nil(lv) ||
is_##TPE##_nil(rv)) { \
- ret[id] = bit_nil; \
- hasnil = 1; \
- } else if (lv == rv) \
- ret[id] = VAL1; \
+#define SQLanyequal_or_not_grp2_imp(TYPE, VAL1, VAL2) \
+ do { \
+ const TYPE *vals1 = (const TYPE *) Tloc(l, 0); \
+ const TYPE *vals2 = (const TYPE *) Tloc(r, 0); \
+ while (ncand > 0) { \
+ ncand--; \
+ i = canditer_next(&ci) - l->hseqbase; \
+ if (gids == NULL || \
+ (gids[i] >= min && gids[i] <= max)) { \
+ if (gids) \
+ gid = gids[i] - min; \
+ else \
+ gid = (oid) i; \
+ if (ret[gid] != VAL1) { \
+ const oid id = *(oid*)BUNtail(ii, i); \
+ if (is_oid_nil(id)) { \
+ ret[gid] = VAL2; \
+ } else if (is_##TYPE##_nil(vals1[i]) ||
is_##TYPE##_nil(vals2[i])) { \
+ ret[gid] = bit_nil; \
+ hasnil = 1; \
+ } else if (vals1[i] == vals2[i]) { \
+ ret[gid] = VAL1; \
+ } \
+ } \
} \
} \
} while (0)
str
-SQLanyequal_grp2(bat *ret, const bat *bid1, const bat *bid2, const bat *Rid,
const bat *gp, const bat *gpe, bit *no_nil)
+SQLanyequal_grp2(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- BAT *l, *r, *rid, *g, *e, *res;
- bit F = FALSE, hasnil = 0;
- BUN offset = 0;
+ bat *ret = getArgReference_bat(stk, pci, 0);
+ bat *lp = getArgReference_bat(stk, pci, 1);
+ bat *rp = getArgReference_bat(stk, pci, 2);
+ bat *ip = getArgReference_bat(stk, pci, 3);
+ bat *gp = getArgReference_bat(stk, pci, 4);
+ bat *gpe = getArgReference_bat(stk, pci, 5);
+ bat *sp = pci->argc == 8 ? getArgReference_bat(stk, pci, 6) : NULL;
+ //bit *no_nil = getArgReference_bit(stk, pci, pci->argc == 8 ? 7 : 6);
no_nil argument is ignored
+ BAT *l = NULL, *r = NULL, *rid = NULL, *g = NULL, *e = NULL, *s = NULL,
*res = NULL;
+ const oid *restrict gids;
+ oid gid, min, max;
+ BUN i, ngrp, ncand;
+ struct canditer ci;
+ str msg = MAL_SUCCEED;
+ bit hasnil = 0;
- (void)no_nil;
- if ((l = BATdescriptor(*bid1)) == NULL) {
- throw(SQL, "sql.any =", SQLSTATE(HY005) "Cannot access column
descriptor");
+ (void)cntxt;
+ (void)mb;
+
+ if ((l = BATdescriptor(*lp)) == NULL) {
+ msg = createException(SQL, "sql.any =", SQLSTATE(HY005) "Cannot
access column descriptor");
+ goto bailout;
}
- if ((r = BATdescriptor(*bid2)) == NULL) {
- BBPunfix(l->batCacheid);
- throw(SQL, "sql.any =", SQLSTATE(HY005) "Cannot access column
descriptor");
+ if ((r = BATdescriptor(*rp)) == NULL) {
+ msg = createException(SQL, "sql.any =", SQLSTATE(HY005) "Cannot
access column descriptor");
+ goto bailout;
}
- if ((rid = BATdescriptor(*Rid)) == NULL) {
- BBPunfix(l->batCacheid);
- BBPunfix(r->batCacheid);
- throw(SQL, "sql.any =", SQLSTATE(HY005) "Cannot access column
descriptor");
+ if ((rid = BATdescriptor(*ip)) == NULL) {
+ msg = createException(SQL, "sql.any =", SQLSTATE(HY005) "Cannot
access column descriptor");
+ goto bailout;
}
if ((g = BATdescriptor(*gp)) == NULL) {
- BBPunfix(l->batCacheid);
- BBPunfix(r->batCacheid);
- BBPunfix(rid->batCacheid);
- throw(SQL, "sql.any =", SQLSTATE(HY005) "Cannot access column
descriptor");
+ msg = createException(SQL, "sql.any =", SQLSTATE(HY005) "Cannot
access column descriptor");
+ goto bailout;
}
if ((e = BATdescriptor(*gpe)) == NULL) {
- BBPunfix(l->batCacheid);
- BBPunfix(r->batCacheid);
- BBPunfix(rid->batCacheid);
- BBPunfix(g->batCacheid);
- throw(SQL, "sql.any =", SQLSTATE(HY005) "Cannot access column
descriptor");
+ msg = createException(SQL, "sql.any =", SQLSTATE(HY005) "Cannot
access column descriptor");
+ goto bailout;
+ }
+ if (sp && (s = BATdescriptor(*sp)) == NULL) {
+ msg = createException(SQL, "sql.any =", SQLSTATE(HY005) "Cannot
access column descriptor");
+ goto bailout;
+ }
+
+ if ((msg = (str)BATgroupaggrinit(l, g, e, s, &min, &max, &ngrp, &ci,
&ncand)) != NULL)
+ goto bailout;
+ if (g == NULL) {
+ msg = createException(SQL, "sql.any =", SQLSTATE(HY005) "l, r,
rid and g must be aligned");
+ goto bailout;
}
- if ((res = BATconstant(0, TYPE_bit, &F, BATcount(e), TRANSIENT)) ==
NULL) {
- BBPunfix(l->batCacheid);
- BBPunfix(r->batCacheid);
- BBPunfix(rid->batCacheid);
- BBPunfix(g->batCacheid);
- BBPunfix(e->batCacheid);
- throw(SQL, "sql.any =", SQLSTATE(HY013) MAL_MALLOC_FAIL);
- }
- BAThseqbase(res, e->hseqbase);
- assert(BATcount(l) == BATcount(r));
- offset = g->hseqbase - l->hseqbase;
- if (BATcount(g) > 0) {
- bit *restrict ret = (bit*)Tloc(res, 0);
- BATiter gi = bat_iterator(g), ii = bat_iterator(rid);
- BUN o = BUNlast(g);
+
+ if (BATcount(l) == 0 || ngrp == 0) {
+ bit F = FALSE;
+ if ((res = BATconstant(ngrp == 0 ? 0 : min, TYPE_bit, &F, ngrp,
TRANSIENT)) == NULL) {
+ msg = createException(SQL, "sql.any =", SQLSTATE(HY005)
"Cannot access column descriptor");
+ goto bailout;
+ }
+ } else {
+ BATiter ii = bat_iterator(rid);
+ bit *restrict ret;
+
+ if ((res = COLnew(min, TYPE_bit, ngrp, TRANSIENT)) == NULL) {
+ msg = createException(SQL, "sql.any =", SQLSTATE(HY005)
"Cannot access column descriptor");
+ goto bailout;
+ }
+ ret = (bit *) Tloc(res, 0);
+ memset(ret, FALSE, ngrp * sizeof(bit));
+
+ if (!g || BATtdense(g))
+ gids = NULL;
+ else
+ gids = (const oid *) Tloc(g, 0);
switch (l->ttype) {
case TYPE_bit:
@@ -838,36 +874,59 @@ SQLanyequal_grp2(bat *ret, const bat *bi
const void *nilp = ATOMnilptr(l->ttype);
BATiter li = bat_iterator(l), ri = bat_iterator(r);
- for (BUN q = offset, s = 0; s < o; q++, s++) {
- const void *lv = BUNtail(li, q);
- const void *rv = BUNtail(ri, q);
- const oid rid = *(oid*)BUNtail(ii, q);
- const oid id = *(oid*)BUNtail(gi, s);
-
- if (ret[id] != TRUE) {
- if (rid == oid_nil) { /* empty */
- ret[id] = FALSE;
- } else if (ocmp(lv, nilp) == 0 ||
ocmp(rv, nilp) == 0) {
- ret[id] = bit_nil;
- hasnil = 1;
- } else if (ocmp(lv, rv) == 0)
- ret[id] = TRUE;
+ while (ncand > 0) {
+ ncand--;
+ i = canditer_next(&ci) - l->hseqbase;
+ if (gids == NULL ||
+ (gids[i] >= min && gids[i] <= max)) {
+ if (gids)
+ gid = gids[i] - min;
+ else
+ gid = (oid) i;
+ if (ret[gid] != TRUE) {
+ const oid id =
*(oid*)BUNtail(ii, i);
+ if (is_oid_nil(id)) {
+ ret[gid] = FALSE;
+ } else {
+ const void *lv =
BUNtail(li, i);
+ const void *rv =
BUNtail(ri, i);
+ if (ocmp(lv, nilp) == 0
|| ocmp(rv, nilp) == 0) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list