Changeset: f117137a0700 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f117137a0700
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        clients/Tests/exports.stable.out
        monetdb5/modules/kernel/algebra.c
        monetdb5/modules/kernel/algebra.mal
        sql/server/rel_optimizer.c
Branch: unlock
Log Message:

Merge with default branch.


diffs (truncated from 722 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
@@ -113,12 +113,12 @@ stdout of test 'MAL-signatures` in direc
 [ "aggr",      "corr", "command aggr.corr(X_1:bat[:any_2], 
X_2:bat[:any_2]):dbl ",     "ALGcorr;",     ""      ]
 [ "aggr",      "count",        "command aggr.count(X_1:bat[:any_1], 
X_2:bat[:oid], X_3:bat[:any_2], X_4:bit):bat[:lng] ",      "AGGRcount3;",  ""   
   ]
 [ "aggr",      "count",        "command aggr.count(X_1:bat[:any_1], 
X_2:bat[:oid], X_3:bat[:any_2]):bat[:lng] ",       "AGGRcount3nils;",      ""   
   ]
-[ "aggr",      "count",        "command aggr.count(X_1:bat[:any], 
X_2:bat[:oid]):lng ",        "ALGcountCND_bat;",     ""      ]
-[ "aggr",      "count",        "command aggr.count(X_1:bat[:any], 
X_2:bat[:oid], X_3:bit):lng ",       "ALGcountCND_nil;",     ""      ]
+[ "aggr",      "count",        "command aggr.count(X_1:bat[:any], 
X_2:bat[:cnd]):lng ",        "ALGcountCND_bat;",     ""      ]
+[ "aggr",      "count",        "command aggr.count(X_1:bat[:any], 
X_2:bat[:cnd], X_3:bit):lng ",       "ALGcountCND_nil;",     ""      ]
 [ "aggr",      "count",        "command aggr.count(X_1:bat[:any]):lng ",       
"ALGcount_bat;",        ""      ]
 [ "aggr",      "count",        "command aggr.count(X_1:bat[:any], X_2:bit):lng 
",      "ALGcount_nil;",        ""      ]
 [ "aggr",      "count_no_nil", "command aggr.count_no_nil(X_1:bat[:any_1], 
X_2:bat[:oid], X_3:bat[:any_2]):bat[:lng] ",        "AGGRcount3nonils;",    ""  
    ]
-[ "aggr",      "count_no_nil", "command aggr.count_no_nil(X_1:bat[:any_2], 
X_2:bat[:oid]):lng ",       "ALGcountCND_no_nil;",  ""      ]
+[ "aggr",      "count_no_nil", "command aggr.count_no_nil(X_1:bat[:any_2], 
X_2:bat[:cnd]):lng ",       "ALGcountCND_no_nil;",  ""      ]
 [ "aggr",      "count_no_nil", "command aggr.count_no_nil(X_1:bat[:any_2]):lng 
",      "ALGcount_no_nil;",     ""      ]
 [ "aggr",      "covariance",   "command aggr.covariance(X_1:bat[:bte], 
X_2:bat[:bte], X_3:bat[:oid], X_4:bat[:any_1]):bat[:dbl] ",     
"AGGRcovariance;",      ""      ]
 [ "aggr",      "covariance",   "command aggr.covariance(X_1:bat[:dbl], 
X_2:bat[:dbl], X_3:bat[:oid], X_4:bat[:any_1]):bat[:dbl] ",     
"AGGRcovariance;",      ""      ]
@@ -667,10 +667,10 @@ stdout of test 'MAL-signatures` in direc
 [ "algebra",   "outerjoin",    "command algebra.outerjoin(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:cnd], X_4:bat[:cnd], X_5:bit, X_6:lng):bat[:oid] ",   
    "ALGouterjoin1;",       ""      ]
 [ "algebra",   "outerjoin",    "command algebra.outerjoin(X_2:bat[:any_1], 
X_3:bat[:any_1], X_4:bat[:cnd], X_5:bat[:cnd], X_6:bit, X_7:lng) 
(X_0:bat[:oid], X_1:bat[:oid]) ",  "ALGouterjoin;",        ""      ]
 [ "algebra",   "project",      "pattern algebra.project(X_1:bat[:any_1], 
X_2:any_3):bat[:any_3] ",     "ALGprojecttail;",      ""      ]
+[ "algebra",   "projection",   "command algebra.projection(X_1:bat[:msk], 
X_2:bat[:any_3], X_3:bat[:any_3]):bat[:any_3] ",     "ALGprojection2;",      "" 
     ]
