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

Reply via email to