Changeset: aaf4310c5954 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=aaf4310c5954
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        clients/Tests/exports.stable.out
        gdk/gdk_join.c
        monetdb5/modules/kernel/algebra.c
        monetdb5/modules/kernel/algebra.h
        monetdb5/modules/kernel/algebra.mal
        monetdb5/optimizer/opt_postfix.c
        monetdb5/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
        monetdb5/optimizer/opt_profiler.c
        monetdb5/optimizer/opt_support.c
Branch: default
Log Message:

Optimize range,outer,band and theta joins from two outputs to one at 
opt_postfix optimizer. Also removed dead MAL reference for antijoin


diffs (truncated from 371 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
@@ -570,6 +570,7 @@ stdout of test 'MAL-signatures` in direc
 [ "alarm",     "sleep",        "unsafe pattern 
alarm.sleep(X_1:bat[:any_1]):bat[:any_1] ",     "ALARMsleep;",  ""      ]
 [ "alarm",     "time", "unsafe command alarm.time():int ",     "ALARMtime;",   
""      ]
 [ "alarm",     "usec", "unsafe command alarm.usec():lng ",     "ALARMusec;",   
""      ]
+[ "algebra",   "bandjoin",     "command algebra.bandjoin(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:any_1, X_6:any_1, X_7:bit, 
X_8:bit, X_9:lng):bat[:oid] ", "ALGbandjoin1;",        ""      ]
 [ "algebra",   "bandjoin",     "command algebra.bandjoin(X_2:bat[:any_1], 
X_3:bat[:any_1], X_4:bat[:oid], X_5:bat[:oid], X_6:any_1, X_7:any_1, X_8:bit, 
X_9:bit, X_10:lng) (X_0:bat[:oid], X_1:bat[:oid]) ",   "ALGbandjoin;", ""      ]
 [ "algebra",   "copy", "command algebra.copy(X_1:bat[:any_1]):bat[:any_1] ",   
"ALGcopy;",     ""      ]
 [ "algebra",   "crossproduct", "command algebra.crossproduct(X_2:bat[:any_1], 
X_3:bat[:any_2], X_4:bit) (X_0:bat[:oid], X_1:bat[:oid]) ",      
"ALGcrossproduct2;",    ""      ]
@@ -607,11 +608,13 @@ stdout of test 'MAL-signatures` in direc
 [ "algebra",   "not_like",     "command algebra.not_like(X_1:str, X_2:str):bit 
",      "PCREnotlike2;",        ""      ]
 [ "algebra",   "not_like",     "command algebra.not_like(X_1:str, X_2:str, 
X_3:str):bit ",     "PCREnotlike3;",        ""      ]
 [ "algebra",   "orderidx",     "command algebra.orderidx(X_1:bat[:any_1], 
X_2:bit):bat[:any_1] ",      "OIDXorderidx;",        ""      ]
+[ "algebra",   "outerjoin",    "command algebra.outerjoin(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], 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[:oid], X_5:bat[:oid], 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[:oid], 
X_2:bat[:any_3]):bat[:any_3] ",      "ALGprojection;",       ""      ]
 [ "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[:oid], X_5:bat[:oid], 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[:oid], X_6:bat[:oid], X_7:bit, 
X_8:bit, X_9:bit, X_10:bit, X_11:lng) (X_0:bat[:oid], X_1:bat[:oid]) ",    
"ALGrangejoin;",        ""      ]
 [ "algebra",   "reuse",        "command 
algebra.reuse(X_1:bat[:any_1]):bat[:any_1] ",  "ALGreuse;",    ""      ]
 [ "algebra",   "select",       "command algebra.select(X_1:bat[:any_1], 
X_2:any_1, X_3:any_1, X_4:bit, X_5:bit, X_6:bit):bat[:oid] ",  "ALGselect1;",  
""      ]
@@ -634,6 +637,7 @@ stdout of test 'MAL-signatures` in direc
 [ "algebra",   "sort", "command algebra.sort(X_2:bat[:any_1], X_3:bat[:oid], 
X_4:bat[:oid], X_5:bit, X_6:bit, X_7:bit) (X_0:bat[:any_1], X_1:bat[:oid]) ",   
  "ALGsort32;",   ""      ]
 [ "algebra",   "sort", "command algebra.sort(X_3:bat[:any_1], X_4:bat[:oid], 
X_5:bat[:oid], X_6:bit, X_7:bit, X_8:bit) (X_0:bat[:any_1], X_1:bat[:oid], 
X_2:bat[:oid]) ",      "ALGsort33;",   ""      ]
 [ "algebra",   "subslice",     "command algebra.subslice(X_1:bat[:any_1], 
X_2:lng, X_3:lng):bat[:oid] ",       "ALGsubslice_lng;",     ""      ]
+[ "algebra",   "thetajoin",    "command algebra.thetajoin(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:int, X_6:bit, 
X_7:lng):bat[:oid] ",      "ALGthetajoin1;",       ""      ]
 [ "algebra",   "thetajoin",    "command algebra.thetajoin(X_2:bat[:any_1], 
X_3:bat[:any_1], X_4:bat[:oid], X_5:bat[:oid], X_6:int, X_7:bit, X_8:lng) 
(X_0:bat[:oid], X_1:bat[:oid]) ", "ALGthetajoin;",        ""      ]
 [ "algebra",   "thetaselect",  "command algebra.thetaselect(X_1:bat[:any_1], 
X_2:any_1, X_3:str):bat[:oid] ",  "ALGthetaselect1;",     ""      ]
 [ "algebra",   "thetaselect",  "command algebra.thetaselect(X_1:bat[:any_1], 
X_2:bat[:oid], X_3:any_1, X_4:str):bat[:oid] ",   "ALGthetaselect2;",     ""    
  ]
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
@@ -679,6 +679,7 @@ stdout of test 'MAL-signatures` in direc
 [ "alarm",     "sleep",        "unsafe pattern 
alarm.sleep(X_1:bat[:any_1]):bat[:any_1] ",     "ALARMsleep;",  ""      ]
 [ "alarm",     "time", "unsafe command alarm.time():int ",     "ALARMtime;",   
""      ]
 [ "alarm",     "usec", "unsafe command alarm.usec():lng ",     "ALARMusec;",   
""      ]
+[ "algebra",   "bandjoin",     "command algebra.bandjoin(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:any_1, X_6:any_1, X_7:bit, 
X_8:bit, X_9:lng):bat[:oid] ", "ALGbandjoin1;",        ""      ]
 [ "algebra",   "bandjoin",     "command algebra.bandjoin(X_2:bat[:any_1], 
X_3:bat[:any_1], X_4:bat[:oid], X_5:bat[:oid], X_6:any_1, X_7:any_1, X_8:bit, 
X_9:bit, X_10:lng) (X_0:bat[:oid], X_1:bat[:oid]) ",   "ALGbandjoin;", ""      ]
 [ "algebra",   "copy", "command algebra.copy(X_1:bat[:any_1]):bat[:any_1] ",   
"ALGcopy;",     ""      ]
 [ "algebra",   "crossproduct", "command algebra.crossproduct(X_2:bat[:any_1], 
X_3:bat[:any_2], X_4:bit) (X_0:bat[:oid], X_1:bat[:oid]) ",      
"ALGcrossproduct2;",    ""      ]
@@ -716,11 +717,13 @@ stdout of test 'MAL-signatures` in direc
 [ "algebra",   "not_like",     "command algebra.not_like(X_1:str, X_2:str):bit 
",      "PCREnotlike2;",        ""      ]
 [ "algebra",   "not_like",     "command algebra.not_like(X_1:str, X_2:str, 
X_3:str):bit ",     "PCREnotlike3;",        ""      ]
 [ "algebra",   "orderidx",     "command algebra.orderidx(X_1:bat[:any_1], 
X_2:bit):bat[:any_1] ",      "OIDXorderidx;",        ""      ]
+[ "algebra",   "outerjoin",    "command algebra.outerjoin(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], 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[:oid], X_5:bat[:oid], 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[:oid], 
X_2:bat[:any_3]):bat[:any_3] ",      "ALGprojection;",       ""      ]
 [ "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[:oid], X_5:bat[:oid], 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[:oid], X_6:bat[:oid], X_7:bit, 
X_8:bit, X_9:bit, X_10:bit, X_11:lng) (X_0:bat[:oid], X_1:bat[:oid]) ",    
"ALGrangejoin;",        ""      ]
 [ "algebra",   "reuse",        "command 
algebra.reuse(X_1:bat[:any_1]):bat[:any_1] ",  "ALGreuse;",    ""      ]
 [ "algebra",   "select",       "command algebra.select(X_1:bat[:any_1], 
X_2:any_1, X_3:any_1, X_4:bit, X_5:bit, X_6:bit):bat[:oid] ",  "ALGselect1;",  
""      ]
@@ -743,6 +746,7 @@ stdout of test 'MAL-signatures` in direc
 [ "algebra",   "sort", "command algebra.sort(X_2:bat[:any_1], X_3:bat[:oid], 
X_4:bat[:oid], X_5:bit, X_6:bit, X_7:bit) (X_0:bat[:any_1], X_1:bat[:oid]) ",   
  "ALGsort32;",   ""      ]
 [ "algebra",   "sort", "command algebra.sort(X_3:bat[:any_1], X_4:bat[:oid], 
X_5:bat[:oid], X_6:bit, X_7:bit, X_8:bit) (X_0:bat[:any_1], X_1:bat[:oid], 
X_2:bat[:oid]) ",      "ALGsort33;",   ""      ]
 [ "algebra",   "subslice",     "command algebra.subslice(X_1:bat[:any_1], 
X_2:lng, X_3:lng):bat[:oid] ",       "ALGsubslice_lng;",     ""      ]
+[ "algebra",   "thetajoin",    "command algebra.thetajoin(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:int, X_6:bit, 
X_7:lng):bat[:oid] ",      "ALGthetajoin1;",       ""      ]
 [ "algebra",   "thetajoin",    "command algebra.thetajoin(X_2:bat[:any_1], 
X_3:bat[:any_1], X_4:bat[:oid], X_5:bat[:oid], X_6:int, X_7:bit, X_8:lng) 
(X_0:bat[:oid], X_1:bat[:oid]) ", "ALGthetajoin;",        ""      ]
 [ "algebra",   "thetaselect",  "command algebra.thetaselect(X_1:bat[:any_1], 
X_2:any_1, X_3:str):bat[:oid] ",  "ALGthetaselect1;",     ""      ]
 [ "algebra",   "thetaselect",  "command algebra.thetaselect(X_1:bat[:any_1], 
X_2:bat[:oid], X_3:any_1, X_4:str):bat[:oid] ",   "ALGthetaselect2;",     ""    
  ]
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
@@ -790,6 +790,7 @@ str ALARMsleep(Client cntxt, MalBlkPtr m
 str ALARMtime(int *res);
 str ALARMusec(lng *ret);
 str ALGbandjoin(bat *r1, bat *r2, const bat *lid, const bat *rid, const bat 
*slid, const bat *srid, const void *low, const void *high, const bit *li, const 
bit *hi, const lng *estimate);
+str ALGbandjoin1(bat *r1, const bat *lid, const bat *rid, const bat *slid, 
const bat *srid, const void *low, const void *high, const bit *li, const bit 
*hi, const lng *estimate);
 str ALGcard(lng *result, const bat *bid);
 str ALGcopy(bat *result, const bat *bid);
 str ALGcorr(dbl *res, const bat *bid1, const bat *bid2);
@@ -818,11 +819,13 @@ str ALGmaxany_skipnil(ptr result, const 
 str ALGminany(ptr result, const bat *bid);
 str ALGminany_skipnil(ptr result, const bat *bid, const bit *skipnil);
 str ALGouterjoin(bat *r1, bat *r2, const bat *l, const bat *r, const bat *sl, 
const bat *sr, const bit *nil_matches, const lng *estimate);
+str ALGouterjoin1(bat *r1, const bat *l, const bat *r, const bat *sl, const 
bat *sr, const bit *nil_matches, const lng *estimate);
 str ALGprojection(bat *result, const bat *lid, const bat *rid);
 str ALGprojection2(bat *result, const bat *lid, const bat *r1id, const bat 
*r2id);
 str ALGprojectionpath(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str ALGprojecttail(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str ALGrangejoin(bat *r1, bat *r2, const bat *lid, const bat *rlid, const bat 
*rhid, const bat *slid, const bat *srid, const bit *li, const bit *hi, const 
bit *anti, const bit *symmetric, const lng *estimate);
+str ALGrangejoin1(bat *r1, const bat *lid, const bat *rlid, const bat *rhid, 
const bat *slid, const bat *srid, const bit *li, const bit *hi, const bit 
*anti, const bit *symmetric, const lng *estimate);
 str ALGreuse(bat *ret, const bat *bid);
 str ALGselect1(bat *result, const bat *bid, const void *low, const void *high, 
const bit *li, const bit *hi, const bit *anti);
 str ALGselect1nil(bat *result, const bat *bid, const void *low, const void 
*high, const bit *li, const bit *hi, const bit *anti, const bit *unknown);
@@ -847,6 +850,7 @@ str ALGstdev(dbl *res, const bat *bid);
 str ALGstdevp(dbl *res, const bat *bid);
 str ALGsubslice_lng(bat *ret, const bat *bid, const lng *start, const lng 
*end);
 str ALGthetajoin(bat *r1, bat *r2, const bat *l, const bat *r, const bat *sl, 
const bat *sr, const int *op, const bit *nil_matches, const lng *estimate);
+str ALGthetajoin1(bat *r1, const bat *l, const bat *r, const bat *sl, const 
bat *sr, const int *op, const bit *nil_matches, const lng *estimate);
 str ALGthetaselect1(bat *result, const bat *bid, const void *val, const char 
**op);
 str ALGthetaselect2(bat *result, const bat *bid, const bat *sid, const void 
*val, const char **op);
 str ALGunique1(bat *result, const bat *bid);
@@ -2144,7 +2148,6 @@ str alter_typeRef;
 str alter_userRef;
 str alter_viewRef;
 str andRef;
-str antijoinRef;
 str appendRef;
 str appendidxRef;
 str arrayRef;
@@ -2580,6 +2583,7 @@ str optimizerRef;
 str optimizer_epilogue(void *ret);
 str optimizer_prelude(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
 str orRef;
+str outerjoinRef;
 str pack2Ref;
 str packIncrementRef;
 str packRef;
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -4026,7 +4026,7 @@ BATrangejoin(BAT **r1p, BAT **r2p, BAT *
             BUN estimate)
 {
        struct canditer lci, rci;
-       BAT *r1, *r2;
+       BAT *r1 = NULL, *r2 = NULL;
        BUN maxsize;
        lng t0 = 0;
 
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
@@ -569,6 +569,15 @@ ALGouterjoin(bat *r1, bat *r2, const bat
 }
 
 str
+ALGouterjoin1(bat *r1, const bat *lid, const bat *rid, const bat *slid, const 
bat *srid,
+                               const bit *nil_matches, const lng *estimate)
+{
+       return do_join(r1, NULL, lid, rid, NULL, slid, srid, 0, NULL, NULL,
+                                  false, false, false, false, nil_matches, 
NULL, NULL, estimate,
+                                  BATouterjoin, NULL, NULL, NULL, NULL, NULL, 
NULL, "algebra.outerjoin");
+}
+
+str
 ALGsemijoin(bat *r1, bat *r2, const bat *lid, const bat *rid, const bat *slid, 
const bat *srid,
                        const bit *nil_matches, const bit *max_one, const lng 
*estimate)
 {
@@ -587,6 +596,15 @@ ALGthetajoin(bat *r1, bat *r2, const bat
 }
 
 str
+ALGthetajoin1(bat *r1, const bat *lid, const bat *rid, const bat *slid, const 
bat *srid,
+                               const int *op, const bit *nil_matches, const 
lng *estimate)
+{
+       return do_join(r1, NULL, lid, rid, NULL, slid, srid, *op, NULL, NULL,
+                                  false, false, false, false, nil_matches, 
NULL, NULL, estimate,
+                                  NULL, NULL, BATthetajoin, NULL, NULL, NULL, 
NULL, "algebra.thetajoin");
+}
+
+str
 ALGbandjoin(bat *r1, bat *r2, const bat *lid, const bat *rid, const bat *slid, 
const bat *srid,
                           const void *c1, const void *c2, const bit *li, const 
bit *hi,
                           const lng *estimate)
@@ -597,7 +615,18 @@ ALGbandjoin(bat *r1, bat *r2, const bat 
 }
 
 str
-ALGrangejoin(bat *r1, bat *r2, const bat *lid, const bat *rlid, const bat 
*rhid, const bat *slid, const bat *srid, const bit *li, const bit *hi, const 
bit *anti, const bit *symmetric, const lng *estimate)
+ALGbandjoin1(bat *r1, const bat *lid, const bat *rid, const bat *slid, const 
bat *srid,
+                          const void *c1, const void *c2, const bit *li, const 
bit *hi,
+                          const lng *estimate)
+{
+       return do_join(r1, NULL, lid, rid, NULL, slid, srid, 0, c1, c2,
+                                  *li, *hi, false, false, NULL, NULL, NULL, 
estimate,
+                                  NULL, NULL, NULL, BATbandjoin, NULL, NULL, 
NULL, "algebra.bandjoin");
+}
+
+str
+ALGrangejoin(bat *r1, bat *r2, const bat *lid, const bat *rlid, const bat 
*rhid, const bat *slid, const bat *srid, 
+                        const bit *li, const bit *hi, const bit *anti, const 
bit *symmetric, const lng *estimate)
 {
        return do_join(r1, r2, lid, rlid, rhid, slid, srid, 0, NULL, NULL,
                                   *li, *hi, *anti, *symmetric, NULL, NULL, 
NULL, estimate,
@@ -605,6 +634,15 @@ ALGrangejoin(bat *r1, bat *r2, const bat
 }
 
 str
+ALGrangejoin1(bat *r1, const bat *lid, const bat *rlid, const bat *rhid, const 
bat *slid, const bat *srid,
+                         const bit *li, const bit *hi, const bit *anti, const 
bit *symmetric, const lng *estimate)
+{
+       return do_join(r1, NULL, lid, rlid, rhid, slid, srid, 0, NULL, NULL,
+                                  *li, *hi, *anti, *symmetric, NULL, NULL, 
NULL, estimate,
+                                  NULL, NULL, NULL, NULL, BATrangejoin, NULL, 
NULL, "algebra.rangejoin");
+}
+
+str
 ALGdifference(bat *r1, const bat *lid, const bat *rid, const bat *slid, const 
bat *srid,
                          const bit *nil_matches, const bit *not_in, const lng 
*estimate)
 {
@@ -1426,10 +1464,14 @@ mel_func algebra_init_funcs[] = {
  command("algebra", "leftjoin", ALGleftjoin, false, "Left join with candidate 
lists", args(2,8, 
batarg("",oid),batarg("",oid),batargany("l",1),batargany("r",1),batarg("sl",oid),batarg("sr",oid),arg("nil_matches",bit),arg("estimate",lng))),
  command("algebra", "leftjoin", ALGleftjoin1, false, "Left join with candidate 
lists; only produce left output", args(1,7, 
batarg("",oid),batargany("l",1),batargany("r",1),batarg("sl",oid),batarg("sr",oid),arg("nil_matches",bit),arg("estimate",lng))),
  command("algebra", "outerjoin", ALGouterjoin, false, "Left outer join with 
candidate lists", args(2,8, 
batarg("",oid),batarg("",oid),batargany("l",1),batargany("r",1),batarg("sl",oid),batarg("sr",oid),arg("nil_matches",bit),arg("estimate",lng))),
+ command("algebra", "outerjoin", ALGouterjoin1, false, "Left outer join with 
candidate lists; only produce left output", 
args(1,7,batarg("",oid),batargany("l",1),batargany("r",1),batarg("sl",oid),batarg("sr",oid),arg("nil_matches",bit),arg("estimate",lng))),
  command("algebra", "semijoin", ALGsemijoin, false, "Semi join with candidate 
lists", args(2,9, 
batarg("",oid),batarg("",oid),batargany("l",1),batargany("r",1),batarg("sl",oid),batarg("sr",oid),arg("nil_matches",bit),arg("max_one",bit),arg("estimate",lng))),
  command("algebra", "thetajoin", ALGthetajoin, false, "Theta join with 
candidate lists", args(2,9, 
batarg("",oid),batarg("",oid),batargany("l",1),batargany("r",1),batarg("sl",oid),batarg("sr",oid),arg("op",int),arg("nil_matches",bit),arg("estimate",lng))),
+ command("algebra", "thetajoin", ALGthetajoin1, false, "Theta join with 
candidate lists; only produce left output", args(1,8, 
batarg("",oid),batargany("l",1),batargany("r",1),batarg("sl",oid),batarg("sr",oid),arg("op",int),arg("nil_matches",bit),arg("estimate",lng))),
  command("algebra", "bandjoin", ALGbandjoin, false, "Band join: values in l 
and r match if r - c1 <[=] l <[=] r + c2", args(2,11, 
batarg("",oid),batarg("",oid),batargany("l",1),batargany("r",1),batarg("sl",oid),batarg("sr",oid),argany("c1",1),argany("c2",1),arg("li",bit),arg("hi",bit),arg("estimate",lng))),
+ command("algebra", "bandjoin", ALGbandjoin1, false, "Band join: values in l 
and r match if r - c1 <[=] l <[=] r + c2; only produce left output", args(1,10, 
batarg("",oid),batargany("l",1),batargany("r",1),batarg("sl",oid),batarg("sr",oid),argany("c1",1),argany("c2",1),arg("li",bit),arg("hi",bit),arg("estimate",lng))),
  command("algebra", "rangejoin", ALGrangejoin, false, "Range join: values in l 
and r1/r2 match if r1 <[=] l <[=] r2", args(2,12, 
batarg("",oid),batarg("",oid),batargany("l",1),batargany("r1",1),batargany("r2",1),batarg("sl",oid),batarg("sr",oid),arg("li",bit),arg("hi",bit),arg("anti",bit),arg("symmetric",bit),arg("estimate",lng))),
+ command("algebra", "rangejoin", ALGrangejoin1, false, "Range join: values in 
l and r1/r2 match if r1 <[=] l <[=] r2; only produce left output", 
args(1,11,batarg("",oid),batargany("l",1),batargany("r1",1),batargany("r2",1),batarg("sl",oid),batarg("sr",oid),arg("li",bit),arg("hi",bit),arg("anti",bit),arg("symmetric",bit),arg("estimate",lng))),
  command("algebra", "difference", ALGdifference, false, "Difference of l and r 
with candidate lists", args(1,8, 
batarg("",oid),batargany("l",1),batargany("r",1),batarg("sl",oid),batarg("sr",oid),arg("nil_matches",bit),arg("nil_clears",bit),arg("estimate",lng))),
  command("algebra", "intersect", ALGintersect, false, "Intersection of l and r 
with candidate lists (i.e. half of semi-join)", args(1,8, 
batarg("",oid),batargany("l",1),batargany("r",1),batarg("sl",oid),batarg("sr",oid),arg("nil_matches",bit),arg("max_one",bit),arg("estimate",lng))),
  pattern("algebra", "firstn", ALGfirstn, false, "Calculate first N values of 
B", args(1,6, 
batarg("",oid),batargany("b",0),arg("n",lng),arg("asc",bit),arg("nilslast",bit),arg("distinct",bit))),
diff --git a/monetdb5/modules/kernel/algebra.h 
b/monetdb5/modules/kernel/algebra.h
--- a/monetdb5/modules/kernel/algebra.h
+++ b/monetdb5/modules/kernel/algebra.h
@@ -39,10 +39,14 @@ mal_export str ALGjoin1(bat *r1, const b
 mal_export str ALGleftjoin(bat *r1, bat *r2, const bat *l, const bat *r, const 
bat *sl, const bat *sr, const bit *nil_matches, const lng *estimate);
 mal_export str ALGleftjoin1(bat *r1, const bat *l, const bat *r, const bat 
*sl, const bat *sr, const bit *nil_matches, const lng *estimate);
 mal_export str ALGouterjoin(bat *r1, bat *r2, const bat *l, const bat *r, 
const bat *sl, const bat *sr, const bit *nil_matches, const lng *estimate);
+mal_export str ALGouterjoin1(bat *r1, const bat *l, const bat *r, const bat 
*sl, const bat *sr, const bit *nil_matches, const lng *estimate);
 mal_export str ALGsemijoin(bat *r1, bat *r2, const bat *l, const bat *r, const 
bat *sl, const bat *sr, const bit *nil_matches, const bit *max_one, const lng 
*estimate);
 mal_export str ALGthetajoin(bat *r1, bat *r2, const bat *l, const bat *r, 
const bat *sl, const bat *sr, const int *op, const bit *nil_matches, const lng 
*estimate);
+mal_export str ALGthetajoin1(bat *r1, const bat *l, const bat *r, const bat 
*sl, const bat *sr, const int *op, const bit *nil_matches, const lng *estimate);
 mal_export str ALGbandjoin(bat *r1, bat *r2, const bat *lid, const bat *rid, 
const bat *slid, const bat *srid, const void *low, const void *high, const bit 
*li, const bit *hi, const lng *estimate);
+mal_export str ALGbandjoin1(bat *r1, const bat *lid, const bat *rid, const bat 
*slid, const bat *srid, const void *low, const void *high, const bit *li, const 
bit *hi, const lng *estimate);
 mal_export str ALGrangejoin(bat *r1, bat *r2, const bat *lid, const bat *rlid, 
const bat *rhid, const bat *slid, const bat *srid, const bit *li, const bit 
*hi, const bit *anti, const bit *symmetric, const lng *estimate);
+mal_export str ALGrangejoin1(bat *r1, const bat *lid, const bat *rlid, const 
bat *rhid, const bat *slid, const bat *srid, const bit *li, const bit *hi, 
const bit *anti, const bit *symmetric, const lng *estimate);
 mal_export str ALGdifference(bat *r1, const bat *lid, const bat *rid, const 
bat *slid, const bat *srid, const bit *nil_matches, const bit *not_in, const 
lng *estimate);
 mal_export str ALGintersect(bat *r1, const bat *lid, const bat *rid, const bat 
*slid, const bat *srid, const bit *nil_matches, const bit *max_one, const lng 
*estimate);
 
diff --git a/monetdb5/modules/kernel/algebra.mal 
b/monetdb5/modules/kernel/algebra.mal
--- a/monetdb5/modules/kernel/algebra.mal
+++ b/monetdb5/modules/kernel/algebra.mal
@@ -202,6 +202,10 @@ command outerjoin(l:bat[:any_1],r:bat[:a
 address ALGouterjoin
 comment "Left outer join with candidate lists";
 
+command 
outerjoin(l:bat[:any_1],r:bat[:any_1],sl:bat[:oid],sr:bat[:oid],nil_matches:bit,estimate:lng)
 :bat[:oid]
+address ALGouterjoin1
+comment "Left outer join with candidate lists; only produce left output";
+
 command 
semijoin(l:bat[:any_1],r:bat[:any_1],sl:bat[:oid],sr:bat[:oid],nil_matches:bit,max_one:bit,estimate:lng)
 (:bat[:oid],:bat[:oid])
 address ALGsemijoin
 comment "Semi join with candidate lists";
@@ -210,14 +214,26 @@ command thetajoin(l:bat[:any_1],r:bat[:a
 address ALGthetajoin
 comment "Theta join with candidate lists";
 
+command 
thetajoin(l:bat[:any_1],r:bat[:any_1],sl:bat[:oid],sr:bat[:oid],op:int,nil_matches:bit,estimate:lng)
 :bat[:oid]
+address ALGthetajoin1
+comment "Theta join with candidate lists; only produce left output";
+
 command 
bandjoin(l:bat[:any_1],r:bat[:any_1],sl:bat[:oid],sr:bat[:oid],c1:any_1,c2:any_1,li:bit,hi:bit,estimate:lng)
 (:bat[:oid],:bat[:oid])
 address ALGbandjoin
 comment "Band join: values in l and r match if r - c1 <[=] l <[=] r + c2";
 
+command 
bandjoin(l:bat[:any_1],r:bat[:any_1],sl:bat[:oid],sr:bat[:oid],c1:any_1,c2:any_1,li:bit,hi:bit,estimate:lng)
 :bat[:oid]
+address ALGbandjoin1
+comment "Band join: values in l and r match if r - c1 <[=] l <[=] r + c2; only 
produce left output";
+
 command 
rangejoin(l:bat[:any_1],r1:bat[:any_1],r2:bat[:any_1],sl:bat[:oid],sr:bat[:oid],li:bit,hi:bit,anti:bit,symmetric:bit,estimate:lng)
 (:bat[:oid],:bat[:oid])
 address ALGrangejoin
 comment "Range join: values in l and r1/r2 match if r1 <[=] l <[=] r2";
 
+command 
rangejoin(l:bat[:any_1],r1:bat[:any_1],r2:bat[:any_1],sl:bat[:oid],sr:bat[:oid],li:bit,hi:bit,anti:bit,symmetric:bit,estimate:lng)
 :bat[:oid]
+address ALGrangejoin1
+comment "Range join: values in l and r1/r2 match if r1 <[=] l <[=] r2; only 
produce left output";
+
 command 
difference(l:bat[:any_1],r:bat[:any_1],sl:bat[:oid],sr:bat[:oid],nil_matches:bit,nil_clears:bit,estimate:lng)
 :bat[:oid]
 address ALGdifference
 comment "Difference of l and r with candidate lists";
diff --git a/monetdb5/optimizer/opt_postfix.c b/monetdb5/optimizer/opt_postfix.c
--- a/monetdb5/optimizer/opt_postfix.c
+++ b/monetdb5/optimizer/opt_postfix.c
@@ -32,13 +32,12 @@ OPTpostfixImplementation(Client cntxt, M
        for( i = 0; i< slimit; i++){
 /* POSTFIX ACTION FOR THE JOIN CASE  */
                p= getInstrPtr(mb, i);
-               if ( getModuleId(p) == algebraRef && getFunctionId(p) == 
joinRef && getVarEolife(mb, getArg(p, p->retc -1)) == i){
-                       delArgument(p, p->retc -1);
-                       typeChecker(cntxt->usermodule, mb, p, i, TRUE);
-                       actions++;
-                       continue;
-               }
-               if ( getModuleId(p) == algebraRef && getFunctionId(p) == 
leftjoinRef && getVarEolife(mb, getArg(p, p->retc -1)) == i){
+               if ( getModuleId(p) == algebraRef && (getFunctionId(p) == 
joinRef 
+                                                                               
          || getFunctionId(p) == leftjoinRef
+                                                                               
          || getFunctionId(p) == outerjoinRef
+                                                                               
          || getFunctionId(p) == thetajoinRef
+                                                                               
          || getFunctionId(p) == bandjoinRef
+                                                                               
          || getFunctionId(p) == rangejoinRef) && getVarEolife(mb, getArg(p, 
p->retc -1)) == i){
                        delArgument(p, p->retc -1);
                        typeChecker(cntxt->usermodule, mb, p, i, TRUE);
                        actions++;
diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c
--- a/monetdb5/optimizer/opt_prelude.c
+++ b/monetdb5/optimizer/opt_prelude.c
@@ -39,7 +39,6 @@ str alter_typeRef;
 str alter_userRef;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to