Changeset: f0890d8d3e92 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f0890d8d3e92
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
sql/backends/monet5/sql.c
sql/backends/monet5/sql_subquery.c
sql/backends/monet5/sql_subquery.h
sql/backends/monet5/sql_subquery.mal
sql/test/BugTracker-2018/Tests/sqlitelogictest-cast-null-add.Bug-6630.stable.out
sql/test/mergetables/Tests/mergeinit.stable.err
Branch: default
Log Message:
Added missing bulk implementation for aggr.exists and aggr.not_exists. This
fixes the buggy query on subquery4 somehow
diffs (truncated from 303 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
@@ -126,8 +126,7 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "covariancep", "command aggr.covariancep(X_1:bat[:sht],
X_2:bat[:sht], X_3:bat[:oid], X_4:bat[:any_1]):bat[:dbl] ",
"AGGRcovariancep;", "" ]
[ "aggr", "covariancep", "command aggr.covariancep(X_1:bat[:any_2],
X_2:bat[:any_2]):dbl ", "ALGcovariancep;", "" ]
[ "aggr", "exist", "command aggr.exist(X_1:bat[:any_2],
X_2:any_1):bit ", "ALGexist;", "" ]
-[ "aggr", "exist", "command aggr.exist(X_1:bat[:any]):bit ",
"SQLexist;", "" ]
-[ "aggr", "exist", "pattern aggr.exist(X_1:any):bit ",
"SQLexist_val;", "" ]
+[ "aggr", "exist", "pattern aggr.exist(X_1:any_1):bit ",
"SQLexist;", "" ]
[ "aggr", "jsonaggr", "command aggr.jsonaggr(X_1:bat[:dbl]):str ",
"JSONgroupStr;", "" ]
[ "aggr", "jsonaggr", "command aggr.jsonaggr(X_1:bat[:str]):str ",
"JSONgroupStr;", "" ]
[ "aggr", "max", "command aggr.max(X_1:bat[:any_1], X_2:bat[:oid],
X_3:bat[:any_2]):bat[:any_1] ", "AGGRmax3;", "" ]
@@ -139,8 +138,7 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "min", "command aggr.min(X_1:bat[:any_2]):any_2 ",
"ALGminany;", "" ]
[ "aggr", "min", "command aggr.min(X_1:bat[:any_2], X_2:bit):any_2 ",
"ALGminany_skipnil;", "" ]
[ "aggr", "not_anyequal", "pattern aggr.not_anyequal(X_1:any_1,
X_2:any_1):bit ", "CMDvarNE;", "" ]
-[ "aggr", "not_exist", "command aggr.not_exist(X_1:bat[:any]):bit ",
"SQLnot_exist;", "" ]
-[ "aggr", "not_exist", "pattern aggr.not_exist(X_1:any):bit ",
"SQLnot_exist_val;", "" ]
+[ "aggr", "not_exist", "pattern aggr.not_exist(X_1:any_1):bit ",
"SQLnot_exist;", "" ]
[ "aggr", "prod", "command aggr.prod(X_1:bat[:bte], X_2:bat[:oid],
X_3:bat[:any_1]):bat[:bte] ", "AGGRprod3_bte;", "" ]
[ "aggr", "prod", "command aggr.prod(X_1:bat[:dbl], X_2:bat[:oid],
X_3:bat[:any_1]):bat[:dbl] ", "AGGRprod3_dbl;", "" ]
[ "aggr", "prod", "command aggr.prod(X_1:bat[:flt], X_2:bat[:oid],
X_3:bat[:any_1]):bat[:dbl] ", "AGGRprod3_dbl;", "" ]
@@ -718,6 +716,12 @@ stdout of test 'MAL-signatures` in direc
[ "bat", "setPersistent", "command
bat.setPersistent(X_1:bat[:any_1]):void ", "BKCsetPersistent;", "" ]
[ "bat", "setTransient", "command bat.setTransient(X_1:bat[:any_1]):void
", "BKCsetTransient;", "" ]
[ "bat", "single", "pattern bat.single(X_1:any_1):bat[:any_1] ",
"CMDBATsingle;", "" ]
+[ "bataggr", "exist", "pattern bataggr.exist(X_1:any_1):bat[:bit] ",
"SQLexist;", "" ]
+[ "bataggr", "exist", "pattern
bataggr.exist(X_1:bat[:any_1]):bat[:bit] ", "SQLexist;", "" ]
+[ "bataggr", "exist", "pattern bataggr.exist(X_1:bat[:any_1]):bit ",
"SQLexist;", "" ]
+[ "bataggr", "not_exist", "pattern bataggr.not_exist(X_1:any_1):bat[:bit]
", "SQLnot_exist;", "" ]
+[ "bataggr", "not_exist", "pattern
bataggr.not_exist(X_1:bat[:any_1]):bat[:bit] ", "SQLnot_exist;",
"" ]
+[ "bataggr", "not_exist", "pattern bataggr.not_exist(X_1:bat[:any_1]):bit
", "SQLnot_exist;", "" ]
[ "batalgebra", "ilike", "command
batalgebra.ilike(X_1:bat[:str], X_2:str):bat[:bit] ", "BATPCREilike2;",
"" ]
[ "batalgebra", "ilike", "command
batalgebra.ilike(X_1:bat[:str], X_2:str, X_3:str):bat[:bit] ", "BATPCREilike;",
"" ]
[ "batalgebra", "like", "command batalgebra.like(X_1:bat[:str],
X_2:str):bat[:bit] ", "BATPCRElike2;", "" ]
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
@@ -135,8 +135,7 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "covariancep", "command aggr.covariancep(X_1:bat[:sht],
X_2:bat[:sht], X_3:bat[:oid], X_4:bat[:any_1]):bat[:dbl] ",
"AGGRcovariancep;", "" ]
[ "aggr", "covariancep", "command aggr.covariancep(X_1:bat[:any_2],
X_2:bat[:any_2]):dbl ", "ALGcovariancep;", "" ]
[ "aggr", "exist", "command aggr.exist(X_1:bat[:any_2],
X_2:any_1):bit ", "ALGexist;", "" ]
-[ "aggr", "exist", "command aggr.exist(X_1:bat[:any]):bit ",
"SQLexist;", "" ]
-[ "aggr", "exist", "pattern aggr.exist(X_1:any):bit ",
"SQLexist_val;", "" ]
+[ "aggr", "exist", "pattern aggr.exist(X_1:any_1):bit ",
"SQLexist;", "" ]
[ "aggr", "jsonaggr", "command aggr.jsonaggr(X_1:bat[:dbl]):str ",
"JSONgroupStr;", "" ]
[ "aggr", "jsonaggr", "command aggr.jsonaggr(X_1:bat[:str]):str ",
"JSONgroupStr;", "" ]
[ "aggr", "max", "command aggr.max(X_1:bat[:any_1], X_2:bat[:oid],
X_3:bat[:any_2]):bat[:any_1] ", "AGGRmax3;", "" ]
@@ -148,8 +147,7 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "min", "command aggr.min(X_1:bat[:any_2]):any_2 ",
"ALGminany;", "" ]
[ "aggr", "min", "command aggr.min(X_1:bat[:any_2], X_2:bit):any_2 ",
"ALGminany_skipnil;", "" ]
[ "aggr", "not_anyequal", "pattern aggr.not_anyequal(X_1:any_1,
X_2:any_1):bit ", "CMDvarNE;", "" ]
-[ "aggr", "not_exist", "command aggr.not_exist(X_1:bat[:any]):bit ",
"SQLnot_exist;", "" ]
-[ "aggr", "not_exist", "pattern aggr.not_exist(X_1:any):bit ",
"SQLnot_exist_val;", "" ]
+[ "aggr", "not_exist", "pattern aggr.not_exist(X_1:any_1):bit ",
"SQLnot_exist;", "" ]
[ "aggr", "prod", "command aggr.prod(X_1:bat[:bte], X_2:bat[:oid],
X_3:bat[:any_1]):bat[:bte] ", "AGGRprod3_bte;", "" ]
[ "aggr", "prod", "command aggr.prod(X_1:bat[:dbl], X_2:bat[:oid],
X_3:bat[:any_1]):bat[:dbl] ", "AGGRprod3_dbl;", "" ]
[ "aggr", "prod", "command aggr.prod(X_1:bat[:flt], X_2:bat[:oid],
X_3:bat[:any_1]):bat[:dbl] ", "AGGRprod3_dbl;", "" ]
@@ -829,6 +827,12 @@ stdout of test 'MAL-signatures` in direc
[ "bat", "setPersistent", "command
bat.setPersistent(X_1:bat[:any_1]):void ", "BKCsetPersistent;", "" ]
[ "bat", "setTransient", "command bat.setTransient(X_1:bat[:any_1]):void
", "BKCsetTransient;", "" ]
[ "bat", "single", "pattern bat.single(X_1:any_1):bat[:any_1] ",
"CMDBATsingle;", "" ]
+[ "bataggr", "exist", "pattern bataggr.exist(X_1:any_1):bat[:bit] ",
"SQLexist;", "" ]
+[ "bataggr", "exist", "pattern
bataggr.exist(X_1:bat[:any_1]):bat[:bit] ", "SQLexist;", "" ]
+[ "bataggr", "exist", "pattern bataggr.exist(X_1:bat[:any_1]):bit ",
"SQLexist;", "" ]
+[ "bataggr", "not_exist", "pattern bataggr.not_exist(X_1:any_1):bat[:bit]
", "SQLnot_exist;", "" ]
+[ "bataggr", "not_exist", "pattern
bataggr.not_exist(X_1:bat[:any_1]):bat[:bit] ", "SQLnot_exist;",
"" ]
+[ "bataggr", "not_exist", "pattern bataggr.not_exist(X_1:bat[:any_1]):bit
", "SQLnot_exist;", "" ]
[ "batalgebra", "ilike", "command
batalgebra.ilike(X_1:bat[:str], X_2:str):bat[:bit] ", "BATPCREilike2;",
"" ]
[ "batalgebra", "ilike", "command
batalgebra.ilike(X_1:bat[:str], X_2:str, X_3:str):bat[:bit] ", "BATPCREilike;",
"" ]
[ "batalgebra", "like", "command batalgebra.like(X_1:bat[:str],
X_2:str):bat[:bit] ", "BATPCRElike2;", "" ]
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -6641,11 +6641,15 @@ static mel_func sql_init_funcs[] = {
command("aggr", "suballnotequal", SQLallnotequal_grp, false, "if all values
in r are not equal to l return true, else if r has nil nil else false",
args(1,6,
batarg("",bit),batargany("l",1),batargany("r",1),batarg("gp",oid),batarg("gpe",oid),arg("no_nil",bit))),
command("aggr", "suballnotequal", SQLallnotequal_grp2, false, "if all values
in r are not equal to l return true, else if r has nil nil else false, except
if rid is nil (ie empty) then true", args(1,7,
batarg("",bit),batargany("l",1),batargany("r",1),batarg("rid",oid),batarg("gp",oid),batarg("gpe",oid),arg("no_nil",bit))),
// command("aggr", "exist", ALGexist, false, "", args(1,3,
arg("",bit),batargany("b",2),argany("h",1))),
- command("aggr", "exist", SQLexist, false, "", args(1,2,
arg("",bit),batargany("b",0))),
- pattern("aggr", "exist", SQLexist_val, false, "", args(1,2,
arg("",bit),argany("v",0))),
+ pattern("aggr", "exist", SQLexist, false, "", args(1,2, arg("",bit),
argany("b",1))),
+ pattern("bataggr", "exist", SQLexist, false, "", args(1,2, batarg("",bit),
argany("b",1))),
+ pattern("bataggr", "exist", SQLexist, false, "", args(1,2, arg("",bit),
batargany("b",1))),
+ pattern("bataggr", "exist", SQLexist, false, "", args(1,2, batarg("",bit),
batargany("b",1))),
command("aggr", "subexist", SQLsubexist, false, "", args(1,5,
batarg("",bit),batargany("b",0),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))),
- command("aggr", "not_exist", SQLnot_exist, false, "", args(1,2,
arg("",bit),batargany("b",0))),
- pattern("aggr", "not_exist", SQLnot_exist_val, false, "", args(1,2,
arg("",bit),argany("v",0))),
+ pattern("aggr", "not_exist", SQLnot_exist, false, "", args(1,2, arg("",bit),
argany("b",1))),
+ pattern("bataggr", "not_exist", SQLnot_exist, false, "", args(1,2,
batarg("",bit), argany("b",1))),
+ pattern("bataggr", "not_exist", SQLnot_exist, false, "", args(1,2,
arg("",bit), batargany("b",1))),
+ pattern("bataggr", "not_exist", SQLnot_exist, false, "", args(1,2,
batarg("",bit), batargany("b",1))),
command("aggr", "subnot_exist", SQLsubnot_exist, false, "", args(1,5,
batarg("",bit),batargany("b",0),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))),
/* wlr */
pattern("wlr", "master", WLRmaster, false, "Initialize the replicator
thread", args(0,1, arg("dbname",str))),
diff --git a/sql/backends/monet5/sql_subquery.c
b/sql/backends/monet5/sql_subquery.c
--- a/sql/backends/monet5/sql_subquery.c
+++ b/sql/backends/monet5/sql_subquery.c
@@ -1097,35 +1097,33 @@ SQLallnotequal_grp2(bat *ret, const bat
}
str
-SQLexist_val(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+SQLexist(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- bit *res = getArgReference_bit(stk, pci, 0);
- ptr v = getArgReference(stk, pci, 1);
- int mtype = getArgType(mb, pci, 1);
+ BAT *b = NULL, *r = NULL;
+ bit count = TRUE;
(void)cntxt;
- if ((mtype == TYPE_bat || mtype > GDKatomcnt)) {
- BAT *b = BATdescriptor(*(bat *)v);
-
- if (b)
- *res = BATcount(b) != 0;
- else
+ if (isaBatType(getArgType(mb, pci, 1))) {
+ bat *bid = getArgReference_bat(stk, pci, 1);
+ if (!(b = BATdescriptor(*bid)))
throw(SQL, "aggr.exist", SQLSTATE(HY005) "Cannot access
column descriptor");
- } else {
- *res = TRUE;
+ count = BATcount(b) != 0;
}
- return MAL_SUCCEED;
-}
+ if (isaBatType(getArgType(mb, pci, 0))) {
+ bat *res = getArgReference_bat(stk, pci, 0);
+ if ((r = BATconstant(b ? b->hseqbase : 0, TYPE_bit, &count, b ?
BATcount(b) : 1, TRANSIENT)) == NULL) {
+ if (b)
+ BBPunfix(b->batCacheid);
+ throw(SQL, "aggr.exist", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ }
+ BBPkeepref(*res = r->batCacheid);
+ } else {
+ bit *res = getArgReference_bit(stk, pci, 0);
+ *res = count;
+ }
-str
-SQLexist(bit *res, bat *id)
-{
- BAT *b;
-
- if ((b = BATdescriptor(*id)) == NULL)
- throw(SQL, "aggr.exist", SQLSTATE(HY005) "Cannot access column
descriptor");
- *res = BATcount(b) != 0;
- BBPunfix(b->batCacheid);
+ if (b)
+ BBPunfix(b->batCacheid);
return MAL_SUCCEED;
}
@@ -1195,34 +1193,33 @@ SQLsubexist(bat *ret, const bat *bp, con
}
str
-SQLnot_exist_val(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+SQLnot_exist(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- bit *res = getArgReference_bit(stk, pci, 0);
- ptr v = getArgReference(stk, pci, 1);
- int mtype = getArgType(mb, pci, 1);
+ BAT *b = NULL, *r = NULL;
+ bit count = FALSE;
(void)cntxt;
- if ((mtype == TYPE_bat || mtype > GDKatomcnt)) {
- BAT *b = BATdescriptor(*(bat *)v);
-
- if (b)
- *res = BATcount(b) == 0;
- else
+ if (isaBatType(getArgType(mb, pci, 1))) {
+ bat *bid = getArgReference_bat(stk, pci, 1);
+ if (!(b = BATdescriptor(*bid)))
throw(SQL, "aggr.not_exist", SQLSTATE(HY005) "Cannot
access column descriptor");
- } else
- *res = FALSE;
- return MAL_SUCCEED;
-}
+ count = BATcount(b) == 0;
+ }
+ if (isaBatType(getArgType(mb, pci, 0))) {
+ bat *res = getArgReference_bat(stk, pci, 0);
+ if ((r = BATconstant(b ? b->hseqbase : 0, TYPE_bit, &count, b ?
BATcount(b) : 1, TRANSIENT)) == NULL) {
+ if (b)
+ BBPunfix(b->batCacheid);
+ throw(SQL, "aggr.not_exist", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ }
+ BBPkeepref(*res = r->batCacheid);
+ } else {
+ bit *res = getArgReference_bit(stk, pci, 0);
+ *res = count;
+ }
-str
-SQLnot_exist(bit *res, bat *id)
-{
- BAT *b;
-
- if ((b = BATdescriptor(*id)) == NULL)
- throw(SQL, "aggr.not_exist", SQLSTATE(HY005) "Cannot access
column descriptor");
- *res = BATcount(b) == 0;
- BBPunfix(b->batCacheid);
+ if (b)
+ BBPunfix(b->batCacheid);
return MAL_SUCCEED;
}
diff --git a/sql/backends/monet5/sql_subquery.h
b/sql/backends/monet5/sql_subquery.h
--- a/sql/backends/monet5/sql_subquery.h
+++ b/sql/backends/monet5/sql_subquery.h
@@ -28,12 +28,10 @@ sql5_export str SQLallnotequal(bit *ret,
sql5_export str SQLallnotequal_grp(bat *ret, const bat *l, const bat *r, const
bat *gp, const bat *gpe, bit *no_nil);
sql5_export str SQLallnotequal_grp2(bat *ret, const bat *l, const bat *r,
const bat *rid, const bat *gp, const bat *gpe, bit *no_nil);
-sql5_export str SQLexist(bit *res, bat *id);
-sql5_export str SQLexist_val(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
+sql5_export str SQLexist(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci);
sql5_export str SQLsubexist(bat *ret, const bat *b, const bat *gp, const bat
*gpe, bit *no_nil);
-sql5_export str SQLnot_exist(bit *res, bat *id);
-sql5_export str SQLnot_exist_val(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
+sql5_export str SQLnot_exist(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str SQLsubnot_exist(bat *ret, const bat *b, const bat *gp, const
bat *gpe, bit *no_nil);
#endif /* _SQL_SUBQUERY_H */
diff --git a/sql/backends/monet5/sql_subquery.mal
b/sql/backends/monet5/sql_subquery.mal
--- a/sql/backends/monet5/sql_subquery.mal
+++ b/sql/backends/monet5/sql_subquery.mal
@@ -75,23 +75,34 @@ command suballnotequal(l:bat[:any_1], r:
address SQLallnotequal_grp2
comment "if all values in r are not equal to l return true, else if r has nil
nil else false, except if rid is nil (ie empty) then true";
-command aggr.exist(b:bat[:any_2], h:any_1):bit
-address ALGexist;
+module bataggr;
+
+pattern aggr.exist(b:any_1):bit
+address SQLexist;
-command aggr.exist(b:bat[:any_0]):bit
+pattern bataggr.exist(b:any_1):bat[:bit]
+address SQLexist;
+
+pattern bataggr.exist(b:bat[:any_1]):bit
+address SQLexist;
+
+pattern bataggr.exist(b:bat[:any_1]):bat[:bit]
address SQLexist;
-pattern aggr.exist(v:any_0):bit
-address SQLexist_val;
-
-command aggr.subexist(b:bat[:any_0], g:bat[:oid], e:bat[:oid],
no_nil:bit):bat[:bit]
+command aggr.subexist(b:bat[:any_1], g:bat[:oid], e:bat[:oid],
no_nil:bit):bat[:bit]
address SQLsubexist;
-command aggr.not_exist(b:bat[:any_0]):bit
+pattern aggr.not_exist(b:any_1):bit
+address SQLnot_exist;
+
+pattern bataggr.not_exist(b:any_1):bat[:bit]
address SQLnot_exist;
-pattern aggr.not_exist(v:any_0):bit
-address SQLnot_exist_val;
+pattern bataggr.not_exist(b:bat[:any_1]):bit
+address SQLnot_exist;
-command aggr.subnot_exist(b:bat[:any_0], g:bat[:oid], e:bat[:oid],
no_nil:bit):bat[:bit]
+pattern bataggr.not_exist(b:bat[:any_1]):bat[:bit]
+address SQLnot_exist;
+
+command aggr.subnot_exist(b:bat[:any_1], g:bat[:oid], e:bat[:oid],
no_nil:bit):bat[:bit]
address SQLsubnot_exist;
diff --git
a/sql/test/BugTracker-2018/Tests/sqlitelogictest-cast-null-add.Bug-6630.stable.out
b/sql/test/BugTracker-2018/Tests/sqlitelogictest-cast-null-add.Bug-6630.stable.out
---
a/sql/test/BugTracker-2018/Tests/sqlitelogictest-cast-null-add.Bug-6630.stable.out
+++
b/sql/test/BugTracker-2018/Tests/sqlitelogictest-cast-null-add.Bug-6630.stable.out
@@ -73,7 +73,7 @@ stdout of test 'sqlitelogictest-cast-nul
[ NULL ]
#SELECT ALL CAST ( col1 / - - ( + CAST ( NULL AS INTEGER ) ) AS BIGINT ) col0,
# CAST ( 39 + + + CAST ( NULL AS INTEGER ) + + - 10 + col1 / - col0
AS BIGINT ) AS col1 FROM tab2;
-% sys., sys. # table_name
+% sys., . # table_name
% col0, col1 # name
% bigint, bigint # type
% 1, 1 # length
diff --git a/sql/test/mergetables/Tests/mergeinit.stable.err
b/sql/test/mergetables/Tests/mergeinit.stable.err
--- a/sql/test/mergetables/Tests/mergeinit.stable.err
+++ b/sql/test/mergetables/Tests/mergeinit.stable.err
@@ -7,7 +7,7 @@ stderr of test 'mergeinit` in directory
MAPI = (monetdb) /var/tmp/mtest-119047/.s.monetdb.33596
QUERY = ALTER TABLE complete ADD TABLE wrong; --error, cannot add views to a
merge table
-ERROR = !ALTER TABLE: can't add a view into a MERGE TABLE
+ERROR = !ALTER TABLE: can't add/drop a view into a MERGE TABLE
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list