+[ "algebra",   "projection",   "command algebra.projection(X_1:bat[:oid], 
X_2:bat[:any_3], X_3:bat[:any_3]):bat[:any_3] ",     "ALGprojection2;",      "" 
     ]
 [ "algebra",   "projection",   "command algebra.projection(X_1:bat[:msk], 
X_2:bat[:any_3]):bat[:any_3] ",      "ALGprojection;",       ""      ]
 [ "algebra",   "projection",   "command algebra.projection(X_1:bat[:oid], 
X_2:bat[:any_3]):bat[:any_3] ",      "ALGprojection;",       ""      ]
-[ "algebra",   "projection2",  "command algebra.projection2(X_1:bat[:msk], 
X_2:bat[:any_3], X_3:bat[:any_3]):bat[:any_3] ",    "ALGprojection2;",      ""  
    ]
-[ "algebra",   "projection2",  "command algebra.projection2(X_1:bat[:oid], 
X_2:bat[:any_3], X_3:bat[:any_3]):bat[:any_3] ",    "ALGprojection2;",      ""  
    ]
 [ "algebra",   "projectionpath",       "pattern 
algebra.projectionpath(X_1:bat[:any]...):bat[:any] ",  "ALGprojectionpath;",   
""      ]
 [ "algebra",   "rangejoin",    "command algebra.rangejoin(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:any_1], X_4:bat[:cnd], X_5:bat[:cnd], X_6:bit, 
X_7:bit, X_8:bit, X_9:bit, X_10:lng):bat[:oid] ",  "ALGrangejoin1;",       ""   
   ]
 [ "algebra",   "rangejoin",    "command algebra.rangejoin(X_2:bat[:any_1], 
X_3:bat[:any_1], X_4:bat[:any_1], X_5:bat[:cnd], X_6:bat[:cnd], X_7:bit, 
X_8:bit, X_9:bit, X_10:bit, X_11:lng) (X_0:bat[:oid], X_1:bat[:oid]) ",    
"ALGrangejoin;",        ""      ]
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
@@ -122,12 +122,12 @@ stdout of test 'MAL-signatures` in direc
 [ "aggr",      "corr", "command aggr.corr(X_1:bat[:any_2], 
X_2:bat[:any_2]):dbl ",     "ALGcorr;",     ""      ]
 [ "aggr",      "count",        "command aggr.count(X_1:bat[:any_1], 
X_2:bat[:oid], X_3:bat[:any_2], X_4:bit):bat[:lng] ",      "AGGRcount3;",  ""   
   ]
 [ "aggr",      "count",        "command aggr.count(X_1:bat[:any_1], 
X_2:bat[:oid], X_3:bat[:any_2]):bat[:lng] ",       "AGGRcount3nils;",      ""   
   ]
-[ "aggr",      "count",        "command aggr.count(X_1:bat[:any], 
X_2:bat[:oid]):lng ",        "ALGcountCND_bat;",     ""      ]
-[ "aggr",      "count",        "command aggr.count(X_1:bat[:any], 
X_2:bat[:oid], X_3:bit):lng ",       "ALGcountCND_nil;",     ""      ]
+[ "aggr",      "count",        "command aggr.count(X_1:bat[:any], 
X_2:bat[:cnd]):lng ",        "ALGcountCND_bat;",     ""      ]
+[ "aggr",      "count",        "command aggr.count(X_1:bat[:any], 
X_2:bat[:cnd], X_3:bit):lng ",       "ALGcountCND_nil;",     ""      ]
 [ "aggr",      "count",        "command aggr.count(X_1:bat[:any]):lng ",       
"ALGcount_bat;",        ""      ]
 [ "aggr",      "count",        "command aggr.count(X_1:bat[:any], X_2:bit):lng 
",      "ALGcount_nil;",        ""      ]
 [ "aggr",      "count_no_nil", "command aggr.count_no_nil(X_1:bat[:any_1], 
X_2:bat[:oid], X_3:bat[:any_2]):bat[:lng] ",        "AGGRcount3nonils;",    ""  
    ]
