Changeset: 21421e8e7fbf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=21421e8e7fbf
Modified Files:
sql/backends/monet5/rel_bin.c
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_optimizer.c
sql/server/rel_select.c
Branch: properties
Log Message:
Merged with default
diffs (truncated from 2015 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
@@ -777,7 +777,8 @@ stdout of test 'MAL-signatures` in direc
[ "batalgebra", "not_like", "pattern
batalgebra.not_like(X_1:bat[:str], X_2:bat[:str], X_3:str):bat[:bit] ",
"BATPCREnotlike;", "" ]
[ "batalgebra", "not_like", "pattern
batalgebra.not_like(X_1:bat[:str], X_2:str, X_3:str):bat[:bit] ",
"BATPCREnotlike;", "" ]
[ "batalgebra", "not_like", "pattern batalgebra.not_like(X_1:str,
X_2:bat[:str], X_3:str):bat[:bit] ", "BATPCREnotlike;", "" ]
-[ "batblob", "nitems", "command
batblob.nitems(X_1:bat[:blob]):bat[:int] ", "BLOBnitems_bulk;", "" ]
+[ "batblob", "nitems", "pattern
batblob.nitems(X_1:bat[:blob]):bat[:int] ", "BLOBnitems_bulk;", "" ]
+[ "batblob", "nitems", "pattern batblob.nitems(X_1:bat[:blob],
X_2:bat[:oid]):bat[:int] ", "BLOBnitems_bulk;", "" ]
[ "batcalc", "!=", "pattern batcalc.!=(X_1:any_1,
X_2:bat[:any_1]):bat[:bit] ", "CMDbatNE;", "" ]
[ "batcalc", "!=", "pattern batcalc.!=(X_1:any_1, X_2:bat[:any_1],
X_3:bat[:oid]):bat[:bit] ", "CMDbatNE;", "" ]
[ "batcalc", "!=", "pattern batcalc.!=(X_1:any_1, X_2:bat[:any_1],
X_3:bat[:oid], X_4:bit):bat[:bit] ", "CMDbatNE;", "" ]
@@ -8010,7 +8011,6 @@ stdout of test 'MAL-signatures` in direc
[ "calc", "iszero", "pattern calc.iszero(X_1:int):bit ",
"CMDvarISZERO;", "" ]
[ "calc", "iszero", "pattern calc.iszero(X_1:lng):bit ",
"CMDvarISZERO;", "" ]
[ "calc", "iszero", "pattern calc.iszero(X_1:sht):bit ",
"CMDvarISZERO;", "" ]
-[ "calc", "json", "command calc.json(X_1:json):json ",
"JSONstr2json;", "" ]
[ "calc", "json", "command calc.json(X_1:str):json ",
"JSONstr2json;", "" ]
[ "calc", "length", "command calc.length(X_1:str):int ",
"CMDstrlength;", "" ]
[ "calc", "lng", "pattern calc.lng(X_1:bit):lng ",
"CMDvarCONVERT;", "" ]
@@ -8814,10 +8814,7 @@ stdout of test 'MAL-signatures` in direc
[ "json", "fold", "pattern json.fold(X_1:bat[:str], X_2:bat[:any]):json
", "JSONfold;", "" ]
[ "json", "integer", "command json.integer(X_1:json):lng ",
"JSONjson2integer;", "" ]
[ "json", "isarray", "command json.isarray(X_1:json):bit ",
"JSONisarray;", "" ]
-[ "json", "isarray", "command json.isarray(X_1:str):bit ",
"JSONisarray;", "" ]
[ "json", "isobject", "command json.isobject(X_1:json):bit ",
"JSONisobject;", "" ]
-[ "json", "isobject", "command json.isobject(X_1:str):bit ",
"JSONisobject;", "" ]
-[ "json", "isvalid", "command json.isvalid(X_1:json):bit ",
"JSONisvalid;", "" ]
[ "json", "isvalid", "command json.isvalid(X_1:str):bit ",
"JSONisvalid;", "" ]
[ "json", "keyarray", "command json.keyarray(X_1:json):json ",
"JSONkeyArray;", "" ]
[ "json", "keys", "command json.keys(X_1:json):bat[:str] ",
"JSONkeyTable;", "" ]
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
@@ -892,7 +892,8 @@ stdout of test 'MAL-signatures` in direc
[ "batalgebra", "not_like", "pattern
batalgebra.not_like(X_1:bat[:str], X_2:bat[:str], X_3:str):bat[:bit] ",
"BATPCREnotlike;", "" ]
[ "batalgebra", "not_like", "pattern
batalgebra.not_like(X_1:bat[:str], X_2:str, X_3:str):bat[:bit] ",
"BATPCREnotlike;", "" ]
[ "batalgebra", "not_like", "pattern batalgebra.not_like(X_1:str,
X_2:bat[:str], X_3:str):bat[:bit] ", "BATPCREnotlike;", "" ]
-[ "batblob", "nitems", "command
batblob.nitems(X_1:bat[:blob]):bat[:int] ", "BLOBnitems_bulk;", "" ]
+[ "batblob", "nitems", "pattern
batblob.nitems(X_1:bat[:blob]):bat[:int] ", "BLOBnitems_bulk;", "" ]
+[ "batblob", "nitems", "pattern batblob.nitems(X_1:bat[:blob],
X_2:bat[:oid]):bat[:int] ", "BLOBnitems_bulk;", "" ]
[ "batcalc", "!=", "pattern batcalc.!=(X_1:any_1,
X_2:bat[:any_1]):bat[:bit] ", "CMDbatNE;", "" ]
[ "batcalc", "!=", "pattern batcalc.!=(X_1:any_1, X_2:bat[:any_1],
X_3:bat[:oid]):bat[:bit] ", "CMDbatNE;", "" ]
[ "batcalc", "!=", "pattern batcalc.!=(X_1:any_1, X_2:bat[:any_1],
X_3:bat[:oid], X_4:bit):bat[:bit] ", "CMDbatNE;", "" ]
@@ -11149,7 +11150,6 @@ stdout of test 'MAL-signatures` in direc
[ "calc", "iszero", "pattern calc.iszero(X_1:int):bit ",
"CMDvarISZERO;", "" ]
[ "calc", "iszero", "pattern calc.iszero(X_1:lng):bit ",
"CMDvarISZERO;", "" ]
[ "calc", "iszero", "pattern calc.iszero(X_1:sht):bit ",
"CMDvarISZERO;", "" ]
-[ "calc", "json", "command calc.json(X_1:json):json ",
"JSONstr2json;", "" ]
[ "calc", "json", "command calc.json(X_1:str):json ",
"JSONstr2json;", "" ]
[ "calc", "length", "command calc.length(X_1:str):int ",
"CMDstrlength;", "" ]
[ "calc", "lng", "pattern calc.lng(X_1:bit):lng ",
"CMDvarCONVERT;", "" ]
@@ -12112,10 +12112,7 @@ stdout of test 'MAL-signatures` in direc
[ "json", "fold", "pattern json.fold(X_1:bat[:str], X_2:bat[:any]):json
", "JSONfold;", "" ]
[ "json", "integer", "command json.integer(X_1:json):lng ",
"JSONjson2integer;", "" ]
[ "json", "isarray", "command json.isarray(X_1:json):bit ",
"JSONisarray;", "" ]
-[ "json", "isarray", "command json.isarray(X_1:str):bit ",
"JSONisarray;", "" ]
[ "json", "isobject", "command json.isobject(X_1:json):bit ",
"JSONisobject;", "" ]
-[ "json", "isobject", "command json.isobject(X_1:str):bit ",
"JSONisobject;", "" ]
-[ "json", "isvalid", "command json.isvalid(X_1:json):bit ",
"JSONisvalid;", "" ]
[ "json", "isvalid", "command json.isvalid(X_1:str):bit ",
"JSONisvalid;", "" ]
[ "json", "keyarray", "command json.keyarray(X_1:json):json ",
"JSONkeyArray;", "" ]
[ "json", "keys", "command json.keys(X_1:json):bat[:str] ",
"JSONkeyTable;", "" ]
diff --git a/monetdb5/modules/atoms/blob.c b/monetdb5/modules/atoms/blob.c
--- a/monetdb5/modules/atoms/blob.c
+++ b/monetdb5/modules/atoms/blob.c
@@ -31,6 +31,8 @@
*/
#include "monetdb_config.h"
#include "blob.h"
+#include "mal_client.h"
+#include "mal_interpreter.h"
int TYPE_blob;
@@ -168,58 +170,94 @@ BLOBput(Heap *h, var_t *bun, const void
return *bun;
}
-static inline int
-blob_nitems(blob *b)
-{
- if (is_blob_nil(b))
- return int_nil;
- assert(b->nitems <INT_MAX);
- return (int) b->nitems;
-}
-
static str
BLOBnitems(int *ret, blob **b)
{
- *ret = blob_nitems(*b);
+ if (is_blob_nil(*b)) {
+ *ret = int_nil;
+ } else {
+ assert((*b)->nitems < INT_MAX);
+ *ret = (int) (*b)->nitems;
+ }
return MAL_SUCCEED;
}
static str
-BLOBnitems_bulk(bat *ret, const bat *bid)
+BLOBnitems_bulk(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- BAT *b = NULL, *bn = NULL;
- BUN n, p, q;
- int *restrict dst;
+ BATiter bi;
+ BAT *bn = NULL, *b = NULL, *bs = NULL;
+ BUN q = 0;
+ int *restrict vals;
str msg = MAL_SUCCEED;
- BATiter bi;
+ bool nils = false;
+ struct canditer ci1 = {0};
+ oid off1;
+ bat *res = getArgReference_bat(stk, pci, 0), *bid =
getArgReference_bat(stk, pci, 1),
+ *sid1 = pci->argc == 3 ? getArgReference_bat(stk, pci, 2) :
NULL;
- if ((b = BATdescriptor(*bid)) == NULL) {
- msg = createException(MAL, "blob.nitems_bulk", SQLSTATE(HY002)
RUNTIME_OBJECT_MISSING);
+ (void) cntxt;
+ (void) mb;
+ if (!(b = BATdescriptor(*bid))) {
+ msg = createException(MAL, "blob.nitems_bulk", SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
goto bailout;
}
- n = BATcount(b);
- if ((bn = COLnew(b->hseqbase, TYPE_int, n, TRANSIENT)) == NULL) {
+ if (sid1 && !is_bat_nil(*sid1) && !(bs = BATdescriptor(*sid1))) {
+ msg = createException(MAL, "blob.nitems_bulk", SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
+ goto bailout;
+ }
+ q = canditer_init(&ci1, b, bs);
+ if (!(bn = COLnew(ci1.hseq, TYPE_int, q, TRANSIENT))) {
msg = createException(MAL, "blob.nitems_bulk", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
goto bailout;
}
- dst = Tloc(bn, 0);
+
+ off1 = b->hseqbase;
bi = bat_iterator(b);
- BATloop(b, p, q) {
- blob *restrict next = BUNtvar(bi, p);
- dst[p] = blob_nitems(next);
+ vals = Tloc(bn, 0);
+ if (ci1.tpe == cand_dense) {
+ for (BUN i = 0; i < q; i++) {
+ oid p1 = (canditer_next_dense(&ci1) - off1);
+ blob *b = (blob*) BUNtvar(bi, p1);
+
+ if (is_blob_nil(b)) {
+ vals[i] = int_nil;
+ nils = true;
+ } else {
+ assert((int) b->nitems < INT_MAX);
+ vals[i] = (int) b->nitems;
+ }
+ }
+ } else {
+ for (BUN i = 0; i < q; i++) {
+ oid p1 = (canditer_next(&ci1) - off1);
+ blob *b = (blob*) BUNtvar(bi, p1);
+
+ if (is_blob_nil(b)) {
+ vals[i] = int_nil;
+ nils = true;
+ } else {
+ assert((int) b->nitems < INT_MAX);
+ vals[i] = (int) b->nitems;
+ }
+ }
}
- bn->tnonil = b->tnonil;
- bn->tnil = b->tnil;
- BATsetcount(bn, n);
- bn->tsorted = bn->trevsorted = n < 2;
- bn->tkey = false;
+
bailout:
+ if (bn && !msg) {
+ BATsetcount(bn, q);
+ bn->tnil = nils;
+ bn->tnonil = !nils;
+ bn->tkey = BATcount(bn) <= 1;
+ bn->tsorted = BATcount(bn) <= 1;
+ bn->trevsorted = BATcount(bn) <= 1;
+ BBPkeepref(*res = bn->batCacheid);
+ } else if (bn)
+ BBPreclaim(bn);
if (b)
BBPunfix(b->batCacheid);
- if (msg && bn)
- BBPreclaim(bn);
- else if (bn)
- BBPkeepref(*ret = bn->batCacheid);
+ if (bs)
+ BBPunfix(bs->batCacheid);
return msg;
}
@@ -478,7 +516,8 @@ static mel_func blob_init_funcs[] = {
command("blob", "blob", BLOBblob_fromstr, false, "", args(1,2,
arg("",blob),arg("s",str))),
command("blob", "toblob", BLOBtoblob, false, "store a string as a blob.",
args(1,2, arg("",blob),arg("v",str))),
command("blob", "nitems", BLOBnitems, false, "get the number of bytes in this
blob.", args(1,2, arg("",int),arg("b",blob))),
- command("batblob", "nitems", BLOBnitems_bulk, false, "", args(1,2,
batarg("",int),batarg("b",blob))),
+ pattern("batblob", "nitems", BLOBnitems_bulk, false, "", args(1,2,
batarg("",int),batarg("b",blob))),
+ pattern("batblob", "nitems", BLOBnitems_bulk, false, "", args(1,3,
batarg("",int),batarg("b",blob),batarg("s",oid))),
command("blob", "prelude", BLOBprelude, false, "", args(1,1, arg("",void))),
command("calc", "blob", BLOBblob_blob, false, "", args(1,2,
arg("",blob),arg("b",blob))),
command("batcalc", "blob", BLOBblob_blob_bulk, false, "", args(1,3,
batarg("",blob),batarg("b",blob),batarg("s",oid))),
diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c
--- a/monetdb5/modules/atoms/json.c
+++ b/monetdb5/modules/atoms/json.c
@@ -400,7 +400,7 @@ JSONstr2json(json *ret, str *j)
}
static str
-JSONisvalid(bit *ret, json *j)
+JSONisvalid(bit *ret, str *j)
{
if (strNil(*j)) {
*ret = bit_nil;
@@ -918,17 +918,29 @@ JSONfractionParser(const char *j, const
static bool
JSONexponentParser(const char *j, const char **next) {
+ const char *s = j;
+ bool saw_digit = false;
+
if (*j != 'e' && *j != 'E') {
return false;
}
j++;
- if (*j == '-')
+ if (*j == '-' || *j == '+')
j++;
- for (; *j; j++)
+ for (; *j; j++) {
if (!isdigit((unsigned char)*j))
break;
+ saw_digit = true;
+ }
+
+
+ if (!saw_digit) {
+ j = s;
+ return false;
+ }
+
*next = j;
@@ -2708,7 +2720,6 @@ static mel_atom json_init_atoms[] = {
static mel_func json_init_funcs[] = {
command("json", "new", JSONstr2json, false, "Convert string to its JSON.
Dealing with escape characters", args(1,2, arg("",json),arg("j",str))),
command("calc", "json", JSONstr2json, false, "Convert string to its JSON.
Dealing with escape characters", args(1,2, arg("",json),arg("j",str))),
- command("calc", "json", JSONstr2json, false, "Convert JSON to JSON. Dealing
with escape characters", args(1,2, arg("",json),arg("j",json))),
command("json", "str", JSONjson2str, false, "Convert JSON to its string
equivalent. Dealing with escape characters", args(1,2,
arg("",str),arg("j",json))),
command("json", "text", JSONjson2text, false, "Convert JSON values to their
plain string equivalent.", args(1,2, arg("",str),arg("j",json))),
command("json", "text", JSONjson2textSeparator, false, "Convert JSON values
to their plain string equivalent, injecting a separator.", args(1,3,
arg("",str),arg("j",json),arg("s",str))),
@@ -2728,12 +2739,9 @@ static mel_func json_init_funcs[] = {
command("json", "filter", JSONfilterArray_hge, false, "", args(1,3,
arg("",json),arg("name",json),arg("idx",hge))),
command("json", "filter", JSONfilterArrayDefault_hge, false, "Extract a
single array element", args(1,4,
arg("",json),arg("name",json),arg("idx",hge),arg("other",str))),
#endif
- command("json", "isvalid", JSONisvalid, false, "Validate the string as a
valid JSON document", args(1,2, arg("",bit),arg("val",json))),
command("json", "isobject", JSONisobject, false, "Validate the string as a
valid JSON object", args(1,2, arg("",bit),arg("val",json))),
command("json", "isarray", JSONisarray, false, "Validate the string as a
valid JSON array", args(1,2, arg("",bit),arg("val",json))),
command("json", "isvalid", JSONisvalid, false, "Validate the string as a
valid JSON document", args(1,2, arg("",bit),arg("val",str))),
- command("json", "isobject", JSONisobject, false, "Validate the string as a
valid JSON object", args(1,2, arg("",bit),arg("val",str))),
- command("json", "isarray", JSONisarray, false, "Validate the string as a
valid JSON array", args(1,2, arg("",bit),arg("val",str))),
command("json", "length", JSONlength, false, "Returns the number of elements
in the outermost JSON object.", args(1,2, arg("",int),arg("val",json))),
pattern("json", "unfold", JSONunfold, false, "Expands the outermost JSON
object into key-value pairs.", args(2,3,
batarg("k",str),batarg("v",json),arg("val",json))),
pattern("json", "unfold", JSONunfold, false, "Expands the outermost JSON
object into key-value pairs.", args(3,4,
batarg("o",oid),batarg("k",str),batarg("v",json),arg("val",json))),
diff --git a/monetdb5/modules/atoms/json.mal b/monetdb5/modules/atoms/json.mal
--- a/monetdb5/modules/atoms/json.mal
+++ b/monetdb5/modules/atoms/json.mal
@@ -22,10 +22,6 @@ command calc.json(j:str):json
address JSONstr2json
comment "Convert string to its JSON. Dealing with escape characters";
-command calc.json(j:json):json
-address JSONstr2json
-comment "Convert JSON to JSON. Dealing with escape characters";
-
command str(j:json):str
address JSONjson2str
comment "Convert JSON to its string equivalent. Dealing with escape
characters";
@@ -72,10 +68,6 @@ command filter(name:json, idx:lng, other
address JSONfilterArrayDefault_lng
comment "Extract a single array element";
-command isvalid(val:json):bit
-address JSONisvalid
-comment "Validate the string as a valid JSON document";
-
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list