Changeset: ca65cdd81f29 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ca65cdd81f29
Modified Files:
        monetdb5/modules/atoms/json.c
        monetdb5/modules/atoms/str.c
        sql/backends/monet5/sql_optimizer.c
        sql/storage/bat/bat_storage.c
        sql/test/SQLancer/Tests/sqlancer03.sql
        sql/test/SQLancer/Tests/sqlancer03.stable.out
        testing/Mtest.py.in
Branch: oscar
Log Message:

Merge with Jun2020 branch.


diffs (truncated from 466 to 300 lines):

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
@@ -1223,7 +1223,7 @@ JSONplaintext(char **r, size_t *l, size_
                break;
        default:
                if (*l < jt->elm[idx].valuelen + sep_len + 1) {
-                       unsigned int offset = *ilen - *l;
+                       size_t offset = *ilen - *l;
                        char *p = *r - offset;
                        *ilen *= 2;
                        *r = GDKrealloc(p, *ilen);
@@ -1249,39 +1249,21 @@ JSONplaintext(char **r, size_t *l, size_
 static str
 JSONjson2text(str *ret, json *js)
 {
-       JSON *jt;
-       size_t l, ilen;
-       str s;
-
-       jt = JSONparse(*js);
-
-       CHECK_JSON(jt);
-       ilen = l = strlen(*js) + 1;
-       s = GDKmalloc(l);
-       if(s == NULL) {
-               JSONfree(jt);
-               throw(MAL,"json2txt", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-       }
-       s = JSONplaintext(&s, &l, &ilen, jt, 0, " ", 1);
-       s -= ilen - l;
-       l = strlen(s);
-       if (l)
-               s[l - 1] = 0;
-       *ret = s;
-       JSONfree(jt);
-       return MAL_SUCCEED;
+       char *sep = " ";
+       return JSONjson2textSeparator(ret, js, &sep);
 }
 
 static str
 JSONjson2textSeparator(str *ret, json *js, str *sep)
 {
        JSON *jt;
-       size_t l, ilen, sep_len = strlen(*sep);
+       size_t l, ilen, sep_len;
        str s;
 
        jt = JSONparse(*js);
 
        CHECK_JSON(jt);
+       sep_len = strlen(*sep);
        ilen = l = strlen(*js) + 1;
        s = GDKmalloc(l);
        if(s == NULL) {
diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c
--- a/monetdb5/modules/atoms/str.c
+++ b/monetdb5/modules/atoms/str.c
@@ -3156,6 +3156,59 @@ UTF8_strtail(const char *s, int pos)
        return (str) s;
 }
 
+static inline str
+UTF8_strncpy(char *restrict dst, const char *restrict s, int n)
+{
+       UTF8_assert(s);
+       while (*s && n) {
+               if ((*s & 0xF8) == 0xF0) {
+                       /* 4 byte UTF-8 sequence */
+                       *dst++ = *s++;
+                       *dst++ = *s++;
+                       *dst++ = *s++;
+                       *dst++ = *s++;
+               } else if ((*s & 0xF0) == 0xE0) {
+                       /* 3 byte UTF-8 sequence */
+                       *dst++ = *s++;
+                       *dst++ = *s++;
+                       *dst++ = *s++;
+               } else if ((*s & 0xE0) == 0xC0) {
+                       /* 2 byte UTF-8 sequence */
+                       *dst++ = *s++;
+                       *dst++ = *s++;
+               } else {
+                       /* 1 byte UTF-8 "sequence" */
+                       *dst++ = *s++;
+               }
+               n--;
+       }
+       *dst = '\0';
+       return dst;
+}
+
+static inline str
+UTF8_offset(char *restrict s, int n)
+{
+       UTF8_assert(s);
+       while (*s && n) {
+               if ((*s & 0xF8) == 0xF0) {
+                       /* 4 byte UTF-8 sequence */
+                       s += 4;
+               } else if ((*s & 0xF0) == 0xE0) {
+                       /* 3 byte UTF-8 sequence */
+                       s += 3;
+               } else if ((*s & 0xE0) == 0xC0) {
+                       /* 2 byte UTF-8 sequence */
+                       s += 2;
+               } else {
+                       /* 1 byte UTF-8 "sequence" */
+                       s++;
+               }
+               n--;
+       }
+       return s;
+}
+
 static str
 convertCase(BAT *from, BAT *to, str *res, const char *src, const char *malfunc)
 {
@@ -4120,20 +4173,18 @@ STRlocate(int *ret, const str *needle, c
 }
 
 str
-STRinsert(str *ret, const str *s, const int *start, const int *l, const str 
*s2)
+STRinsert(str *ret, const str *input, const int *start, const int *nchars, 
const str *input2)
 {
-       str v;
-       int strt = *start;
-       if (strNil(*s) || strNil(*s2) || is_int_nil(*start) || is_int_nil(*l)) {
+       str v, s = *input, s2 = *input2;
+       int strt = *start, l = *nchars;
+
+       if (strNil(s) || strNil(s2) || is_int_nil(strt) || is_int_nil(l)) {
                if ((*ret = GDKstrdup(str_nil)) == NULL)
                        throw(MAL, "str.insert", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
        } else {
-               size_t l1 = strlen(*s);
-               size_t l2 = strlen(*s2);
+               size_t l1 = UTF8_strlen(s);
 
-               if (l1 + l2 + 1 >= INT_MAX)
-                       throw(MAL, "str.insert", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
-               if (*l < 0)
+               if (l < 0)
                        throw(MAL, "str.insert", SQLSTATE(42000) "The number of 
characters for insert function must be non negative");
                if (strt < 0) {
                        if ((size_t) -strt <= l1)
@@ -4143,15 +4194,14 @@ STRinsert(str *ret, const str *s, const 
                }
                if ((size_t) strt > l1)
                        strt = (int) l1;
-               v = *ret = GDKmalloc(strlen(*s) + strlen(*s2) + 1);
+               v = *ret = GDKmalloc(strlen(s) + strlen(s2) + 1);
                if (v == NULL)
                        throw(MAL, "str.insert", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                if (strt > 0)
-                       strncpy(v, *s, strt);
-               v[strt] = 0;
-               strcpy(v + strt, *s2);
-               if (strt + *l < (int) l1)
-                       strcat(v, *s + strt + *l);
+                       v = UTF8_strncpy(v, s, strt);
+               strcpy(v, s2);
+               if (strt + l < (int) l1)
+                       strcat(v, UTF8_offset(s, strt + l));
        }
        return MAL_SUCCEED;
 }
diff --git a/sql/backends/monet5/sql_optimizer.c 
b/sql/backends/monet5/sql_optimizer.c
--- a/sql/backends/monet5/sql_optimizer.c
+++ b/sql/backends/monet5/sql_optimizer.c
@@ -30,6 +30,7 @@ SQLgetColumnSize(sql_trans *tr, sql_colu
 {
        lng size = 0;
        BAT *b;
+       store_lock();
        switch(access){
        case 0:
                b= store_funcs.bind_col(tr, c, RDONLY);
@@ -57,6 +58,7 @@ SQLgetColumnSize(sql_trans *tr, sql_colu
                        BBPunfix(b->batCacheid);
                }
        }
+       store_unlock();
        return size;
 }
 
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -1084,7 +1084,7 @@ count_col(sql_trans *tr, sql_column *c, 
                sql_column *oc = tr_find_column(tr->parent, c);
                c->data = timestamp_delta(oc->data, c->base.stime);
        }
-        b = c->data;
+       b = c->data;
        if (!b)
                return 1;
        if (all)
@@ -1890,8 +1890,11 @@ delayed_destroy_dbat(sql_dbat *b)
        if (!n)
                return LOG_OK;
        MT_lock_set(&destroy_lock);
-       while(n->next)
+       assert(n->r.refcnt == 1);
+       while(n->next) {
+               assert(n->r.refcnt == 1);
                n = n->next;
+       }
        n->next = tobe_destroyed_dbat;
        tobe_destroyed_dbat = b;
        MT_lock_unset(&destroy_lock);
@@ -2676,6 +2679,7 @@ update_table(sql_trans *tr, sql_table *f
                        if (!tt->data)
                                tt->base.allocated = ft->base.allocated;
                        ft->data = NULL;
+                       assert(!b->next);
                        b->next = tt->data;
                        tt->data = b;
 
@@ -2729,6 +2733,7 @@ update_table(sql_trans *tr, sql_table *f
                                if (!oc->data)
                                        oc->base.allocated = cc->base.allocated;
                                cc->data = NULL;
+                               assert(!b->next);
                                b->next = oc->data;
                                oc->data = b;
                                tr_handle_snapshot(tr, b);
@@ -2817,6 +2822,7 @@ update_table(sql_trans *tr, sql_table *f
                                        if (!oi->data)
                                                oi->base.allocated = 
ci->base.allocated;
                                        ci->data = NULL;
+                                       assert(!b->next);
                                        b->next = oi->data;
                                        oi->data = b;
                                        tr_handle_snapshot(tr, b);
@@ -2871,6 +2877,7 @@ update_table(sql_trans *tr, sql_table *f
        if (ft->data)
                destroy_del(tr, ft);
        ft->base.allocated = 0;
+       ft->data = NULL;
        return ok;
 }
 
diff --git a/sql/test/SQLancer/Tests/sqlancer03.sql 
b/sql/test/SQLancer/Tests/sqlancer03.sql
--- a/sql/test/SQLancer/Tests/sqlancer03.sql
+++ b/sql/test/SQLancer/Tests/sqlancer03.sql
@@ -24,3 +24,104 @@ SELECT sql_min(sql_max(NULL, ''), '');
 SELECT ALL length(upper(MIN(ALL CAST(((trim(CAST(r'' AS STRING(659)), 
CAST(r'o3%+i]抔DCöf▟nßOpNbybಜ7' AS STRING)))||(sql_min(sql_max(NULL, r''), 
splitpart(r'x', r',7+.', t0.c1)))) AS STRING(151))))), 0.4179268710155164 
 FROM v0 LEFT OUTER JOIN t0 ON NOT (t0.c0) WHERE t0.c0 GROUP BY 0.3584962, 
CAST(t0.c1 AS STRING(601)), t0.c1;
 ROLLBACK;
+
+START TRANSACTION; -- Bug 6919
+CREATE TABLE "sys"."t0" (
+       "c0" INTEGER       NOT NULL,
+       "c1" DOUBLE,
+       CONSTRAINT "t0_c0_pkey" PRIMARY KEY ("c0")
+);
+COPY 29 RECORDS INTO "sys"."t0" FROM stdin USING DELIMITERS E'\t',E'\n','"';
+6      0.01926179604972278
+7      0.01926179604972278
+8      0.01926179604972278
+9      0.01926179604972278
+10     0.01926179604972278
+11     0.01926179604972278
+12     0.01926179604972278
+13     0.01926179604972278
+14     0.01926179604972278
+15     0.01926179604972278
+16     0.01926179604972278
+17     0.01926179604972278
+954233931      0.01926179604972278
+-890980732     0.01926179604972278
+18     0.9441921149477416
+19     0.8647722974466762
+20     0.6303259287607281
+21     0.7198562388857971
+22     1905034025
+1927464158     0.827299544139285
+421223489      0.03854140660184213
+-906851618     0.01926179604972278
+23     0.44641096314987394
+24     0.5358519423727929
+25     0.8490801972106654
+911090097      1
+-708085857     0.7843275143974144
+26     1130231849
+27     0.1052118441396751
+
+select "insert"('屁{珙', 1, 1, '1'), "insert"('屁{珙', 1, 1, '抔'), "insert"('屁抔珙', 
1, 1, 'ಜ'), "insert"('a', 0, 1, 'ಜ'), "insert"('a', 0, 0, 'ಜ');
+select "insert"('屁{珙', 1, 1, '1'), "insert"('屁{珙', 1, 1, '抔'), "insert"('屁抔珙', 
1, 1, 'ಜ') from t0;
+ROLLBACK;
+
+CREATE TABLE t0(c0 boolean, c1 boolean, c2 serial, UNIQUE(c0, c1)); -- Bug 6920
+INSERT INTO t0(c1) VALUES((0.5968066098520423) NOT  BETWEEN SYMMETRIC 
(CAST(length(upper(r'z')) AS INT)) AND (1347145665)), (FALSE);
+INSERT INTO t0(c0) VALUES(TRUE);
+INSERT INTO t0(c1) VALUES(FALSE), (TRUE);
+INSERT INTO t0(c2, c0, c1) VALUES(1347145665, (ltrim(lower(r'K'), 
((upper(r'296348087'))||(- (1582370739))))) IS NOT NULL, (((lower(r'ö
+eg#K,纗HSJw!{cOw⇒l/l!B*H'))||(((CAST(0.12411368110083143 AS 
INT))+(-1795901173))))) IN (lower(CAST(TRUE AS STRING)))), (-1795901173, NULL, 
(0.9575114678279173) NOT IN (2.96348087E8, 0.5010777753365665)), (1922411524, 
TRUE, (0.5020325273627405) NOT IN (-1388966352, 1163825182));
+INSERT INTO t0(c1) VALUES(TRUE);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to