Changeset: 18d3df3db0b8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/18d3df3db0b8
Modified Files:
clients/Tests/MAL-signatures-hge.test
clients/Tests/MAL-signatures.test
clients/Tests/exports.stable.out
gdk/gdk.h
gdk/gdk_firstn.c
gdk/gdk_subquery.c
monetdb5/modules/kernel/algebra.c
monetdb5/optimizer/opt_mergetable.c
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_statement.c
sql/server/rel_exp.h
sql/server/rel_optimize_sel.c
sql/server/rel_unnest.c
sql/test/BugTracker-2026/Tests/All
Branch: default
Log Message:
Merge with Dec2025 branch.
diffs (truncated from 1293 to 300 lines):
diff --git a/clients/Tests/MAL-signatures-hge.test
b/clients/Tests/MAL-signatures-hge.test
--- a/clients/Tests/MAL-signatures-hge.test
+++ b/clients/Tests/MAL-signatures-hge.test
@@ -3464,6 +3464,16 @@ pattern algebra.firstn(X_0:bat[:any], X_
ALGfirstn
Calculate first N values of B with candidate list S
algebra
+firstn
+pattern algebra.firstn(X_0:bat[:any], X_1:bat[:oid], X_2:bat[:oid], X_3:lng,
X_4:lng, X_5:bit, X_6:bit, X_7:bit, X_8:bit) (X_9:bat[:oid], X_10:bat[:oid])
+ALGfirstn
+Calculate first N values of B with candidate list S
+algebra
+firstn
+pattern algebra.firstn(X_0:bat[:any], X_1:bat[:oid], X_2:bat[:oid], X_3:lng,
X_4:lng, X_5:bit, X_6:bit, X_7:bit, X_8:bit):bat[:oid]
+ALGfirstn
+Calculate first N values of B with candidate list S
+algebra
groupby
command algebra.groupby(X_0:bat[:oid], X_1:bat[:lng]):bat[:oid]
ALGgroupby
@@ -3474,6 +3484,11 @@ pattern algebra.groupedfirstn(X_0:lng, X
ALGgroupedfirstn
Grouped firstn
algebra
+groupedfirstn
+pattern algebra.groupedfirstn(X_0:lng, X_1:lng, X_2:bit, X_3:bat[:oid],
X_4:bat[:oid], X_5:any...):bat[:oid]
+ALGgroupedfirstn
+Grouped firstn
+algebra
intersect
command algebra.intersect(X_0:bat[:any_1], X_1:bat[:any_1], X_2:bat[:oid],
X_3:bat[:oid], X_4:bit, X_5:bit, X_6:lng):bat[:oid]
ALGintersect
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
@@ -2899,6 +2899,16 @@ pattern algebra.firstn(X_0:bat[:any], X_
ALGfirstn
Calculate first N values of B with candidate list S
algebra
+firstn
+pattern algebra.firstn(X_0:bat[:any], X_1:bat[:oid], X_2:bat[:oid], X_3:lng,
X_4:lng, X_5:bit, X_6:bit, X_7:bit, X_8:bit) (X_9:bat[:oid], X_10:bat[:oid])
+ALGfirstn
+Calculate first N values of B with candidate list S
+algebra
+firstn
+pattern algebra.firstn(X_0:bat[:any], X_1:bat[:oid], X_2:bat[:oid], X_3:lng,
X_4:lng, X_5:bit, X_6:bit, X_7:bit, X_8:bit):bat[:oid]
+ALGfirstn
+Calculate first N values of B with candidate list S
+algebra
groupby
command algebra.groupby(X_0:bat[:oid], X_1:bat[:lng]):bat[:oid]
ALGgroupby
@@ -2909,6 +2919,11 @@ pattern algebra.groupedfirstn(X_0:lng, X
ALGgroupedfirstn
Grouped firstn
algebra
+groupedfirstn
+pattern algebra.groupedfirstn(X_0:lng, X_1:lng, X_2:bit, X_3:bat[:oid],
X_4:bat[:oid], X_5:any...):bat[:oid]
+ALGgroupedfirstn
+Grouped firstn
+algebra
intersect
command algebra.intersect(X_0:bat[:any_1], X_1:bat[:any_1], X_2:bat[:oid],
X_3:bat[:oid], X_4:bit, X_5:bit, X_6:lng):bat[:oid]
ALGintersect
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
@@ -121,6 +121,7 @@ BAT *BATdiff(BAT *l, BAT *r, BAT *sl, BA
BAT *BATdiffcand(BAT *a, BAT *b);
gdk_return BATextend(BAT *b, BUN newcap)
__attribute__((__warn_unused_result__));
gdk_return BATfirstn(BAT **topn, BAT **gids, BAT *b, BAT *cands, BAT *grps,
BUN n, bool asc, bool nilslast, bool distinct)
__attribute__((__access__(write_only, 1)))
__attribute__((__access__(write_only, 2)))
__attribute__((__warn_unused_result__));
+BAT *BATfirstn_offset(BAT *b, BAT *s, BAT *g, BUN n, BUN o, bool asc, bool
nilslast, bool distinct) __attribute__((__warn_unused_result__));
restrict_t BATgetaccess(BAT *b);
ValPtr BATgetprop(BAT *b, enum prop_t idx);
ValPtr BATgetprop_nolock(BAT *b, enum prop_t idx);
@@ -134,6 +135,7 @@ BAT *BATgroupcount(BAT *b, BAT *g, BAT *
BAT *BATgroupcovariance_population(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s,
int tp, bool skip_nils);
BAT *BATgroupcovariance_sample(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s, int
tp, bool skip_nils);
BAT *BATgroupedfirstn(BUN n, BAT *s, BAT *g, int nbats, BAT **bats, bool *asc,
bool *nilslast) __attribute__((__warn_unused_result__));
+BAT *BATgroupedfirstn_offset(BUN n, BUN o, BAT *s, BAT *g, int nbats, BAT
**bats, bool *asc, bool *nilslast) __attribute__((__warn_unused_result__));
BAT *BATgroupmax(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils);
BAT *BATgroupmedian(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils);
BAT *BATgroupmedian_avg(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils);
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1589,9 +1589,12 @@ gdk_export gdk_return BATfirstn(BAT **to
__attribute__((__access__(write_only, 1)))
__attribute__((__access__(write_only, 2)))
__attribute__((__warn_unused_result__));
+gdk_export BAT *BATfirstn_offset(BAT *b, BAT *s, BAT *g, BUN n, BUN o, bool
asc, bool nilslast, bool distinct)
+ __attribute__((__warn_unused_result__));
gdk_export BAT *BATgroupedfirstn(BUN n, BAT *s, BAT *g, int nbats, BAT **bats,
bool *asc, bool *nilslast)
__attribute__((__warn_unused_result__));
-
+gdk_export BAT *BATgroupedfirstn_offset(BUN n, BUN o, BAT *s, BAT *g, int
nbats, BAT **bats, bool *asc, bool *nilslast)
+ __attribute__((__warn_unused_result__));
gdk_export gdk_return GDKtoupper(allocator *ma, char **restrict buf, size_t
*restrict buflen, const char *restrict s)
__attribute__((__access__(read_write, 2)))
diff --git a/gdk/gdk_firstn.c b/gdk/gdk_firstn.c
--- a/gdk/gdk_firstn.c
+++ b/gdk/gdk_firstn.c
@@ -1334,6 +1334,34 @@ BATfirstn(BAT **topn, BAT **gids, BAT *b
return rc;
}
+/* return first n values, after skipping o first values */
+BAT *
+BATfirstn_offset(BAT *b, BAT *s, BAT *g, BUN n, BUN o, bool asc, bool
nilslast, bool distinct)
+{
+ BAT *topno;
+ BAT *topo;
+ BAT *topn;
+ gdk_return rc;
+
+ /* first calculate first o+n values */
+ rc = BATfirstn(&topno, NULL, b, s, g, o + n, asc, nilslast, distinct);
+ if (rc != GDK_SUCCEED)
+ return NULL;
+ if (o == 0)
+ return topno;
+ /* calculate first o values */
+ rc = BATfirstn(&topo, NULL, b, s, g, o, asc, nilslast, distinct);
+ if (rc != GDK_SUCCEED) {
+ BBPreclaim(topno);
+ return NULL;
+ }
+ /* subtract first o value from first o+n values */
+ topn = BATdiffcand(topno, topo);
+ BBPreclaim(topno);
+ BBPreclaim(topo);
+ return topn;
+}
+
/* Calculate the first N values for each group given in G of the bats in
* BATS (of which there are NBATS), but only considering the candidates
* in S.
@@ -1535,3 +1563,64 @@ BATgroupedfirstn(BUN n, BAT *s, BAT *g,
BBPreclaim(bn);
return NULL;
}
+
+BAT *
+BATgroupedfirstn_offset(BUN n, BUN o, BAT *s, BAT *g, int nbats, BAT **bats,
bool *asc, bool *nilslast)
+{
+ BAT *topno;
+ BAT *topo;
+ BAT *topn;
+ BUN no = n + o;
+
+ topno = BATgroupedfirstn(no, s, g, nbats, bats, asc, nilslast);
+ if (o == 0 || topno == NULL)
+ return topno;
+ topo = BATgroupedfirstn(o, s, g, nbats, bats, asc, nilslast);
+ if (topo == NULL) {
+ BBPreclaim(topno);
+ return NULL;
+ }
+ BUN ngrp = BATcount(topo) / o;
+ assert(ngrp == BATcount(topno) / no);
+ topn = BATconstant(0, TYPE_oid, &oid_nil, ngrp * n, TRANSIENT);
+ if (topn == NULL) {
+ BBPreclaim(topno);
+ BBPreclaim(topo);
+ return NULL;
+ }
+ BAT *cand1 = BATdense(0, 0, no);
+ BAT *cand2 = BATdense(0, 0, o);
+ if (cand1 == NULL || cand2 == NULL) {
+ BBPreclaim(topno);
+ BBPreclaim(topo);
+ BBPreclaim(topn);
+ BBPreclaim(cand1);
+ BBPreclaim(cand2);
+ }
+ oid *roids = Tloc(topn, 0);
+ for (BUN grp = 0; grp < ngrp; grp++) {
+ BAT *d = BATdiff(topno, topo, cand1, cand2, true, false, n);
+ if (d == NULL) {
+ BBPreclaim(topno);
+ BBPreclaim(topo);
+ BBPreclaim(topn);
+ BBPreclaim(cand1);
+ BBPreclaim(cand2);
+ return NULL;
+ }
+ for (BUN i = 0; i < BATcount(d); i++)
+ roids[i] = BUNtoid(topno, (BUN) BUNtoid(d, i));
+ BBPreclaim(d);
+ roids += n;
+ cand1->tseqbase += no;
+ cand2->tseqbase += o;
+ }
+ BBPreclaim(topno);
+ BBPreclaim(topo);
+ BBPreclaim(cand1);
+ BBPreclaim(cand2);
+ /* we know little about the properties */
+ topn->tsorted = topn->trevsorted = topn->tkey = BATcount(topn) <= 1;
+ topn->tnil = topn->tnonil = false;
+ return topn;
+}
diff --git a/gdk/gdk_subquery.c b/gdk/gdk_subquery.c
--- a/gdk/gdk_subquery.c
+++ b/gdk/gdk_subquery.c
@@ -190,11 +190,11 @@ BATall_grp(BAT *l, BAT *g, BAT *e, BAT *
TRC_DEBUG(ALGO, "l=" ALGOBATFMT ",g=" ALGOBATFMT
",e=" ALGOOPTBATFMT ",s=" ALGOOPTBATFMT
" -> " ALGOOPTBATFMT
- " (%s -- " LLFMT " usec)\n",
+ " (" LLFMT " usec)\n",
ALGOBATPAR(l), ALGOBATPAR(g),
ALGOOPTBATPAR(e), ALGOOPTBATPAR(s),
ALGOOPTBATPAR(res),
- __func__, GDKusec() - t0);
+ GDKusec() - t0);
return res;
alloc_fail:
BBPreclaim(res);
@@ -316,11 +316,11 @@ BATnil_grp(BAT *l, BAT *g, BAT *e, BAT *
TRC_DEBUG(ALGO, "l=" ALGOBATFMT ",g=" ALGOBATFMT
",e=" ALGOOPTBATFMT ",s=" ALGOOPTBATFMT
" -> " ALGOOPTBATFMT
- " (%s -- " LLFMT " usec)\n",
+ " (" LLFMT " usec)\n",
ALGOBATPAR(l), ALGOBATPAR(g),
ALGOOPTBATPAR(e), ALGOOPTBATPAR(s),
ALGOOPTBATPAR(res),
- __func__, GDKusec() - t0);
+ GDKusec() - t0);
return res;
alloc_fail:
BBPreclaim(res);
@@ -457,11 +457,11 @@ BATanyequal_grp(BAT *l, BAT *r, BAT *g,
TRC_DEBUG(ALGO, "l=" ALGOBATFMT ",r=" ALGOBATFMT ",g=" ALGOBATFMT
",e=" ALGOOPTBATFMT ",s=" ALGOOPTBATFMT
" -> " ALGOOPTBATFMT
- " (%s -- " LLFMT " usec)\n",
+ " (" LLFMT " usec)\n",
ALGOBATPAR(l), ALGOBATPAR(r), ALGOBATPAR(g),
ALGOOPTBATPAR(e), ALGOOPTBATPAR(s),
ALGOOPTBATPAR(res),
- __func__, GDKusec() - t0);
+ GDKusec() - t0);
return res;
alloc_fail:
BBPreclaim(res);
@@ -572,11 +572,11 @@ BATallnotequal_grp(BAT *l, BAT *r, BAT *
TRC_DEBUG(ALGO, "l=" ALGOBATFMT ",r=" ALGOBATFMT ",g=" ALGOBATFMT
",e=" ALGOOPTBATFMT ",s=" ALGOOPTBATFMT
" -> " ALGOOPTBATFMT
- " (%s -- " LLFMT " usec)\n",
+ " (" LLFMT " usec)\n",
ALGOBATPAR(l), ALGOBATPAR(r), ALGOBATPAR(g),
ALGOOPTBATPAR(e), ALGOOPTBATPAR(s),
ALGOOPTBATPAR(res),
- __func__, GDKusec() - t0);
+ GDKusec() - t0);
return res;
alloc_fail:
BBPreclaim(res);
@@ -722,11 +722,11 @@ BATanyequal_grp2(BAT *l, BAT *r, BAT *ri
TRC_DEBUG(ALGO, "l=" ALGOBATFMT ",r=" ALGOBATFMT ",rid=" ALGOBATFMT
",g=" ALGOBATFMT ",e=" ALGOOPTBATFMT ",s=" ALGOOPTBATFMT
" -> " ALGOOPTBATFMT
- " (%s -- " LLFMT " usec)\n",
+ " (" LLFMT " usec)\n",
ALGOBATPAR(l), ALGOBATPAR(r), ALGOBATPAR(rid),
ALGOBATPAR(g), ALGOOPTBATPAR(e), ALGOOPTBATPAR(s),
ALGOOPTBATPAR(res),
- __func__, GDKusec() - t0);
+ GDKusec() - t0);
return res;
alloc_fail:
BBPreclaim(res);
@@ -845,11 +845,11 @@ BATallnotequal_grp2(BAT *l, BAT *r, BAT
TRC_DEBUG(ALGO, "l=" ALGOBATFMT ",r=" ALGOBATFMT ",rid=" ALGOBATFMT
",g=" ALGOBATFMT ",e=" ALGOOPTBATFMT ",s=" ALGOOPTBATFMT
" -> " ALGOOPTBATFMT
- " (%s -- " LLFMT " usec)\n",
+ " (" LLFMT " usec)\n",
ALGOBATPAR(l), ALGOBATPAR(r), ALGOBATPAR(rid),
ALGOBATPAR(g), ALGOOPTBATPAR(e), ALGOOPTBATPAR(s),
ALGOOPTBATPAR(res),
- __func__, GDKusec() - t0);
+ GDKusec() - t0);
return res;
alloc_fail:
BBPreclaim(res);
@@ -918,11 +918,11 @@ BATsubexist(BAT *b, BAT *g, BAT *e, BAT
TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",g=" ALGOBATFMT
",e=" ALGOOPTBATFMT ",s=" ALGOOPTBATFMT
" -> " ALGOOPTBATFMT
- " (%s -- " LLFMT " usec)\n",
+ " (" LLFMT " usec)\n",
ALGOBATPAR(b), ALGOBATPAR(g),
ALGOOPTBATPAR(e), ALGOOPTBATPAR(s),
ALGOOPTBATPAR(res),
- __func__, GDKusec() - t0);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]