-[ "aggr",      "count_no_nil", "command aggr.count_no_nil(X_1:bat[:any_2], 
X_2:bat[:oid]):lng ",       "ALGcountCND_no_nil;",  ""      ]
+[ "aggr",      "count_no_nil", "command aggr.count_no_nil(X_1:bat[:any_2], 
X_2:bat[:cnd]):lng ",       "ALGcountCND_no_nil;",  ""      ]
 [ "aggr",      "count_no_nil", "command aggr.count_no_nil(X_1:bat[:any_2]):lng 
",      "ALGcount_no_nil;",     ""      ]
 [ "aggr",      "covariance",   "command aggr.covariance(X_1:bat[:bte], 
X_2:bat[:bte], X_3:bat[:oid], X_4:bat[:any_1]):bat[:dbl] ",     
"AGGRcovariance;",      ""      ]
 [ "aggr",      "covariance",   "command aggr.covariance(X_1:bat[:dbl], 
X_2:bat[:dbl], X_3:bat[:oid], X_4:bat[:any_1]):bat[:dbl] ",     
"AGGRcovariance;",      ""      ]
@@ -784,10 +784,10 @@ stdout of test 'MAL-signatures` in direc
 [ "algebra",   "outerjoin",    "command algebra.outerjoin(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:cnd], X_4:bat[:cnd], X_5:bit, X_6:lng):bat[:oid] ",   
    "ALGouterjoin1;",       ""      ]
 [ "algebra",   "outerjoin",    "command algebra.outerjoin(X_2:bat[:any_1], 
X_3:bat[:any_1], X_4:bat[:cnd], X_5:bat[:cnd], X_6:bit, X_7:lng) 
(X_0:bat[:oid], X_1:bat[:oid]) ",  "ALGouterjoin;",        ""      ]
 [ "algebra",   "project",      "pattern algebra.project(X_1:bat[:any_1], 
X_2:any_3):bat[:any_3] ",     "ALGprojecttail;",      ""      ]
+[ "algebra",   "projection",   "command algebra.projection(X_1:bat[:msk], 
X_2:bat[:any_3], X_3:bat[:any_3]):bat[:any_3] ",     "ALGprojection2;",      "" 
     ]
+[ "algebra",   "projection",   "command algebra.projection(X_1:bat[:oid], 
X_2:bat[:any_3], X_3:bat[:any_3]):bat[:any_3] ",     "ALGprojection2;",      "" 
     ]
 [ "algebra",   "projection",   "command algebra.projection(X_1:bat[:msk], 
X_2:bat[:any_3]):bat[:any_3] ",      "ALGprojection;",       ""      ]
 [ "algebra",   "projection",   "command algebra.projection(X_1:bat[:oid], 
X_2:bat[:any_3]):bat[:any_3] ",      "ALGprojection;",       ""      ]
-[ "algebra",   "projection2",  "command algebra.projection2(X_1:bat[:msk], 
X_2:bat[:any_3], X_3:bat[:any_3]):bat[:any_3] ",    "ALGprojection2;",      ""  
    ]
