Changeset: 81c0d61bcc04 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=81c0d61bcc04 Added Files: sql/test/BugTracker-2013/Tests/decimal-cast.Bug-3310.sql sql/test/BugTracker-2013/Tests/decimal-cast.Bug-3310.stable.err sql/test/BugTracker-2013/Tests/decimal-cast.Bug-3310.stable.out Modified Files: clients/mapiclient/dump.c clients/mapiclient/mclient.c gdk/gdk.h gdk/gdk_bbp.c monetdb5/modules/atoms/json_atom.c monetdb5/modules/mal/Tests/remote03.stable.out sql/backends/monet5/sql.mx sql/test/BugTracker-2013/Tests/All sql/test/json/Tests/parsing.stable.err sql/test/json/Tests/parsing.stable.out Branch: default Log Message:
merging diffs (truncated from 2738 to 300 lines): diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -1105,7 +1105,8 @@ dump_table_data(Mapi mid, char *schema, string[i] = 0; if (strcmp(mapi_get_type(hdl, i), "char") == 0 || strcmp(mapi_get_type(hdl, i), "varchar") == 0 || - strcmp(mapi_get_type(hdl, i), "clob") == 0) { + strcmp(mapi_get_type(hdl, i), "clob") == 0 || + strcmp(mapi_get_type(hdl, i), "json") == 0) { string[i] = 1; } } diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c --- a/clients/mapiclient/mclient.c +++ b/clients/mapiclient/mclient.c @@ -906,6 +906,7 @@ TESTrenderer(MapiHdl hdl) strcmp(tp, "char") == 0 || strcmp(tp, "clob") == 0 || strcmp(tp, "str") == 0 || + strcmp(tp, "json") == 0 || /* NULL byte in string? */ strlen(s) < l || /* start or end with white space? */ @@ -1121,7 +1122,8 @@ SQLrenderer(MapiHdl hdl, char singleinst (strcmp(s, "varchar") != 0 && strcmp(s, "clob") != 0 && strcmp(s, "char") != 0 && - strcmp(s, "str") != 0))) { + strcmp(s, "str") != 0 && + strcmp(s, "json") != 0))) { /* no table width known, use maximum, rely on * squeezing later on to fix it to whatever is * available; note that for a column type of diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -1398,15 +1398,15 @@ typedef var_t stridx_t; /* TODO: should #if SIZEOF_VAR_T == 8 #define VarHeapValRaw(b,p,w) \ - ((w)==1 ? (var_t)*((unsigned char *)(b)+(p))+GDK_VAROFFSET : \ - ((w)==2 ? (var_t)*((unsigned short *)(b)+(p))+GDK_VAROFFSET : \ - ((w)==4 ? (var_t)*((unsigned int *)(b)+(p)) : \ - *((var_t *)(b)+(p))))) + ((w) == 1 ? (var_t) ((unsigned char *) (b))[p] + GDK_VAROFFSET : \ + (w) == 2 ? (var_t) ((unsigned short *) (b))[p] + GDK_VAROFFSET : \ + (w) == 4 ? (var_t) ((unsigned int *) (b))[p] : \ + ((var_t *) (b))[p]) #else #define VarHeapValRaw(b,p,w) \ - ((w)==1 ? (var_t)*((unsigned char *)(b)+(p))+GDK_VAROFFSET : \ - ((w)==2 ? (var_t)*((unsigned short *)(b)+(p))+GDK_VAROFFSET : \ - *((var_t *)(b)+(p)))) + ((w) == 1 ? (var_t) ((unsigned char *) (b))[p] + GDK_VAROFFSET : \ + (w) == 2 ? (var_t) ((unsigned short *) (b))[p] + GDK_VAROFFSET : \ + ((var_t *) (b))[p]) #endif #define VarHeapVal(b,p,w) ((size_t) VarHeapValRaw(b,p,w) << GDK_VARSHIFT) #define BUNhvaroff(bi,p) VarHeapVal((bi).b->H->heap.base, (p), (bi).b->H->width) diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -1434,14 +1434,14 @@ BBPdump(void) HEAPvmsize(&b->H->heap), HEAPmemsize(b->H->vheap), HEAPvmsize(b->H->vheap), - b->H->hash ? HEAPmemsize(b->H->hash->heap) : 0, - b->H->hash ? HEAPvmsize(b->H->hash->heap) : 0, + b->H->hash && b->H->hash != (Hash *) -1 ? HEAPmemsize(b->H->hash->heap) : 0, + b->H->hash && b->H->hash != (Hash *) -1 ? HEAPvmsize(b->H->hash->heap) : 0, HEAPmemsize(&b->T->heap), HEAPvmsize(&b->T->heap), HEAPmemsize(b->T->vheap), HEAPvmsize(b->T->vheap), - b->T->hash ? HEAPmemsize(b->T->hash->heap) : 0, - b->T->hash ? HEAPvmsize(b->T->hash->heap) : 0); + b->T->hash && b->T->hash != (Hash *) -1 ? HEAPmemsize(b->T->hash->heap) : 0, + b->T->hash && b->T->hash != (Hash *) -1 ? HEAPvmsize(b->T->hash->heap) : 0); if (BBP_logical(i) && BBP_logical(i)[0] == '.') { cmem += HEAPmemsize(&b->H->heap); cvm += HEAPvmsize(&b->H->heap); @@ -1460,7 +1460,7 @@ BBPdump(void) vm += HEAPvmsize(b->H->vheap); } } - if (b->H->hash) { + if (b->H->hash && b->H->hash != (Hash *) -1) { if (BBP_logical(i) && BBP_logical(i)[0] == '.') { cmem += HEAPmemsize(b->H->hash->heap); cvm += HEAPvmsize(b->H->hash->heap); @@ -1485,7 +1485,7 @@ BBPdump(void) vm += HEAPvmsize(b->T->vheap); } } - if (b->T->hash) { + if (b->T->hash && b->T->hash != (Hash *) -1) { if (BBP_logical(i) && BBP_logical(i)[0] == '.') { cmem += HEAPmemsize(b->T->hash->heap); cvm += HEAPvmsize(b->T->hash->heap); diff --git a/monetdb5/modules/atoms/json_atom.c b/monetdb5/modules/atoms/json_atom.c --- a/monetdb5/modules/atoms/json_atom.c +++ b/monetdb5/modules/atoms/json_atom.c @@ -37,55 +37,58 @@ int TYPE_json; static str JSONparse(char *j); -int JSONfromString(str src, int *len, json *j) +int +JSONfromString(str src, int *len, json *j) { - size_t ll; - - if (*j !=0) - GDKfree(*j); - - ll = strlen(src); - assert(ll <= (size_t) INT_MAX); - *len = (int) ll; - *j = GDKstrdup(src); - - return *len; + ssize_t slen = (ssize_t) strlen(src); + if ((ssize_t) *len < slen) + *j = GDKrealloc(*j, slen + 1); + *len = (int) slen; + if (GDKstrFromStr((unsigned char *) *j, (const unsigned char *) src, slen) < 0) { + GDKfree(*j); + *j = GDKstrdup(str_nil); + *len = 2; + return 0; + } + return *len; } -int JSONtoString(str *s, int *len, json src) +int +JSONtoString(str *s, int *len, json src) { - size_t ll; - int l,cnt=0; + size_t ll; + int l, cnt = 0; char *c, *dst; - if (GDK_STRNIL(src)) { - *s = GDKstrdup("null"); - return 0; - } - for (c =src; *c; c++) - switch(*c){ + if (GDK_STRNIL(src)) { + *s = GDKstrdup("null"); + return 0; + } + for (c = src; *c; c++) + switch (*c) { case '"': case '\\': case '\n': cnt++; } - ll = strlen(src); - assert(ll <= (size_t) INT_MAX); - l = (int) ll + cnt+3; + ll = strlen(src); + assert(ll <= (size_t) INT_MAX); + l = (int) ll + cnt + 3; - if (l >= *len) { - GDKfree(*s); - *s = (str) GDKmalloc(l); - if (*s == NULL) - return 0; - } + if (l >= *len) { + GDKfree(*s); + *s = (str) GDKmalloc(l); + if (*s == NULL) + return 0; + } dst = *s; *dst++ = '"'; - for (c =src; *c; c++) - switch(*c){ + for (c = src; *c; c++) + switch (*c) { case '"': case '\\': *dst++ = '\\'; + /* fall through */ default: *dst++ = *c; break; @@ -96,27 +99,29 @@ int JSONtoString(str *s, int *len, json } *dst++ = '"'; *dst = 0; - *len = l-1; - return *len; + *len = l - 1; + return *len; } -str JSONjson2str(str *ret, json *j) +str +JSONjson2str(str *ret, json *j) { char *s = *j; if (*s == '"') s++; s = GDKstrdup(s); - if ( s[strlen(s)-1] == '"') - s[strlen(s)-1] =0; + if (s[strlen(s) - 1] == '"') + s[strlen(s) - 1] = 0; *ret = s; return MAL_SUCCEED; } -str JSONstr2json(str *ret, json *j) +str +JSONstr2json(str *ret, json *j) { str msg = JSONparse(*j); - if ( msg){ + if (msg) { *ret = 0; return msg; } @@ -124,38 +129,45 @@ str JSONstr2json(str *ret, json *j) return MAL_SUCCEED; } -str JSONisvalid(int *ret, json *j) +str +JSONisvalid(int *ret, json *j) { str msg = JSONparse(*j); *ret = 1; - if ( msg){ + if (msg) { *ret = 0; GDKfree(msg); } return MAL_SUCCEED; } -str JSONisobject(int *ret, json *j) +str +JSONisobject(int *ret, json *j) { char *s; - for( s= *j; *s; s++) - if ( *s !=' ' && *s != '\n' && *s != '\t') break; + for (s = *j; *s; s++) + if (*s != ' ' && *s != '\n' && *s != '\t') + break; - *ret = *s =='{'; - return MAL_SUCCEED; -} -str JSONisarray(int *ret, json *j) -{ - char *s; - for( s= *j; *s; s++) - if ( *s !=' ' && *s != '\n' && *s != '\t') break; - - *ret = *s =='['; + *ret = *s == '{'; return MAL_SUCCEED; } -str JSONprelude(int *ret) +str +JSONisarray(int *ret, json *j) +{ + char *s; + for (s = *j; *s; s++) + if (*s != ' ' && *s != '\n' && *s != '\t') + break; + + *ret = *s == '['; + return MAL_SUCCEED; +} + +str +JSONprelude(int *ret) { (void) ret; TYPE_json = ATOMindex("json"); @@ -168,58 +180,71 @@ static str JSONarrayParser(char *j, char static str JSONstringParser(char *j, char **next) { - for(j++;*j; j++) - switch(*j){ - case '\\': _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list