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]

Reply via email to