Changeset: ab4f55107eab for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ab4f55107eab
Modified Files:
sql/backends/monet5/sql.c
sql/storage/bat/bat_storage.c
Branch: default
Log Message:
merged
diffs (truncated from 1274 to 300 lines):
diff --git a/clients/Tests/MAL-signatures.test
b/clients/Tests/MAL-signatures.test
--- a/clients/Tests/MAL-signatures.test
+++ b/clients/Tests/MAL-signatures.test
@@ -38365,8 +38365,13 @@ SQLstr_auto_vacuum;
auto vacuum string column with interval(sec)
sql
vacuum
+unsafe pattern sql.vacuum(X_0:str, X_1:str):void
+SQLstr_vacuum;
+vacuum a string column
+sql
+vacuum
unsafe pattern sql.vacuum(X_0:str, X_1:str, X_2:str):void
-SQLstr_column_vacuum;
+SQLstr_vacuum;
vacuum a string column
sql
variance
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -188,7 +188,7 @@ gdk_return BATrtree(BAT *wkb, BAT *mbr);
BAT *BATsample(BAT *b, BUN n);
BAT *BATsample_with_seed(BAT *b, BUN n, uint64_t seed);
gdk_return BATsave(BAT *b) __attribute__((__warn_unused_result__));
-BAT *BATselect(BAT *b, BAT *s, const void *tl, const void *th, bool li, bool
hi, bool anti);
+BAT *BATselect(BAT *b, BAT *s, const void *tl, const void *th, bool li, bool
hi, bool anti, bool nil_matches);
gdk_return BATsemijoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr,
bool nil_matches, bool max_one, BUN estimate)
__attribute__((__warn_unused_result__));
BAT *BATsetaccess(BAT *b, restrict_t mode)
__attribute__((__warn_unused_result__));
void BATsetcapacity(BAT *b, BUN cnt);
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2265,7 +2265,7 @@ gdk_export ValPtr BATsetprop_nolock(BAT
#define JOIN_BAND 3
#define JOIN_NE (-3)
-gdk_export BAT *BATselect(BAT *b, BAT *s, const void *tl, const void *th, bool
li, bool hi, bool anti);
+gdk_export BAT *BATselect(BAT *b, BAT *s, const void *tl, const void *th, bool
li, bool hi, bool anti, bool nil_matches);
gdk_export BAT *BATthetaselect(BAT *b, BAT *s, const void *val, const char
*op);
gdk_export BAT *BATconstant(oid hseq, int tt, const void *val, BUN cnt, role_t
role);
diff --git a/gdk/gdk_firstn.c b/gdk/gdk_firstn.c
--- a/gdk/gdk_firstn.c
+++ b/gdk/gdk_firstn.c
@@ -1067,7 +1067,7 @@ BATfirstn_grouped(BAT **topn, BAT **gids
BAT *bn1, *bn2;
bn1 = bn;
- bn2 = BATselect(bi->b, s, BUNtail(*bi, last -
bi->b->hseqbase), NULL, true, false, false);
+ bn2 = BATselect(bi->b, s, BUNtail(*bi, last -
bi->b->hseqbase), NULL, true, false, false, false);
if (bn2 == NULL) {
BBPunfix(bn1->batCacheid);
return GDK_FAIL;
@@ -1193,7 +1193,7 @@ BATfirstn_grouped_with_groups(BAT **topn
BAT *bn1, *bn2, *bn3, *bn4;
bn1 = bn;
- bn2 = BATselect(g, NULL, &lastg, NULL, true, false, false);
+ bn2 = BATselect(g, NULL, &lastg, NULL, true, false, false,
false);
if (bn2 == NULL) {
BBPunfix(bn1->batCacheid);
return GDK_FAIL;
@@ -1204,7 +1204,7 @@ BATfirstn_grouped_with_groups(BAT **topn
BBPunfix(bn1->batCacheid);
return GDK_FAIL;
}
- bn4 = BATselect(bi->b, bn3, BUNtail(*bi, last - hseq), NULL,
true, false, false);
+ bn4 = BATselect(bi->b, bn3, BUNtail(*bi, last - hseq), NULL,
true, false, false, false);
BBPunfix(bn3->batCacheid);
if (bn4 == NULL) {
BBPunfix(bn1->batCacheid);
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -391,7 +391,7 @@ selectjoin(BAT **r1p, BAT **r2p, BAT **r
return rc;
}
- bn = BATselect(r, rci->s, v, NULL, true, true, false);
+ bn = BATselect(r, rci->s, v, NULL, true, true, false, false);
bat_iterator_end(&li);
if (bn == NULL) {
return GDK_FAIL;
@@ -518,7 +518,7 @@ selectjoin(BAT **r1p, BAT **r2p, BAT **r
mark = 0;
} else {
/* no match, search for NIL in r */
- BAT *n = BATselect(r, rci->s, ATOMnilptr(r->ttype),
NULL, true, true, false);
+ BAT *n = BATselect(r, rci->s, ATOMnilptr(r->ttype),
NULL, true, true, false, false);
if (n == NULL)
goto bailout;
mark = BATcount(n) == 0 ? 0 : bit_nil;
@@ -605,12 +605,12 @@ mergejoin_void(BAT **r1p, BAT **r2p, BAT
/* at this point, the matchable values in r are [lo..hi) */
if (!nil_on_miss) {
assert(r3p == NULL);
- r1 = BATselect(l, lci->s, &lo, &hi, true, false, only_misses);
+ r1 = BATselect(l, lci->s, &lo, &hi, true, false, only_misses,
false);
if (r1 == NULL)
return GDK_FAIL;
if (only_misses && !l->tnonil) {
/* also look for NILs */
- r2 = BATselect(l, lci->s, &oid_nil, NULL, true, false,
false);
+ r2 = BATselect(l, lci->s, &oid_nil, NULL, true, false,
false, false);
if (r2 == NULL) {
BBPreclaim(r1);
return GDK_FAIL;
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -460,8 +460,8 @@ quickins(oid *dst, BUN cnt, oid o, BAT *
/* argument list for type-specific core scan select function call */
#define scanargs \
- bi, ci, bn, tl, th, li, hi, equi, anti, lval, hval, lnil, \
- cnt, bi->b->hseqbase, dst, maximum, imprints, algo
+ bi, ci, bn, tl, th, li, hi, equi, anti, nil_matches, lval, hval, \
+ lnil, cnt, bi->b->hseqbase, dst, maximum, imprints, algo
#define PREVVALUEbte(x) ((x) - 1)
#define PREVVALUEsht(x) ((x) - 1)
@@ -521,9 +521,10 @@ quickins(oid *dst, BUN cnt, oid o, BAT *
static BUN \
NAME##_##TYPE(BATiter *bi, struct canditer *restrict ci, BAT *bn, \
const TYPE *tl, const TYPE *th, bool li, bool hi, \
- bool equi, bool anti, bool lval, bool hval, \
- bool lnil, BUN cnt, const oid hseq, oid *restrict dst, \
- BUN maximum, Imprints *imprints, const char **algo) \
+ bool equi, bool anti, bool nil_matches, bool lval, \
+ bool hval, bool lnil, BUN cnt, const oid hseq, \
+ oid *restrict dst, BUN maximum, Imprints *imprints, \
+ const char **algo) \
{ \
TYPE vl = *tl; \
TYPE vh = *th; \
@@ -574,6 +575,8 @@ NAME##_##TYPE(BATiter *bi, struct candit
} else if (anti) { \
if (bi->nonil) { \
choose(NAME, ISDENSE, (v <= vl || v >= vh), TYPE); \
+ } else if (nil_matches) { \
+ choose(NAME, ISDENSE, is_##TYPE##_nil(v) || v <= vl ||
v >= vh, TYPE); \
} else { \
choose(NAME, ISDENSE, !is_##TYPE##_nil(v) && (v <= vl
|| v >= vh), TYPE); \
} \
@@ -597,9 +600,10 @@ NAME##_##TYPE(BATiter *bi, struct candit
static BUN
fullscan_any(BATiter *bi, struct canditer *restrict ci, BAT *bn,
const void *tl, const void *th,
- bool li, bool hi, bool equi, bool anti, bool lval, bool hval,
- bool lnil, BUN cnt, const oid hseq, oid *restrict dst,
- BUN maximum, Imprints *imprints, const char **algo)
+ bool li, bool hi, bool equi, bool anti, bool nil_matches,
+ bool lval, bool hval, bool lnil, BUN cnt, const oid hseq,
+ oid *restrict dst, BUN maximum, Imprints *imprints,
+ const char **algo)
{
const void *v;
const void *restrict nil = ATOMnilptr(bi->type);
@@ -637,9 +641,9 @@ fullscan_any(BATiter *bi, struct candite
v = BUNtail(*bi, o-hseq);
if ((*cmp)(tl, v) == 0) {
dst = buninsfix(bn, dst, cnt, o,
- (BUN) ((dbl) cnt / (dbl) (p ==
0 ? 1 : p)
- * (dbl) (ncand-p) * 1.1
+ 1024),
- maximum);
+ (BUN) ((dbl) cnt /
(dbl) (p == 0 ? 1 : p)
+ * (dbl)
(ncand-p) * 1.1 + 1024),
+ maximum);
if (dst == NULL) {
BBPreclaim(bn);
return BUN_NONE;
@@ -654,13 +658,15 @@ fullscan_any(BATiter *bi, struct candite
TIMEOUT_LOOP_IDX(p, ncand, qry_ctx) {
o = canditer_next_dense(ci);
v = BUNtail(*bi, o-hseq);
- if ((nil == NULL || (*cmp)(v, nil) != 0) &&
- ((lval &&
- ((c = (*cmp)(tl, v)) > 0 ||
+ bool isnil = nil != NULL && (*cmp)(v, nil) == 0;
+ if ((nil_matches && isnil) ||
+ (!isnil &&
+ ((lval &&
+ ((c = (*cmp)(tl, v)) > 0 ||
(!li && c == 0))) ||
- (hval &&
- ((c = (*cmp)(th, v)) < 0 ||
- (!hi && c == 0))))) {
+ (hval &&
+ ((c = (*cmp)(th, v)) < 0 ||
+ (!hi && c == 0)))))) {
dst = buninsfix(bn, dst, cnt, o,
(BUN) ((dbl) cnt /
(dbl) (p == 0 ? 1 : p)
* (dbl)
(ncand-p) * 1.1 + 1024),
@@ -676,13 +682,15 @@ fullscan_any(BATiter *bi, struct candite
TIMEOUT_LOOP_IDX(p, ncand, qry_ctx) {
o = canditer_next(ci);
v = BUNtail(*bi, o-hseq);
- if ((nil == NULL || (*cmp)(v, nil) != 0) &&
- ((lval &&
- ((c = (*cmp)(tl, v)) > 0 ||
+ bool isnil = nil != NULL && (*cmp)(v, nil) == 0;
+ if ((nil_matches && isnil) ||
+ (!isnil &&
+ ((lval &&
+ ((c = (*cmp)(tl, v)) > 0 ||
(!li && c == 0))) ||
- (hval &&
- ((c = (*cmp)(th, v)) < 0 ||
- (!hi && c == 0))))) {
+ (hval &&
+ ((c = (*cmp)(th, v)) < 0 ||
+ (!hi && c == 0)))))) {
dst = buninsfix(bn, dst, cnt, o,
(BUN) ((dbl) cnt /
(dbl) (p == 0 ? 1 : p)
* (dbl)
(ncand-p) * 1.1 + 1024),
@@ -702,12 +710,12 @@ fullscan_any(BATiter *bi, struct candite
o = canditer_next_dense(ci);
v = BUNtail(*bi, o-hseq);
if ((nil == NULL || (*cmp)(v, nil) != 0) &&
- ((!lval ||
- (c = cmp(tl, v)) < 0 ||
- (li && c == 0)) &&
- (!hval ||
- (c = cmp(th, v)) > 0 ||
- (hi && c == 0)))) {
+ ((!lval ||
+ (c = cmp(tl, v)) < 0 ||
+ (li && c == 0)) &&
+ (!hval ||
+ (c = cmp(th, v)) > 0 ||
+ (hi && c == 0)))) {
dst = buninsfix(bn, dst, cnt, o,
(BUN) ((dbl) cnt /
(dbl) (p == 0 ? 1 : p)
* (dbl)
(ncand-p) * 1.1 + 1024),
@@ -724,12 +732,12 @@ fullscan_any(BATiter *bi, struct candite
o = canditer_next(ci);
v = BUNtail(*bi, o-hseq);
if ((nil == NULL || (*cmp)(v, nil) != 0) &&
- ((!lval ||
- (c = cmp(tl, v)) < 0 ||
- (li && c == 0)) &&
- (!hval ||
- (c = cmp(th, v)) > 0 ||
- (hi && c == 0)))) {
+ ((!lval ||
+ (c = cmp(tl, v)) < 0 ||
+ (li && c == 0)) &&
+ (!hval ||
+ (c = cmp(th, v)) > 0 ||
+ (hi && c == 0)))) {
dst = buninsfix(bn, dst, cnt, o,
(BUN) ((dbl) cnt /
(dbl) (p == 0 ? 1 : p)
* (dbl)
(ncand-p) * 1.1 + 1024),
@@ -753,9 +761,10 @@ fullscan_any(BATiter *bi, struct candite
static BUN
fullscan_str(BATiter *bi, struct canditer *restrict ci, BAT *bn,
const char *tl, const char *th,
- bool li, bool hi, bool equi, bool anti, bool lval, bool hval,
- bool lnil, BUN cnt, const oid hseq, oid *restrict dst,
- BUN maximum, Imprints *imprints, const char **algo)
+ bool li, bool hi, bool equi, bool anti, bool nil_matches,
+ bool lval, bool hval, bool lnil, BUN cnt, const oid hseq,
+ oid *restrict dst, BUN maximum, Imprints *imprints,
+ const char **algo)
{
var_t pos;
BUN p, ncand = ci->ncand;
@@ -764,8 +773,8 @@ fullscan_str(BATiter *bi, struct candite
if (!equi || !GDK_ELIMDOUBLES(bi->vh))
return fullscan_any(bi, ci, bn, tl, th, li, hi, equi, anti,
- lval, hval, lnil, cnt, hseq, dst,
- maximum, imprints, algo);
+ nil_matches, lval, hval, lnil, cnt, hseq,
+ dst, maximum, imprints, algo);
if ((pos = strLocate(bi->vh, tl)) == (var_t) -2) {
*algo = "select: fullscan equi strelim (nomatch)";
return 0;
@@ -953,8 +962,9 @@ scan_sel(densescan, _dense)
static BAT *
scanselect(BATiter *bi, struct canditer *restrict ci, BAT *bn,
const void *tl, const void *th,
- bool li, bool hi, bool equi, bool anti, bool lval, bool hval,
- bool lnil, BUN maximum, Imprints *imprints, const char **algo)
+ bool li, bool hi, bool equi, bool anti, bool nil_matches,
+ bool lval, bool hval, bool lnil,
+ BUN maximum, Imprints *imprints, const char **algo)
{
#ifndef NDEBUG
int (*cmp)(const void *, const void *);
@@ -1341,26 +1351,30 @@ BATrange(BATiter *bi, const void *tl, co
*
* If s is non-NULL, it is a list of candidates. s must be sorted.
*
- * tl may not be NULL, li, hi, and anti must be either 0 or 1.
+ * tl may not be NULL, li, hi, and anti must be either false or true.
*
* If th is NULL, hi is ignored.
*
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]