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