-[ "algebra",   "projection2",  "command algebra.projection2(X_1:bat[:oid], 
X_2:bat[:any_3], X_3:bat[:any_3]):bat[:any_3] ",    "ALGprojection2;",      ""  
    ]
 [ "algebra",   "projectionpath",       "pattern 
algebra.projectionpath(X_1:bat[:any]...):bat[:any] ",  "ALGprojectionpath;",   
""      ]
 [ "algebra",   "rangejoin",    "command algebra.rangejoin(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:any_1], X_4:bat[:cnd], X_5:bat[:cnd], X_6:bit, 
X_7:bit, X_8:bit, X_9:bit, X_10:lng):bat[:oid] ",  "ALGrangejoin1;",       ""   
   ]
 [ "algebra",   "rangejoin",    "command algebra.rangejoin(X_2:bat[:any_1], 
X_3:bat[:any_1], X_4:bat[:any_1], X_5:bat[:cnd], X_6:bat[:cnd], X_7:bit, 
X_8:bit, X_9:bit, X_10:bit, X_11:lng) (X_0:bat[:oid], X_1:bat[:oid]) ",    
"ALGrangejoin;",        ""      ]
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
@@ -203,6 +203,7 @@ BAT *BATthetaselect(BAT *b, BAT *s, cons
 void BATtseqbase(BAT *b, oid o);
 void BATundo(BAT *b);
 BAT *BATunique(BAT *b, BAT *s);
+BAT *BATunmask(BAT *b);
 BBPrec *BBP[N_BBPINIT];
 gdk_return BBPaddfarm(const char *dirname, int rolemask, bool logerror);
 void BBPclear(bat bid);
diff --git a/monetdb5/modules/kernel/algebra.c 
b/monetdb5/modules/kernel/algebra.c
--- a/monetdb5/modules/kernel/algebra.c
+++ b/monetdb5/modules/kernel/algebra.c
@@ -374,18 +374,19 @@ ALGselectNotNil(bat *result, const bat *
                throw(MAL, "algebra.selectNotNil", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
 
        if (!b->tnonil) {
-               BAT *bn, *s;
+               BAT *s;
                s = BATselect(b, NULL, ATOMnilptr(b->ttype), NULL, true, true, 
true);
                if (s) {
-                       bn = BATproject(s, b);
+                       BAT *bn = BATproject(s, b);
                        BBPunfix(s->batCacheid);
+                       if (bn) {
+                               BBPunfix(b->batCacheid);
+                               *result = bn->batCacheid;
+                               BBPkeepref(*result);
+                               return MAL_SUCCEED;
+                       }
                }
                BBPunfix(b->batCacheid);
-               if (bn) {
-                       *result = bn->batCacheid;
-                       BBPkeepref(*result);
-                       return MAL_SUCCEED;
-               }
                throw(MAL, "algebra.selectNotNil", GDK_EXCEPTION);
        }
        /* just pass on the result */
@@ -821,21 +822,28 @@ ALGcrossproduct2(bat *l, bat *r, const b
        return ALGcrossproduct(l, r, left, right, max_one);
 }
 
-str
-ALGprojection(bat *result, const bat *lid, const bat *rid)
+static str
+ALGprojection2(bat *result, const bat *lid, const bat *r1id, const bat *r2id)
 {
-       BAT *left, *right,*bn= NULL;
+       BAT *l, *r1, *r2 = NULL, *bn;
 
-       if ((left = BATdescriptor(*lid)) == NULL) {
+       if ((l = BATdescriptor(*lid)) == NULL) {
                throw(MAL, "algebra.projection", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
        }
-       if ((right = BATdescriptor(*rid)) == NULL) {
-               BBPunfix(left->batCacheid);
+       if ((r1 = BATdescriptor(*r1id)) == NULL) {
+               BBPunfix(l->batCacheid);
                throw(MAL, "algebra.projection", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
        }
-       bn = BATproject(left, right);
-       BBPunfix(left->batCacheid);
-       BBPunfix(right->batCacheid);
+       if (r2id && !is_bat_nil(*r2id) && (r2 = BATdescriptor(*r2id)) == NULL) {
+               BBPunfix(l->batCacheid);
+               BBPunfix(r1->batCacheid);
+               throw(MAL, "algebra.projection", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
+       }
+       bn = BATproject2(l, r1, r2);
+       BBPunfix(l->batCacheid);
+       BBPunfix(r1->batCacheid);
+       if (r2)
+               BBPunfix(r2->batCacheid);
        if (bn == NULL)
                throw(MAL, "algebra.projection", GDK_EXCEPTION);
        *result = bn->batCacheid;
@@ -843,33 +851,10 @@ ALGprojection(bat *result, const bat *li
        return MAL_SUCCEED;
 }
 
-static str
-ALGprojection2(bat *result, const bat *lid, const bat *r1id, const bat *r2id)
+str
+ALGprojection(bat *result, const bat *lid, const bat *rid)
 {
-       BAT *l, *r1, *r2 = NULL, *bn;
-
-       if ((l = BATdescriptor(*lid)) == NULL) {
-               throw(MAL, "algebra.projection2", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
-       }
-       if ((r1 = BATdescriptor(*r1id)) == NULL) {
-               BBPunfix(l->batCacheid);
-               throw(MAL, "algebra.projection2", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
-       }
-       if (r2id && !is_bat_nil(*r2id) && (r2 = BATdescriptor(*r2id)) == NULL) {
-               BBPunfix(l->batCacheid);
-               BBPunfix(r1->batCacheid);
-               throw(MAL, "algebra.projection2", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
-       }
-       bn = BATproject2(l, r1, r2);
-       BBPunfix(l->batCacheid);
-       BBPunfix(r1->batCacheid);
-       if (r2)
-               BBPunfix(r2->batCacheid);
-       if (bn == NULL)
-               throw(MAL, "algegra.projection2", GDK_EXCEPTION);
-       *result = bn->batCacheid;
-       BBPkeepref(*result);
-       return MAL_SUCCEED;
+       return ALGprojection2(result, lid, rid, NULL);
 }
 
 static str
@@ -964,14 +949,25 @@ ALGsort11(bat *result, const bat *bid, c
 }
 
 static str
-ALGcount_bat(lng *result, const bat *bid)
+ALGcountCND_nil(lng *result, const bat *bid, const bat *cnd, const bit 
*ignore_nils)
 {
-       BAT *b;
+       BAT *b, *s = NULL;
 
        if ((b = BATdescriptor(*bid)) == NULL) {
                throw(MAL, "aggr.count", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
        }
-       *result = (lng) BATcount(b);
+       if (cnd && !is_bat_nil(*cnd) && (s = BATdescriptor(*cnd)) == NULL) {
+               BBPunfix(b->batCacheid);
+               throw(MAL, "aggr.count", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
+       }
+       if (*ignore_nils) {
+               *result = (lng) BATcount_no_nil(b, s);
+       } else {
+               struct canditer ci;
+               *result = (lng) canditer_init(&ci, b, s);
+       }
+       if (s)
+               BBPunfix(s->batCacheid);
        BBPunfix(b->batCacheid);
        return MAL_SUCCEED;
 }
@@ -979,72 +975,19 @@ ALGcount_bat(lng *result, const bat *bid
 static str
 ALGcount_nil(lng *result, const bat *bid, const bit *ignore_nils)
 {
-       BAT *b;
-       BUN cnt;
-
-       if ((b = BATdescriptor(*bid)) == NULL) {
-               throw(MAL, "aggr.count", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
-       }
-       if (*ignore_nils)
-               cnt = BATcount_no_nil(b, NULL);
-       else
-               cnt = BATcount(b);
-       *result = (lng) cnt;
-       BBPunfix(b->batCacheid);
-       return MAL_SUCCEED;
-}
-
-static str
-ALGcount_no_nil(lng *result, const bat *bid)
-{
-       bit ignore_nils = 1;
-
-       return ALGcount_nil(result, bid, &ignore_nils);
+       return ALGcountCND_nil(result, bid, NULL, ignore_nils);
 }
 
 static str
 ALGcountCND_bat(lng *result, const bat *bid, const bat *cnd)
 {
-       BAT *b;
-
-       if ((b = BATdescriptor(*bid)) == NULL) {
-               throw(MAL, "aggr.count", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
-       }
-       if (*cnd) {
-               struct canditer ci;
-               BAT *s;
-               if ((s = BATdescriptor(*cnd)) == NULL) {
-                       BBPunfix(b->batCacheid);
-                       throw(MAL, "aggr.count", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
-               }
-               *result = (lng) canditer_init(&ci, b, s);
-               BBPunfix(s->batCacheid);
-       } else
-               *result = (lng) BATcount(b);
-       BBPunfix(b->batCacheid);
-       return MAL_SUCCEED;
+       return ALGcountCND_nil(result, bid, cnd, &(bit){0});
 }
 
 static str
-ALGcountCND_nil(lng *result, const bat *bid, const bat *cnd, const bit 
*ignore_nils)
+ALGcount_bat(lng *result, const bat *bid)
 {
-       BAT *b, *s = NULL;
-
-       if (!*ignore_nils)
-               return ALGcountCND_bat(result, bid, cnd);
-       if (*cnd && (s = BATdescriptor(*cnd)) == NULL) {
-               throw(MAL, "aggr.count", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
-       }
-       if ((b = BATdescriptor(*bid)) == NULL) {
-               if (s)
-                       BBPunfix(s->batCacheid);
-               throw(MAL, "aggr.count", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
-       }
-       *result = (lng) BATcount_no_nil(b, s);
-       BBPunfix(b->batCacheid);
-       if (s)
-               BBPunfix(s->batCacheid);
-       return MAL_SUCCEED;
+       return ALGcountCND_nil(result, bid, NULL, &(bit){0});
 }
 
 static str
@@ -1054,6 +997,12 @@ ALGcountCND_no_nil(lng *result, const ba
 }
 
 static str
+ALGcount_no_nil(lng *result, const bat *bid)
+{
+       return ALGcountCND_nil(result, bid, NULL, &(bit){1});
+}
+
+static str
 ALGslice(bat *ret, const bat *bid, const lng *start, const lng *end)
 {
        BAT *b, *bn = NULL;
@@ -1495,9 +1444,9 @@ mel_func algebra_init_funcs[] = {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to