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