MonetDB: default - Plug the holes
Changeset: 4615a9380486 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4615a9380486 Modified Files: sql/backends/monet5/sql_result.c Branch: default Log Message: Plug the holes diffs (97 lines): diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c --- a/sql/backends/monet5/sql_result.c +++ b/sql/backends/monet5/sql_result.c @@ -934,10 +934,13 @@ mvc_export_prepare_columnar(stream *out, BAT* bschema= COLnew(0, TYPE_str, nrows, TRANSIENT); BAT* btable = COLnew(0, TYPE_str, nrows, TRANSIENT); BAT* bcolumn= COLnew(0, TYPE_str, nrows, TRANSIENT); - node *n; sql_subtype *t; sql_arg *a; + + if (!btype || !bdigits || !bscale || !bschema || !btable || !bcolumn) + goto bailout; + if (r && is_project(r->op) && r->exps) { for (n = r->exps->h; n; n = n->next) { const char *name, *rname, *schema = NULL; @@ -1095,9 +1098,10 @@ mvc_export_prepare(backend *b, stream *o } if (b->client->protocol == PROTOCOL_COLUMNAR) { - if (mnstr_flush(out, MNSTR_FLUSH_DATA) < 0) return -1; - mvc_export_prepare_columnar(out, q, nrows, r); - + if (mnstr_flush(out, MNSTR_FLUSH_DATA) < 0) + return -1; + if (mvc_export_prepare_columnar(out, q, nrows, r) < 0) + return -1; } else { if (r && is_project(r->op) && r->exps) { @@ -1384,11 +1388,9 @@ mvc_export_row(backend *b, stream *s, re } static int -mvc_export_table_columnar(stream *s, res_table *t, BAT *order) { +mvc_export_table_columnar(stream *s, res_table *t) { int i; - (void) order; - if (!t) return -1; if (!s) @@ -1400,12 +1402,9 @@ mvc_export_table_columnar(stream *s, res if (!c->b) break; - BAT* b = BATdescriptor(c->b); - if (b == NULL) { - while (--i >= 1) - BBPunfix(b->batCacheid); + BAT *b = BATdescriptor(c->b); + if (b == NULL) return -1; - } mvc_export_binary_bat(s, b); @@ -1979,26 +1978,29 @@ mvc_export_result(backend *b, stream *s, if (t->tsep) { if (header) { /* need header */ - mvc_export_head(b, s, t->id, TRUE, TRUE, starttime, maloptimizer); + if (mvc_export_head(b, s, t->id, TRUE, TRUE, starttime, maloptimizer) < 0) + return -1; } return mvc_export_file(b, s, t); } if (!json) { - mvc_export_head(b, s, res_id, TRUE, TRUE, starttime, maloptimizer); + if (mvc_export_head(b, s, res_id, TRUE, TRUE, starttime, maloptimizer) < 0) + return -1; } assert(t->order); + if (b->client->protocol == PROTOCOL_COLUMNAR) { + if (mnstr_flush(s, MNSTR_FLUSH_DATA) < 0) + return -1; + return mvc_export_table_columnar(s, t); + } + order = BATdescriptor(t->order); if (!order) return -1; - if (b->client->protocol == PROTOCOL_COLUMNAR) { - if (mnstr_flush(s, MNSTR_FLUSH_DATA) < 0) return -1; - return mvc_export_table_columnar(s, t, order); - } - count = m->reply_size; if (m->reply_size != -2 && (count <= 0 || count >= t->nr_rows)) { count = t->nr_rows; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Get this to compile for 32 bit Windows on Win...
Changeset: 50982ad585c5 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=50982ad585c5 Modified Files: common/utils/matomic.h Branch: default Log Message: Get this to compile for 32 bit Windows on Windows 7 with VS 2017. diffs (38 lines): diff --git a/common/utils/matomic.h b/common/utils/matomic.h --- a/common/utils/matomic.h +++ b/common/utils/matomic.h @@ -175,6 +175,7 @@ ATOMIC_CAS(ATOMIC_TYPE *var, ATOMIC_BASE #define ATOMIC_INIT(var, val) (*(var) = (val)) #define ATOMIC_DESTROY(var)((void) 0) +#ifdef DECLSPEC_NOINITALL #define ATOMIC_GET(var) _InlineInterlockedExchangeAdd64(var, 0) #define ATOMIC_SET(var, val) _InlineInterlockedExchange64(var, (ATOMIC_BASE_TYPE) (val)) #define ATOMIC_XCG(var, val) _InlineInterlockedExchange64(var, (ATOMIC_BASE_TYPE) (val)) @@ -193,6 +194,26 @@ ATOMIC_CAS(ATOMIC_TYPE *var, ATOMIC_BASE #define ATOMIC_SUB(var, val) _InlineInterlockedExchangeAdd64(var, -(ATOMIC_BASE_TYPE) (val)) #define ATOMIC_INC(var)_InlineInterlockedIncrement64(var) #define ATOMIC_DEC(var)_InlineInterlockedDecrement64(var) +#else +#define ATOMIC_GET(var)_InterlockedExchangeAdd64(var, 0) +#define ATOMIC_SET(var, val) _InterlockedExchange64(var, (ATOMIC_BASE_TYPE) (val)) +#define ATOMIC_XCG(var, val) _InterlockedExchange64(var, (ATOMIC_BASE_TYPE) (val)) +static inline bool +ATOMIC_CAS(ATOMIC_TYPE *var, ATOMIC_BASE_TYPE *exp, ATOMIC_BASE_TYPE des) +{ + ATOMIC_BASE_TYPE old; + old = _InterlockedCompareExchange64(var, des, *exp); + if (old == *exp) + return true; + *exp = old; + return false; +} +#define ATOMIC_CAS(var, exp, des) ATOMIC_CAS(var, exp, (ATOMIC_BASE_TYPE) (des)) +#define ATOMIC_ADD(var, val) _InterlockedExchangeAdd64(var, (ATOMIC_BASE_TYPE) (val)) +#define ATOMIC_SUB(var, val) _InterlockedExchangeAdd64(var, -(ATOMIC_BASE_TYPE) (val)) +#define ATOMIC_INC(var)_InterlockedIncrement64(var) +#define ATOMIC_DEC(var)_InterlockedDecrement64(var) +#endif #endif ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Another merge, sorry for the incovenience
Changeset: 340698edbfb6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=340698edbfb6 Modified Files: sql/server/rel_unnest.c Branch: default Log Message: Another merge, sorry for the incovenience diffs (31 lines): diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -3409,25 +3409,8 @@ rewrite_values(visitor *v, sql_rel *rel) if (rel_is_ref(rel)) { /* need extra project */ rel->l = rel_project(v->sql->sa, rel->l, rel->exps); rel->exps = rel_projections(v->sql, rel->l, NULL, 1, 1); - if (!list_empty(rel->r)) { /* propagate order by exps */ - list *nexps = sa_list(v->sql->sa); - for (node *en = ((list*)rel->r)->h; en; en = en->next) { - sql_exp *e = en->data, *ne = exps_find_exp(((sql_rel*)rel->l)->exps, e); - - assert(ne); - ne = exp_ref(v->sql, ne); - if (is_ascending(e)) - set_ascending(ne); - else - set_descending(ne); - if (nulls_last(e)) - set_nulls_last(ne); - else - set_nulls_first(ne); - list_append(nexps, ne); - } - rel->r = nexps; - } + ((sql_rel*)rel->l)->r = rel->r; /* propagate order by exps */ + rel->r = NULL; return rel; } sql_exp *e = rel->exps->h->data; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Oct2020 - Better solution, avoid copying
Changeset: fee6e762c7d3 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fee6e762c7d3 Modified Files: sql/server/rel_unnest.c Branch: Oct2020 Log Message: Better solution, avoid copying diffs (31 lines): diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -3270,25 +3270,8 @@ rewrite_values(visitor *v, sql_rel *rel) if (rel_is_ref(rel)) { /* need extra project */ rel->l = rel_project(v->sql->sa, rel->l, rel->exps); rel->exps = rel_projections(v->sql, rel->l, NULL, 1, 1); - if (!list_empty(rel->r)) { /* propagate order by exps */ - list *nexps = sa_list(v->sql->sa); - for (node *en = ((list*)rel->r)->h; en; en = en->next) { - sql_exp *e = en->data, *ne = exps_find_exp(((sql_rel*)rel->l)->exps, e); - - assert(ne); - ne = exp_ref(v->sql, ne); - if (is_ascending(e)) - set_ascending(ne); - else - set_descending(ne); - if (nulls_last(e)) - set_nulls_last(ne); - else - set_nulls_first(ne); - list_append(nexps, ne); - } - rel->r = nexps; - } + ((sql_rel*)rel->l)->r = rel->r; /* propagate order by exps */ + rel->r = NULL; return rel; } sql_exp *e = rel->exps->h->data; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Merged with Oct2020
Changeset: c08c6c533e87 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c08c6c533e87 Modified Files: sql/server/rel_unnest.c Branch: default Log Message: Merged with Oct2020 diffs (29 lines): diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -3409,6 +3409,25 @@ rewrite_values(visitor *v, sql_rel *rel) if (rel_is_ref(rel)) { /* need extra project */ rel->l = rel_project(v->sql->sa, rel->l, rel->exps); rel->exps = rel_projections(v->sql, rel->l, NULL, 1, 1); + if (!list_empty(rel->r)) { /* propagate order by exps */ + list *nexps = sa_list(v->sql->sa); + for (node *en = ((list*)rel->r)->h; en; en = en->next) { + sql_exp *e = en->data, *ne = exps_find_exp(((sql_rel*)rel->l)->exps, e); + + assert(ne); + ne = exp_ref(v->sql, ne); + if (is_ascending(e)) + set_ascending(ne); + else + set_descending(ne); + if (nulls_last(e)) + set_nulls_last(ne); + else + set_nulls_first(ne); + list_append(nexps, ne); + } + rel->r = nexps; + } return rel; } sql_exp *e = rel->exps->h->data; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Oct2020 - Fix for sql_dump test on default, ie don't fo...
Changeset: e89938ab6c1a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e89938ab6c1a Modified Files: sql/server/rel_unnest.c Branch: Oct2020 Log Message: Fix for sql_dump test on default, ie don't forget to propagate order by columns at rewrite_values diffs (29 lines): diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -3270,6 +3270,25 @@ rewrite_values(visitor *v, sql_rel *rel) if (rel_is_ref(rel)) { /* need extra project */ rel->l = rel_project(v->sql->sa, rel->l, rel->exps); rel->exps = rel_projections(v->sql, rel->l, NULL, 1, 1); + if (!list_empty(rel->r)) { /* propagate order by exps */ + list *nexps = sa_list(v->sql->sa); + for (node *en = ((list*)rel->r)->h; en; en = en->next) { + sql_exp *e = en->data, *ne = exps_find_exp(((sql_rel*)rel->l)->exps, e); + + assert(ne); + ne = exp_ref(v->sql, ne); + if (is_ascending(e)) + set_ascending(ne); + else + set_descending(ne); + if (nulls_last(e)) + set_nulls_last(ne); + else + set_nulls_first(ne); + list_append(nexps, ne); + } + rel->r = nexps; + } return rel; } sql_exp *e = rel->exps->h->data; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Unexport a bunch of stuff that doesn't need t...
Changeset: 6ccbd65c0197 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6ccbd65c0197 Removed Files: monetdb5/modules/kernel/status.h monetdb5/modules/mal/bbp.h monetdb5/modules/mal/mal_io.h monetdb5/modules/mal/mal_mapi.h monetdb5/modules/mal/oltp.h monetdb5/modules/mal/profiler.h monetdb5/modules/mal/tokenizer.h Modified Files: clients/Tests/exports.stable.out monetdb5/modules/kernel/CMakeLists.txt monetdb5/modules/kernel/bat5.c monetdb5/modules/kernel/bat5.h monetdb5/modules/kernel/group.c monetdb5/modules/kernel/group.h monetdb5/modules/kernel/status.c monetdb5/modules/mal/CMakeLists.txt monetdb5/modules/mal/bbp.c monetdb5/modules/mal/mal_io.c monetdb5/modules/mal/mal_mapi.c monetdb5/modules/mal/manifold.c monetdb5/modules/mal/manifold.h monetdb5/modules/mal/oltp.c monetdb5/modules/mal/orderidx.c monetdb5/modules/mal/orderidx.h monetdb5/modules/mal/profiler.c monetdb5/modules/mal/querylog.c monetdb5/modules/mal/querylog.h monetdb5/modules/mal/tokenizer.c monetdb5/modules/mal/wlc.c monetdb5/modules/mal/wlc.h monetdb5/optimizer/opt_oltp.h sql/backends/monet5/sql.c sql/backends/monet5/sql.h sql/backends/monet5/sql_scenario.c Branch: default Log Message: Unexport a bunch of stuff that doesn't need to be exported. diffs (truncated from 3018 to 300 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -706,117 +706,19 @@ str AUTHresolveUser(str *ret, oid uid); str AUTHsetPassword(Client c, const char *username, const char *passwd); str AUTHunlockVault(const char *password); str BATinfo(BAT **key, BAT **val, const bat bid); -str BKCappend_cand_force_wrap(bat *r, const bat *bid, const bat *uid, const bat *sid, const bit *force); -str BKCappend_cand_wrap(bat *r, const bat *bid, const bat *uid, const bat *sid); -str BKCappend_force_wrap(bat *r, const bat *bid, const bat *uid, const bit *force); -str BKCappend_val_force_wrap(bat *r, const bat *bid, const void *u, const bit *force); -str BKCappend_val_wrap(bat *r, const bat *bid, const void *u); -str BKCappend_wrap(bat *r, const bat *bid, const bat *uid); -str BKCattach(bat *ret, const int *tt, const char *const *heapfile); -str BKCbat_inplace(bat *r, const bat *bid, const bat *rid, const bat *uid); -str BKCbat_inplace_force(bat *r, const bat *bid, const bat *rid, const bat *uid, const bit *force); -str BKCbun_inplace(bat *r, const bat *bid, const oid *id, const void *t); -str BKCbun_inplace_force(bat *r, const bat *bid, const oid *id, const void *t, const bit *force); -str BKCdelete(bat *r, const bat *bid, const oid *h); -str BKCdelete_all(bat *r, const bat *bid); -str BKCdelete_multi(bat *r, const bat *bid, const bat *sid); -str BKCdensebat(bat *ret, const lng *size); -str BKCdiffcand(bat *ret, const bat *aid, const bat *bid); -str BKCgetAccess(str *res, const bat *bid); -str BKCgetBBPname(str *ret, const bat *bid); -str BKCgetCapacity(lng *res, const bat *bid); -str BKCgetColumnType(str *res, const bat *bid); -str BKCgetKey(bit *ret, const bat *bid); -str BKCgetRole(str *res, const bat *bid); -str BKCgetSequenceBase(oid *r, const bat *bid); -str BKCgetSize(lng *tot, const bat *bid); -str BKCinfo(bat *ret1, bat *ret2, const bat *bid); -str BKCintersectcand(bat *ret, const bat *aid, const bat *bid); -str BKCisPersistent(bit *res, const bat *bid); -str BKCisSorted(bit *res, const bat *bid); -str BKCisSortedReverse(bit *res, const bat *bid); -str BKCisSynced(bit *ret, const bat *bid1, const bat *bid2); -str BKCisTransient(bit *res, const bat *bid); -str BKCmergecand(bat *ret, const bat *aid, const bat *bid); str BKCmirror(bat *ret, const bat *bid); str BKCnewBAT(bat *res, const int *tt, const BUN *cap, role_t role); str BKCreuseBAT(bat *ret, const bat *bid, const bat *did); -str BKCreuseBATmap(bat *ret, const bat *bid, const bat *did); -str BKCsave(bit *res, const char *const *input); -str BKCsave2(void *r, const bat *bid); -str BKCsetAccess(bat *res, const bat *bid, const char *const *param); -str BKCsetColumn(void *r, const bat *bid, const char *const *tname); -str BKCsetHash(bit *ret, const bat *bid); -str BKCsetImprints(bit *ret, const bat *bid); str BKCsetName(void *r, const bat *bid, const char *const *s); str BKCsetPersistent(void *r, const bat *bid); -str BKCsetTransient(void *r, const bat *bid); str BKCshrinkBAT(bat *ret, const bat *bid, const bat *did); ssize_t BLOBtostr(str *tostr, size_t *l, const void *pin, bool external); str CLTsessions(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTshutdown(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); -str CMDbbp(bat *ID, bat *NS, bat *TT, bat *CNT, bat *REFCNT, bat *LR
MonetDB: default - Added test for bug 7055. It is not a bug beca...
Changeset: a0bfa0d245db for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a0bfa0d245db Modified Files: sql/test/miscellaneous/Tests/declared_tables.test Branch: default Log Message: Added test for bug 7055. It is not a bug because is not yet in production diffs (35 lines): diff --git a/sql/test/miscellaneous/Tests/declared_tables.test b/sql/test/miscellaneous/Tests/declared_tables.test --- a/sql/test/miscellaneous/Tests/declared_tables.test +++ b/sql/test/miscellaneous/Tests/declared_tables.test @@ -41,3 +41,31 @@ NULL statement ok DROP FUNCTION testtruncate +statement ok +START TRANSACTION + +statement ok +CREATE TABLE foo (i INT) + +statement ok +CREATE FUNCTION cnt() RETURNS INT BEGIN RETURN SELECT COUNT(*) FROM foo; END + +statement ok +CREATE FUNCTION func () RETURNS TABLE(i int) +BEGIN +TRUNCATE foo; +INSERT INTO foo VALUES (1); +INSERT INTO foo VALUES ((SELECT COUNT(*) FROM foo)+1); +INSERT INTO foo SELECT cnt()+1; +RETURN foo; +END + +query I rowsort +SELECT * FROM func() + +1 +2 +3 + +statement ok +ROLLBACK ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Approved output
Changeset: fdbb5a46b1c3 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fdbb5a46b1c3 Modified Files: sql/test/analytics/Tests/analytics20.stable.out Branch: default Log Message: Approved output diffs (25 lines): diff --git a/sql/test/analytics/Tests/analytics20.stable.out b/sql/test/analytics/Tests/analytics20.stable.out --- a/sql/test/analytics/Tests/analytics20.stable.out +++ b/sql/test/analytics/Tests/analytics20.stable.out @@ -40,8 +40,8 @@ stdout of test 'analytics20` in director % .prepare,.prepare, .prepare, .prepare, .prepare, .prepare # table_name % type,digits, scale, schema, table, column # name % varchar, int,int,str,str,str # type -% 7, 2, 1, 0, 2, 2 # length -[ "varchar", 0, 0, "", "%1", "%1"] +% 7, 3, 1, 0, 2, 2 # length +[ "varchar", 64, 0, "", "%1", "%1"] [ "bigint",64, 0, NULL, NULL, NULL] #exec 1(2); % sys.%1 # table_name @@ -62,8 +62,8 @@ stdout of test 'analytics20` in director % .prepare,.prepare, .prepare, .prepare, .prepare, .prepare # table_name % type,digits, scale, schema, table, column # name % varchar, int,int,str,str,str # type -% 7, 2, 1, 0, 2, 2 # length -[ "varchar", 0, 0, "", "%2", "%2"] +% 7, 3, 1, 0, 2, 2 # length +[ "varchar", 64, 0, "", "%2", "%2"] [ "int", 32, 0, NULL, NULL, NULL] #exec 2(2); % sys.%2 # table_name ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Merged with Oct2020
Changeset: afbe79587c5b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=afbe79587c5b Removed Files: sql/test/SQLancer/Tests/sqlancer09.sql sql/test/SQLancer/Tests/sqlancer10.sql Modified Files: sql/common/sql_types.c sql/server/sql_semantic.c sql/test/BugTracker-2019/Tests/outer-join-varchar.Bug-6776.test sql/test/SQLancer/Tests/sqlancer09.test sql/test/SQLancer/Tests/sqlancer10.test sql/test/subquery/Tests/subquery6.test Branch: default Log Message: Merged with Oct2020 diffs (truncated from 364 to 300 lines): diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c --- a/sql/common/sql_types.c +++ b/sql/common/sql_types.c @@ -505,7 +505,7 @@ sql_dup_subfunc(sql_allocator *sa, sql_f } else if (r->scale) scale = r->scale; } - if (member && f->fix_scale == INOUT) + if (member && (f->fix_scale == INOUT || r->type->eclass == EC_ANY)) digits = member->digits; if (IS_ANALYTIC(f) && mscale) scale = mscale; diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c --- a/sql/server/sql_semantic.c +++ b/sql/server/sql_semantic.c @@ -266,8 +266,10 @@ static sql_subfunc * scale = member->scale; } /* same type as the input */ - if (r->type->eclass == EC_ANY && member) + if (r->type->eclass == EC_ANY && member) { r = member; + digits = member->digits; + } if (!EC_SCALE(r->type->eclass)) scale = 0; res = sql_create_subtype(sa, r->type, digits, scale); @@ -955,14 +957,14 @@ result_datatype(sql_subtype *super, sql_ char *tpe = "varchar"; unsigned int digits = 0; if (!EC_VARCHAR(lclass)) { - tpe = r->type->sqlname; - digits = (!l->digits)?0:r->digits; + tpe = r->type->sqlname; + digits = (!l->digits)?0:r->digits; } else if (!EC_VARCHAR(rclass)) { - tpe = l->type->sqlname; - digits = (!r->digits)?0:l->digits; + tpe = l->type->sqlname; + digits = (!r->digits)?0:l->digits; } else { /* both */ - tpe = (l->type->base.id > r->type->base.id)?l->type->sqlname:r->type->sqlname; - digits = (!l->digits||!r->digits)?0:sql_max(l->digits, r->digits); + tpe = (l->type->base.id > r->type->base.id)?l->type->sqlname:r->type->sqlname; + digits = (!l->digits||!r->digits)?0:sql_max(l->digits, r->digits); } sql_find_subtype(super, tpe, digits, 0); /* case b blob */ @@ -976,30 +978,38 @@ result_datatype(sql_subtype *super, sql_ char *tpe = (l->type->base.id > r->type->base.id)?l->type->sqlname:r->type->sqlname; unsigned int digits = sql_max(l->digits, r->digits); unsigned int scale = sql_max(l->scale, r->scale); - if (l->type->radix == 10 || r->type->radix == 10) { - digits = 0; - /* change to radix 10 */ - if (l->type->radix == 2 && r->type->radix == 10) { - digits = bits2digits(l->type->digits); - digits = sql_max(r->digits, digits); - scale = r->scale; - } else if (l->type->radix == 10 && r->type->radix == 2) { - digits = bits2digits(r->type->digits); - digits = sql_max(l->digits, digits); - scale = l->scale; + + if (l->type->radix == 10 && r->type->radix == 10) { + digits = scale + (sql_max(l->digits - l->scale, r->digits - r->scale)); +#ifdef HAVE_HGE + if (digits > 39) { + digits = 39; +#else + if (digits > 19) { + digits = 19; +#endif + scale = MIN(scale, digits - 1); } + } else if (l->type->radix == 2 && r->type->radix == 10) { /* change to radix 10 */ + digits = bits2digits(l->type->digits); + digits = sql_max(r->digits, digits); + scale = r->scale; + } else if (l->type->radix == 10 && r->type->radix == 2) { /* ch
MonetDB: Oct2020 - Use digits from member on aggregates too
Changeset: 09a6da4fe701 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=09a6da4fe701 Modified Files: sql/common/sql_types.c Branch: Oct2020 Log Message: Use digits from member on aggregates too diffs (15 lines): diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c --- a/sql/common/sql_types.c +++ b/sql/common/sql_types.c @@ -462,8 +462,10 @@ static sql_subfunc * scale = member->scale; } /* same type as the input */ - if (r->type->eclass == EC_ANY && member) + if (r->type->eclass == EC_ANY && member) { r = member; + digits = member->digits; + } if (!EC_SCALE(r->type->eclass)) scale = 0; res = sql_create_subtype(sa, r->type, digits, scale); ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Make sure this compiles on Windows too.
Changeset: b3fa989a5bef for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b3fa989a5bef Modified Files: clients/mapiclient/CMakeLists.txt clients/mapiclient/ReadlineTools.c clients/mapiclient/dotmonetdb.c Branch: default Log Message: Make sure this compiles on Windows too. diffs (33 lines): diff --git a/clients/mapiclient/CMakeLists.txt b/clients/mapiclient/CMakeLists.txt --- a/clients/mapiclient/CMakeLists.txt +++ b/clients/mapiclient/CMakeLists.txt @@ -94,6 +94,7 @@ target_link_libraries(stethoscope stream mapi mprompt + mutils $<$:${GETOPT_LIB}> $<$:ws2_32>) diff --git a/clients/mapiclient/ReadlineTools.c b/clients/mapiclient/ReadlineTools.c --- a/clients/mapiclient/ReadlineTools.c +++ b/clients/mapiclient/ReadlineTools.c @@ -18,6 +18,7 @@ #include #include #include "ReadlineTools.h" +#define LIBMUTILS 1 #include "mutils.h" #ifdef HAVE_STRINGS_H diff --git a/clients/mapiclient/dotmonetdb.c b/clients/mapiclient/dotmonetdb.c --- a/clients/mapiclient/dotmonetdb.c +++ b/clients/mapiclient/dotmonetdb.c @@ -8,6 +8,7 @@ #include "monetdb_config.h" #include "dotmonetdb.h" +#define LIBMUTILS 1 #include "mutils.h" #include ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Avoid use of static variable for Windows read...
Changeset: f7937bd7d80b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f7937bd7d80b Modified Files: common/utils/mutils.c common/utils/mutils.h Branch: default Log Message: Avoid use of static variable for Windows readdir. And no need to expose the contents of struct DIR. diffs (58 lines): diff --git a/common/utils/mutils.c b/common/utils/mutils.c --- a/common/utils/mutils.c +++ b/common/utils/mutils.c @@ -272,6 +272,14 @@ winerror(int e) } } +struct DIR { + wchar_t *dir_name; + int just_opened; + HANDLE find_file_handle; + void *find_file_data; + struct dirent result; +}; + DIR * opendir(const char *dirname) { @@ -360,7 +368,6 @@ basename(const wchar_t *file_name) struct dirent * readdir(DIR *dir) { - static struct dirent result; char *base; if (dir == NULL) { @@ -376,11 +383,11 @@ readdir(DIR *dir) base = wchartoutf8(basename(((LPWIN32_FIND_DATAW) dir->find_file_data)->cFileName)); if (base == NULL) return NULL; - strcpy_len(result.d_name, base, sizeof(result.d_name)); + strcpy_len(dir->result.d_name, base, sizeof(dir->result.d_name)); free(base); - result.d_namelen = (int) strlen(result.d_name); + dir->result.d_namelen = (int) strlen(dir->result.d_name); - return &result; + return &dir->result; } void diff --git a/common/utils/mutils.h b/common/utils/mutils.h --- a/common/utils/mutils.h +++ b/common/utils/mutils.h @@ -44,12 +44,7 @@ #include -struct DIR { - wchar_t *dir_name; - int just_opened; - HANDLE find_file_handle; - void *find_file_data; -}; +struct DIR; typedef struct DIR DIR; struct dirent { ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Make objectversion::state an atomic variable.
Changeset: 24890aacf41f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=24890aacf41f Modified Files: sql/storage/objectset.c Branch: default Log Message: Make objectversion::state an atomic variable. diffs (105 lines): diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c --- a/sql/storage/objectset.c +++ b/sql/storage/objectset.c @@ -24,7 +24,7 @@ struct versionhead ; typedef struct objectversion { ulng ts; - bte state; + ATOMIC_TYPE state; sql_base *b; // base of underlying sql object struct objectset* os; struct objectversion*name_based_older; @@ -312,14 +312,12 @@ objectversion_destroy(sqlstore *store, o } static bte os_atmc_get_state(objectversion *ov) { - // ATOMIC GET - bte state = ov->state; + bte state = (bte) ATOMIC_GET(&ov->state); return state; } static void os_atmc_set_state(objectversion *ov, bte state) { - // ATOMIC SET - ov->state = state; + ATOMIC_SET(&ov->state, state); } static void @@ -387,9 +385,8 @@ os_rollback(objectversion *ov, sqlstore static inline void try_to_mark_deleted_for_destruction(sqlstore* store, objectversion *ov) { - //TODO ATOMIC CAS - if (ov->state == deleted) { - ov->state = under_destruction; + ATOMIC_BASE_TYPE expected_deleted = deleted; + if (ATOMIC_CAS(&ov->state, &expected_deleted, under_destruction)) { if (!ov->name_based_newer || (os_atmc_get_state(ov->name_based_newer) & rollbacked)) { // TODO: This gives race conditions with os_rollback. os_remove_name_based_chain(ov->os, store, ov->name_based_head); @@ -407,7 +404,6 @@ try_to_mark_deleted_for_destruction(sqls ov->ts = store_get_timestamp(store)+1; } - //END ATOMIC CAS } static void @@ -717,18 +713,14 @@ os_add_name_based(objectset *os, struct /* Since our parent oo is comitted deleted objectversion, we might have a conflict with * another transaction that tries to clean up oo or also wants to add a new objectversion. */ - //TODO ATOMIC CAS - if (oo->state == deleted) { - oo->state = under_resurrection; - } - else { + ATOMIC_BASE_TYPE expected_deleted = deleted; + if (!ATOMIC_CAS(&oo->state, &expected_deleted, under_destruction)) { return -1; /*conflict with cleaner or write-write conflict*/ } - // END ATOMIC CAS } /* new object with same name within transaction, should have a delete in between */ - assert(!(state == active && oo->ts == ov->ts && !(ov->state & deleted))); + assert(!(state == active && oo->ts == ov->ts && !(os_atmc_get_state(ov) & deleted))); MT_lock_set(&os->ht_lock); ov->name_based_head = oo->name_based_head; @@ -767,22 +759,17 @@ os_add_id_based(objectset *os, struct sq assert(ov != oo); // Time loops are not allowed - //TODO ATOMIC GET - bte state = oo->state; + bte state = os_atmc_get_state(oo); if (state != active) { // This can only happen if the parent oo was a comitted deleted at some point. assert(state == deleted || state == under_destruction || state == under_resurrection); /* Since our parent oo is comitted deleted objectversion, we might have a conflict with * another transaction that tries to clean up oo or also wants to add a new objectversion. */ - //TODO ATOMIC CAS - if (oo->state == deleted) { - oo->state = under_resurrection; - } - else { + ATOMIC_BASE_TYPE expected_deleted = deleted; + if (!ATOMIC_CAS(&oo->state, &expected_deleted, under_resurrection)) { return -1; /*conflict with cleaner or write-write conflict*/ } - // END ATOMIC CAS } MT_lock_set(&os->ht_lock); @@ -794,7 +781,6 @@ os_add_id_based(objectset *os, struct sq if (oo) { oo->id_based_newer = ov; // if the parent was originally deleted, we restore it to that state. - oo->state = state; os_atmc_set_state(oo, state); } MT_lock_unset(&os->ht_lock); ___ checkin-list mailing list check
MonetDB: Oct2020 - Add more digits when converting from numeric ...
Changeset: 8c21324a4af8 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8c21324a4af8 Modified Files: sql/server/sql_semantic.c sql/test/SQLancer/Tests/sqlancer09.stable.err sql/test/SQLancer/Tests/sqlancer09.stable.out sql/test/SQLancer/Tests/sqlancer10.stable.err sql/test/SQLancer/Tests/sqlancer10.stable.out Branch: Oct2020 Log Message: Add more digits when converting from numeric types to char types and approved ouput. We have more strict conversion rules on set operations, so the error is right diffs (103 lines): diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c --- a/sql/server/sql_semantic.c +++ b/sql/server/sql_semantic.c @@ -302,8 +302,19 @@ supertype(sql_subtype *super, sql_subtyp sql_find_subtype(&lsuper, tpe, 0, 0); } else { /* for strings use the max of both */ - digits = EC_VARCHAR(eclass) ? sql_max(idigits, rdigits) : -sql_max(idigits - i->scale, rdigits - r->scale); + if (eclass == EC_CHAR) { + if (i->type->eclass == EC_NUM) + idigits++; /* add '-' */ + else if (i->type->eclass == EC_DEC || i->type->eclass == EC_FLT) + idigits+=2; /* add '-' and '.' TODO for floating-points maybe more is needed */ + if (r->type->eclass == EC_NUM) + rdigits++; + else if (r->type->eclass == EC_DEC || r->type->eclass == EC_FLT) + rdigits+=2; + digits = sql_max(idigits, rdigits); + } else { + digits = sql_max(idigits - i->scale, rdigits - r->scale); + } sql_find_subtype(&lsuper, tpe, digits+scale, scale); } *super = lsuper; diff --git a/sql/test/SQLancer/Tests/sqlancer09.stable.err b/sql/test/SQLancer/Tests/sqlancer09.stable.err --- a/sql/test/SQLancer/Tests/sqlancer09.stable.err +++ b/sql/test/SQLancer/Tests/sqlancer09.stable.err @@ -9,11 +9,7 @@ MAPI = (monetdb) /var/tmp/mtest-133412/ QUERY = INSERT INTO t2 VALUES (COALESCE(1 BETWEEN 2 AND 3, 1)); ERROR = !INSERT INTO: PRIMARY KEY constraint 't2.t2_c0_pkey' violated CODE = 40002 -MAPI = (monetdb) /var/tmp/mtest-349169/.s.monetdb.38512 -QUERY = values (0.51506835), (2), (least('a', 0.5667308)); -ERROR = !value too long for type (var)char(8) -CODE = 22001 -MAPI = (monetdb) /var/tmp/mtest-307586/.s.monetdb.36528 +MAPI = (monetdb) /var/tmp/mtest-417038/.s.monetdb.32277 QUERY = select 1 from v74 cross join v84 join (values ('b'), ('a'), (1)) as sub0 on (v84.vc0)^(-9223372036854775807) is not null; ERROR = !overflow in calculation 1XOR-9223372036854775807. CODE = 22003 diff --git a/sql/test/SQLancer/Tests/sqlancer09.stable.out b/sql/test/SQLancer/Tests/sqlancer09.stable.out --- a/sql/test/SQLancer/Tests/sqlancer09.stable.out +++ b/sql/test/SQLancer/Tests/sqlancer09.stable.out @@ -167,6 +167,14 @@ stdout of test 'sqlancer09` in directory % 1 # length [ 0] #ROLLBACK; +#values (0.51506835), (2), (least('a', 0.5667308)); +% .%1 # table_name +% %1 # name +% decimal # type +% 20 # length +[ 0.51506835 ] +[ 2. ] +[ 0.56673080 ] #START TRANSACTION; #CREATE TABLE "sys"."t2" ("c0" BIGINT,"c1" BIGINT,"c2" REAL); #COPY 21 RECORDS INTO "sys"."t2" FROM stdin USING DELIMITERS E'\t',E'\n','"'; diff --git a/sql/test/SQLancer/Tests/sqlancer10.stable.err b/sql/test/SQLancer/Tests/sqlancer10.stable.err --- a/sql/test/SQLancer/Tests/sqlancer10.stable.err +++ b/sql/test/SQLancer/Tests/sqlancer10.stable.err @@ -5,6 +5,10 @@ stderr of test 'sqlancer10` in directory # 13:59:46 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-215607" "--port=30526" # 13:59:46 > +MAPI = (monetdb) /var/tmp/mtest-485092/.s.monetdb.38732 +QUERY = (select v3.vc0 from v3) intersect (select greatest('-1115800120', v7.vc0) from v7); +ERROR = !types char(18,0) and decimal(20,2) are not equal +CODE = 42000 # 13:59:46 > # 13:59:46 > "Done." diff --git a/sql/test/SQLancer/Tests/sqlancer10.stable.out b/sql/test/SQLancer/Tests/sqlancer10.stable.out --- a/sql/test/SQLancer/Tests/sqlancer10.stable.out +++ b/sql/test/SQLancer/Tests/sqlancer10.stable.out @@ -66,6 +66,26 @@ stdout of test 'sqlancer10` in directory % tinyint # type % 1 # length #ROLLBACK; +#START TRANSACTION; +#create view v3(vc0, vc1) as (values (0.67,NULL),(18.50, 3),(0.70, 6)); +#create view v7(vc0) as (values (8505133838.114197),(NULL)); +#ROLLBACK; +#START TRANSACTION; +#CREATE TABLE t1(c0 int); +#CREATE VIEW v4(vc0) AS ((SELECT NULL FROM t1 AS l0t1) UNION ALL (SELECT true)); +#INSERT INTO t1(c0) VALUES(12), (2), (6), (3), (1321), (10), (8), (1), (2), (3), (9); +[ 11 ] +#DELETE FROM t1 WHERE true; +[ 11 ] +#INSERT INTO t1(c0) VALUES(9), (1), (3), (2), (5); +[ 5
MonetDB: default - Approve
Changeset: 12751a4640cf for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=12751a4640cf Modified Files: monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows sql/test/mapi/Tests/sql_int128.test Branch: default Log Message: Approve diffs (190 lines): diff --git a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out --- a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out +++ b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out @@ -24,8 +24,8 @@ function user.main():void; X_88:ptr := sql.append_exec(X_85:ptr, X_28:bat[:int]); X_91:ptr := sql.append_exec(X_90:ptr, X_29:bat[:int]); X_94:ptr := sql.append_exec(X_93:ptr, X_30:bat[:int]); +X_40:int := sql.append_finish(X_86:int, X_88:ptr, X_91:ptr, X_94:ptr); X_42:lng := aggr.count(X_30:bat[:int]); -X_40:int := sql.append_finish(X_86:int, X_88:ptr, X_91:ptr, X_94:ptr); sql.affectedRows(X_40:int, X_42:lng); end user.main; #inline actions= 0 time=1 usec @@ -87,8 +87,8 @@ function user.main():void; X_89:ptr := sql.append_exec(X_86:ptr, X_28:bat[:int]); X_92:ptr := sql.append_exec(X_91:ptr, X_29:bat[:int]); X_95:ptr := sql.append_exec(X_94:ptr, X_30:bat[:int]); +X_40:int := sql.append_finish(X_87:int, X_89:ptr, X_92:ptr, X_95:ptr); X_42:lng := aggr.count(X_30:bat[:int]); -X_40:int := sql.append_finish(X_87:int, X_89:ptr, X_92:ptr, X_95:ptr); sql.affectedRows(X_40:int, X_42:lng); end user.main; #inline actions= 0 time=0 usec diff --git a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows --- a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows +++ b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows @@ -25,8 +25,8 @@ function user.main():void; X_88:ptr := sql.append_exec(X_85:ptr, X_28:bat[:int]); X_91:ptr := sql.append_exec(X_90:ptr, X_29:bat[:int]); X_94:ptr := sql.append_exec(X_93:ptr, X_30:bat[:int]); +X_40:int := sql.append_finish(X_86:int, X_88:ptr, X_91:ptr, X_94:ptr); X_42:lng := aggr.count(X_30:bat[:int]); -X_40:int := sql.append_finish(X_86:int, X_88:ptr, X_91:ptr, X_94:ptr); sql.affectedRows(X_40:int, X_42:lng); end user.main; #inline actions= 0 time=0 usec @@ -68,8 +68,8 @@ function user.main():void; X_88:ptr := sql.append_exec(X_85:ptr, X_28:bat[:int]); X_91:ptr := sql.append_exec(X_90:ptr, X_29:bat[:int]); X_94:ptr := sql.append_exec(X_93:ptr, X_30:bat[:int]); +X_40:int := sql.append_finish(X_86:int, X_88:ptr, X_91:ptr, X_94:ptr); X_42:lng := aggr.count(X_30:bat[:int]); -X_40:int := sql.append_finish(X_86:int, X_88:ptr, X_91:ptr, X_94:ptr); sql.affectedRows(X_40:int, X_42:lng); end user.main; #inline actions= 0 time=1 usec @@ -128,8 +128,8 @@ function user.main():void; X_89:ptr := sql.append_exec(X_86:ptr, X_28:bat[:int]); X_92:ptr := sql.append_exec(X_91:ptr, X_29:bat[:int]); X_95:ptr := sql.append_exec(X_94:ptr, X_30:bat[:int]); +X_40:int := sql.append_finish(X_87:int, X_89:ptr, X_92:ptr, X_95:ptr); X_42:lng := aggr.count(X_30:bat[:int]); -X_40:int := sql.append_finish(X_87:int, X_89:ptr, X_92:ptr, X_95:ptr); sql.affectedRows(X_40:int, X_42:lng); end user.main; #inline actions= 0 time=0 usec @@ -172,8 +172,8 @@ function user.main():void; X_89:ptr := sql.append_exec(X_86:ptr, X_28:bat[:int]); X_92:ptr := sql.append_exec(X_91:ptr, X_29:bat[:int]); X_95:ptr := sql.append_exec(X_94:ptr, X_30:bat[:int]); +X_40:int := sql.append_finish(X_87:int, X_89:ptr, X_92:ptr, X_95:ptr); X_42:lng := aggr.count(X_30:bat[:int]); -X_40:int := sql.append_finish(X_87:int, X_89:ptr, X_92:ptr, X_95:ptr); sql.affectedRows(X_40:int, X_42:lng); end user.main; #inline actions= 0 time=0 usec diff --git a/sql/test/mapi/Tests/sql_int128.test b/sql/test/mapi/Tests/sql_int128.test --- a/sql/test/mapi/Tests/sql_int128.test +++ b/sql/test/mapi/Tests/sql_int128.test @@ -16,18 +16,18 @@ querylog.define 1 sql.mvc 1 -sql.update_prep -1 sql.tid 1 algebra.project 1 +sql.update_prep +1 sql.update_exec 1 +sql.append_finish +1 aggr.count 1 -sql.append_finish -1 sql.affectedRows 1 @@ -40,18 +40,18 @@ querylog.define 1 sql.mvc 1 -sql.update_prep -1 sql.tid 1 algebra.project 1 +sql.update_prep +1 sql.update_exec 1 +sql.append_finish +1 aggr.count 1 -sql.append_finish -1 sql.affectedRows 1 @@ -64,20 +64,20 @@ querylog.define 1 sql.mvc 1 -sql.update_prep -1 sql.tid 1 sql.bind 2 algebra.projection 2 +sql.update_prep +1 sql.updat
MonetDB: default - Make opt_parappend a lot less ambitious
Changeset: 2191e791ee62 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2191e791ee62 Modified Files: monetdb5/optimizer/opt_parappend.c Branch: default Log Message: Make opt_parappend a lot less ambitious diffs (137 lines): diff --git a/monetdb5/optimizer/opt_parappend.c b/monetdb5/optimizer/opt_parappend.c --- a/monetdb5/optimizer/opt_parappend.c +++ b/monetdb5/optimizer/opt_parappend.c @@ -20,11 +20,9 @@ typedef struct parstate { InstrPtr finish_stmt; } parstate; -static str transform(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr importTable, const char *execRef, const char *prepRef, int *actions); -static int setup_append_prep(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr old, const char *prepRef); +static str transform(parstate *state, MalBlkPtr mb, InstrPtr importTable, const char *execRef, const char *prepRef, int *actions); +static int setup_append_prep(parstate *state, MalBlkPtr mb, InstrPtr old, const char *prepRef); static void flush_finish_stmt(parstate *state, MalBlkPtr mb); -static void pull_prep_towards_beginning(Client cntxt, MalBlkPtr mb, InstrPtr instr); -static bool needs_chain_var(parstate *state, InstrPtr instr); str @@ -68,13 +66,11 @@ OPTparappendImplementation(Client cntxt, for (size_t i = 0; i < old_stop; i++) { InstrPtr p = old_mb_stmt[i]; if (p->modname == sqlRef && p->fcnname == appendRef) { - msg = transform(&state, cntxt, mb, p, putName("append_exec"), putName("append_prep"), &actions); + msg = transform(&state, mb, p, putName("append_exec"), putName("append_prep"), &actions); } else if (p->modname == sqlRef && p->fcnname == updateRef) { - msg = transform(&state, cntxt, mb, p, putName("update_exec"), putName("update_prep"), &actions); + msg = transform(&state, mb, p, putName("update_exec"), putName("update_prep"), &actions); } else { - if (p->barrier != 0 || mayhaveSideEffects(cntxt, mb, p, false) || needs_chain_var(&state, p)) { - flush_finish_stmt(&state, mb); - } + flush_finish_stmt(&state, mb); pushInstruction(mb, p); } if (msg != MAL_SUCCEED) @@ -115,7 +111,7 @@ end: } static str -transform(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr old, const char *opRef, const char *prepRef, int *actions) +transform(parstate *state, MalBlkPtr mb, InstrPtr old, const char *opRef, const char *prepRef, int *actions) { int sname_var; int tname_var; @@ -158,7 +154,7 @@ transform(parstate *state, Client cntxt, *actions += 1; - int cookie_var = setup_append_prep(state, cntxt, mb, old, prepRef); + int cookie_var = setup_append_prep(state, mb, old, prepRef); int ret_cookie = newTmpVariable(mb, TYPE_ptr); InstrPtr e = newFcnCall(mb, sqlRef, opRef); @@ -175,7 +171,7 @@ transform(parstate *state, Client cntxt, } static int -setup_append_prep(parstate *state, Client cntxt, MalBlkPtr mb, InstrPtr old, const char *prepRef) +setup_append_prep(parstate *state, MalBlkPtr mb, InstrPtr old, const char *prepRef) { // take the old instruction apart assert(old->retc == 1); @@ -253,8 +249,6 @@ setup_append_prep(parstate *state, Clien setReturnArgument(f, chain_out_var); f = pushArgument(mb, f, chain); state->finish_stmt = f; - - pull_prep_towards_beginning(cntxt, mb, p); } else { // Append to existing first, to ensure there is room prep_stmt = pushArgument(mb, prep_stmt, cname_var); @@ -284,66 +278,3 @@ flush_finish_stmt(parstate *state, MalBl state->prep_stmt = NULL; state->finish_stmt = NULL; } - - -static bool -can_swap_prep_with(Client cntxt, MalBlkPtr mb, InstrPtr prep, InstrPtr other) -{ - if (mayhaveSideEffects(cntxt, mb, other, false)) { - // probably not safe to pull it across a side effect, and chainflow wouldn't benefit anyway - return false; - } - - if (other->barrier != 0) { - // be wary of control flow - return false; - } - - int chain_var = getArg(prep, prep->retc); - for (int i = 0; i < other->retc; i++) { - int other_ret = getArg(other, i); - if (chain_var == other_ret) { - // it defines the chain var we use, we must not violate causality - return false; - } - } - - return true; // okay -} - -static bool -needs_chain_var(parstate *state, InstrPtr instr) -{ - if (state->finish_stmt == NULL) - return false; - - int chain_var = getArg(state->finish_stmt, 0); - - for (int i = 0; i
MonetDB: default - Should never happen, i.e. change to assert.
Changeset: c648e5c63246 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c648e5c63246 Modified Files: sql/storage/objectset.c Branch: default Log Message: Should never happen, i.e. change to assert. diffs (16 lines): diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c --- a/sql/storage/objectset.c +++ b/sql/storage/objectset.c @@ -726,9 +726,9 @@ os_add_name_based(objectset *os, struct } // END ATOMIC CAS } - if (state == active && oo->ts == ov->ts && !(ov->state & deleted)) { - return -1; /* new object with same name within transaction, should have a delete in between */ - } + + /* new object with same name within transaction, should have a delete in between */ + assert(!(state == active && oo->ts == ov->ts && !(ov->state & deleted))); MT_lock_set(&os->ht_lock); ov->name_based_head = oo->name_based_head; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Port to Cygwin.
Changeset: 186c2b953b20 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=186c2b953b20 Modified Files: clients/mapiclient/ReadlineTools.c clients/mapiclient/dotmonetdb.c Branch: default Log Message: Port to Cygwin. diffs (112 lines): diff --git a/clients/mapiclient/ReadlineTools.c b/clients/mapiclient/ReadlineTools.c --- a/clients/mapiclient/ReadlineTools.c +++ b/clients/mapiclient/ReadlineTools.c @@ -18,12 +18,13 @@ #include #include #include "ReadlineTools.h" +#include "mutils.h" #ifdef HAVE_STRINGS_H #include/* for strncasecmp */ #endif -#ifndef WIN32 +#ifndef NATIVE_WIN32 /* for umask */ #include #include @@ -309,10 +310,6 @@ readline_show_error(const char *msg) { #define BUFFER_SIZE 1024 #endif -#ifdef WIN32 -#define unlink _unlink -#endif - static int invoke_editor(int cnt, int key) { char editor_command[BUFFER_SIZE]; @@ -325,14 +322,14 @@ invoke_editor(int cnt, int key) { (void) cnt; (void) key; -#ifdef WIN32 +#ifdef NATIVE_WIN32 char *mytemp; char template[] = "mclient_temp_XX"; if ((mytemp = _mktemp(template)) == NULL) { readline_show_error("invoke_editor: Cannot create temp file\n"); goto bailout; } - if ((fp = fopen(mytemp, "r+")) == NULL) { + if ((fp = MT_fopen(mytemp, "r+")) == NULL) { // Notify the user that we cannot create temp file readline_show_error("invoke_editor: Cannot create temp file\n"); goto bailout; @@ -408,7 +405,7 @@ invoke_editor(int cnt, int key) { } fclose(fp); - unlink(template); + MT_remove(template); return 0; @@ -416,7 +413,7 @@ bailout: if (fp) fclose(fp); free(read_buff); - unlink(template); + MT_remove(template); return 1; } @@ -462,7 +459,7 @@ init_readline(Mapi mid, const char *lang case ENOENT: /* history file didn't exist, so try to create * it and then try again */ - if ((f = fopen(_history_file, "w")) == NULL) { + if ((f = MT_fopen(_history_file, "w")) == NULL) { /* failed to create, don't * bother saving */ _save_history = 0; diff --git a/clients/mapiclient/dotmonetdb.c b/clients/mapiclient/dotmonetdb.c --- a/clients/mapiclient/dotmonetdb.c +++ b/clients/mapiclient/dotmonetdb.c @@ -8,6 +8,7 @@ #include "monetdb_config.h" #include "dotmonetdb.h" +#include "mutils.h" #include void @@ -30,7 +31,7 @@ parse_dotmonetdb(DotMonetdb *dotfile) if ((cfile = getenv("DOTMONETDBFILE")) == NULL) { /* no environment variable: use a default */ cfile = ".monetdb"; - if ((config = fopen(cfile, "r")) == NULL) { + if ((config = MT_fopen(cfile, "r")) == NULL) { const char *xdg = getenv("XDG_CONFIG_HOME"); const char *home = getenv("HOME"); int len = -1; @@ -39,15 +40,15 @@ parse_dotmonetdb(DotMonetdb *dotfile) len = snprintf(buf, sizeof(buf), "%s%cmonetdb", xdg, DIR_SEP); else if (home != NULL) len = snprintf(buf, sizeof(buf), "%s%c.config%cmonetdb", home, DIR_SEP, DIR_SEP); - if (len == -1 || len >= FILENAME_MAX || (config = fopen(buf, "r")) == NULL) { + if (len == -1 || len >= FILENAME_MAX || (config = MT_fopen(buf, "r")) == NULL) { if (home) { len = snprintf(buf, sizeof(buf), "%s%c.monetdb", home, DIR_SEP); if (len >= 0 && len < FILENAME_MAX) - config = fopen(buf, "r"); + config = MT_fopen(buf, "r"); } } } - } else if (*cfile != 0 && (config = fopen(cfile, "r")) == NULL) { + } else if (*cfile != 0 && (config = MT_fopen(cfile, "r")) == NULL) { fprintf(stderr, "failed to open file '%s': %s\n", cfile, strerror(errno)); } ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - merged
Changeset: 838b6359c17b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=838b6359c17b Branch: default Log Message: merged diffs (20 lines): diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c --- a/sql/storage/objectset.c +++ b/sql/storage/objectset.c @@ -391,14 +391,14 @@ try_to_mark_deleted_for_destruction(sqls if (ov->state == deleted) { ov->state = under_destruction; - if (!ov->name_based_newer || (os_atmc_get_state(ov->name_based_newer) & rollbacked)) { + if (!ov->name_based_newer || (os_atmc_get_state(ov->name_based_newer) & rollbacked)) { // TODO: This gives race conditions with os_rollback. os_remove_name_based_chain(ov->os, store, ov->name_based_head); } else { ov->name_based_newer->name_based_older = NULL; } - if (!ov->id_based_newer || (os_atmc_get_state(ov->id_based_newer) & rollbacked)) { + if (!ov->id_based_newer || (os_atmc_get_state(ov->id_based_newer) & rollbacked)) { // TODO: This gives race conditions with os_rollback. os_remove_id_based_chain(ov->os, store, ov->id_based_head); } else { ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - use ATOMIC_PTR_TYPE to make it compile with s...
Changeset: 1039153ec2be for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1039153ec2be Modified Files: sql/backends/monet5/sql.c sql/backends/monet5/sql_result.c sql/backends/monet5/sql_statement.c sql/include/sql_catalog.h sql/storage/bat/bat_storage.c sql/storage/bat/bat_table.c sql/storage/store.c Branch: default Log Message: use ATOMIC_PTR_TYPE to make it compile with sanitizer (or optimization I guess) diffs (truncated from 969 to 300 lines): diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -1359,7 +1359,7 @@ mvc_insert_delta_values(mvc *m, BAT *col } /* compute level using global transaction */ if (c) { - for(sql_delta *d = c->data; d; d = d->next) + for(sql_delta *d = ATOMIC_PTR_GET(&c->data); d; d = d->next) level++; } if (BUNappend(col7, &level, false) != GDK_SUCCEED) { @@ -3823,7 +3823,7 @@ sql_rowid(Client cntxt, MalBlkPtr mb, Ma if( b == NULL) throw(SQL,"sql.rowid", SQLSTATE(HY005) "Cannot access column descriptor"); /* UGH (move into storage backends!!) */ - d = c->data; + d = ATOMIC_PTR_GET(&c->data); *rid = d->ibase + BATcount(b); BBPunfix(b->batCacheid); return MAL_SUCCEED; diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c --- a/sql/backends/monet5/sql_result.c +++ b/sql/backends/monet5/sql_result.c @@ -843,7 +843,7 @@ mvc_import_table(Client cntxt, BAT ***ba for (n = t->columns.set->h, i = 0; n; n = n->next, i++) { sql_column *c = n->data; BAT *b = store->storage_api.bind_col(m->session->tr, c, RDONLY); - sql_delta *d = c->data; + sql_delta *d = ATOMIC_PTR_GET(&c->data); if ( b == NULL) sql_error(m, 500, "failed to bind to delta column"); diff --git a/sql/backends/monet5/sql_statement.c b/sql/backends/monet5/sql_statement.c --- a/sql/backends/monet5/sql_statement.c +++ b/sql/backends/monet5/sql_statement.c @@ -429,7 +429,7 @@ stmt_vars(backend *be, const char *varna return NULL; } - t->data = l; + ATOMIC_PTR_SET(&t->data, l); /* s->op2 = (stmt*)l; s->op3 = (stmt*)t; @@ -532,9 +532,9 @@ stmt_tid(backend *be, sql_table *t, int MalBlkPtr mb = be->mb; InstrPtr q; - if (!t->s && t->data) { /* declared table */ + if (!t->s && ATOMIC_PTR_GET(&t->data)) { /* declared table */ stmt *s = stmt_create(be->mvc->sa, st_tid); - int *l = t->data; + int *l = ATOMIC_PTR_GET(&t->data); if (s == NULL) { return NULL; @@ -584,9 +584,9 @@ stmt_bat(backend *be, sql_column *c, int InstrPtr q; /* for read access tid.project(col) */ - if (!c->t->s && c->t->data) { /* declared table */ + if (!c->t->s && ATOMIC_PTR_GET(&c->t->data)) { /* declared table */ stmt *s = stmt_create(be->mvc->sa, st_bat); - int *l = c->t->data; + int *l = ATOMIC_PTR_GET(&c->t->data); if (s == NULL) { return NULL; @@ -708,8 +708,8 @@ stmt_append_col(backend *be, sql_column if (b->nr < 0) return NULL; - if (!c->t->s && c->t->data) { /* declared table */ - int *l = c->t->data; + if (!c->t->s && ATOMIC_PTR_GET(&c->t->data)) { /* declared table */ + int *l = ATOMIC_PTR_GET(&c->t->data); if (c->colnr == 0) { /* append to tid column */ q = newStmt(mb, sqlRef, growRef); @@ -798,8 +798,8 @@ stmt_update_col(backend *be, sql_column if (tids->nr < 0 || upd->nr < 0) return NULL; - if (!c->t->s && c->t->data) { /* declared table */ - int *l = c->t->data; + if (!c->t->s && ATOMIC_PTR_GET(&c->t->data)) { /* declared table */ + int *l = ATOMIC_PTR_GET(&c->t->data); q = newStmt(mb, batRef, replaceRef); q = pushArgument(mb, q, l[c->colnr+1]); @@ -883,8 +883,8 @@ stmt_delete(backend *be, sql_table *t, s if (tids->nr < 0) return NULL; - if (!t->s && t->data) { /* declared table */ - int *l = t->data; + if (!t->s && ATOMIC_PTR_GET(&t->data)) { /* declared table */ + int *l = ATOMIC_PTR_GET(&t->data); q = newStmt(mb, batRef, deleteRef); q = pushArgument(mb, q, l[0]); @@ -2968,8 +2968,8 @@ stmt_table_clear(backend *be,
MonetDB: Oct2020 - If the result type of the function is any, ov...
Changeset: 29f26ee98e36 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=29f26ee98e36 Modified Files: sql/common/sql_types.c sql/test/BugTracker-2019/Tests/outer-join-varchar.Bug-6776.stable.out sql/test/SQLancer/Tests/sqlancer09.sql sql/test/SQLancer/Tests/sqlancer10.sql sql/test/analytics/Tests/analytics02.stable.out sql/test/analytics/Tests/analytics03.stable.out sql/test/subquery/Tests/subquery6.stable.out Branch: Oct2020 Log Message: If the result type of the function is any, override the output number of digits with the input type. But there's another sqlancer bug with cast between strings and decimals :( diffs (119 lines): diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c --- a/sql/common/sql_types.c +++ b/sql/common/sql_types.c @@ -569,7 +569,7 @@ sql_dup_subfunc(sql_allocator *sa, sql_f } else if (r->scale) scale = r->scale; } - if (member && f->fix_scale == INOUT) + if (member && (f->fix_scale == INOUT || r->type->eclass == EC_ANY)) digits = member->digits; if (IS_ANALYTIC(f) && mscale) scale = mscale; diff --git a/sql/test/BugTracker-2019/Tests/outer-join-varchar.Bug-6776.stable.out b/sql/test/BugTracker-2019/Tests/outer-join-varchar.Bug-6776.stable.out --- a/sql/test/BugTracker-2019/Tests/outer-join-varchar.Bug-6776.stable.out +++ b/sql/test/BugTracker-2019/Tests/outer-join-varchar.Bug-6776.stable.out @@ -78,7 +78,7 @@ stdout of test 'outer-join-varchar.Bug-6 % table_name, column_name,type, type_digits # name % varchar, varchar,varchar,int # type % 6, 4, 7, 2 # length -[ "dummy6","key", "varchar", 0 ] +[ "dummy6","key", "varchar", 32 ] [ "dummy6","val4", "int", 32 ] [ "dummy6","val5", "int", 32 ] #create table dummy7 as select "key", val as "val4", val as "val5" from dummy4 natural full outer join dummy5; @@ -88,7 +88,7 @@ stdout of test 'outer-join-varchar.Bug-6 % table_name, column_name,type, type_digits # name % varchar, varchar,varchar,int # type % 6, 4, 7, 2 # length -[ "dummy7","key", "varchar", 0 ] +[ "dummy7","key", "varchar", 32 ] [ "dummy7","val4", "int", 32 ] [ "dummy7","val5", "int", 32 ] #create table dummy8 as select dummy4."key" as "key4", dummy5."key" as "key5", dummy4.val as "val4", dummy5.val as "val5" from dummy4 full outer join dummy5 ON dummy4."key" = dummy5."key"; diff --git a/sql/test/SQLancer/Tests/sqlancer09.sql b/sql/test/SQLancer/Tests/sqlancer09.sql --- a/sql/test/SQLancer/Tests/sqlancer09.sql +++ b/sql/test/SQLancer/Tests/sqlancer09.sql @@ -184,7 +184,7 @@ 239480113 NULLNULL create view v2(vc0, vc1, vc2) as (values (+ (0.51506835))&(-2)))<<(scale_down(least(31552, 0.3), cast(1500294098 as int, -((- (((44257622)-(0.6>=(least(-15958291, -1534974396))), case - (sql_min(0.632858, +((- (((44257622)-(0.6>=(least(-3, -4))), case - (sql_min(0.632858, 0.3)) when 0.5)^(0.4)))+(((0.4)/(5 then sql_max(cast(5293 as decimal), ((0.5)- (0.5))) end),(charindex(r'934079707', r'35305325'), not (false), diff --git a/sql/test/SQLancer/Tests/sqlancer10.sql b/sql/test/SQLancer/Tests/sqlancer10.sql --- a/sql/test/SQLancer/Tests/sqlancer10.sql +++ b/sql/test/SQLancer/Tests/sqlancer10.sql @@ -53,6 +53,12 @@ select 1 from v6, v2 join (values (0.54) ROLLBACK; START TRANSACTION; +create view v3(vc0, vc1) as (values (0.67,NULL),(18.50, 3),(0.70, 6)); +create view v7(vc0) as (values (8505133838.114197),(NULL)); +(select v3.vc0 from v3) intersect (select greatest('-1115800120', v7.vc0) from v7); +ROLLBACK; + +START TRANSACTION; CREATE TABLE t1(c0 int); CREATE VIEW v4(vc0) AS ((SELECT NULL FROM t1 AS l0t1) UNION ALL (SELECT true)); INSERT INTO t1(c0) VALUES(12), (2), (6), (3), (1321), (10), (8), (1), (2), (3), (9); diff --git a/sql/test/analytics/Tests/analytics02.stable.out b/sql/test/analytics/Tests/analytics02.stable.out --- a/sql/test/analytics/Tests/analytics02.stable.out +++ b/sql/test/analytics/Tests/analytics02.stable.out @@ -58,8 +58,8 @@ stdout of test 'analytics02` in director % .prepare,.prepare, .prepare, .prepare, .prepare, .prepare # table_name % type,digits, scale, schema, table, column # name % varchar, int,int,str,str,str # type -% 7, 2, 1, 0, 2, 2 # length -[ "varchar", 0, 0, "", "%7", "%7"] +% 7, 3, 1, 0, 2, 2 # length +[ "varchar", 64, 0, "", "%7", "%7"] [ "bigint",64, 0, NULL, NULL, NULL
MonetDB: default - Add TODO's.
Changeset: 1de4923d2c89 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1de4923d2c89 Modified Files: sql/storage/objectset.c Branch: default Log Message: Add TODO's. diffs (20 lines): diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c --- a/sql/storage/objectset.c +++ b/sql/storage/objectset.c @@ -391,14 +391,14 @@ try_to_mark_deleted_for_destruction(sqls if (ov->state == deleted) { ov->state = under_destruction; - if (!ov->name_based_newer || (os_atmc_get_state(ov->name_based_newer) & rollbacked)) { + if (!ov->name_based_newer || (os_atmc_get_state(ov->name_based_newer) & rollbacked)) { // TODO: This gives race conditions with os_rollback. os_remove_name_based_chain(ov->os, store, ov->name_based_head); } else { ov->name_based_newer->name_based_older = NULL; } - if (!ov->id_based_newer || (os_atmc_get_state(ov->id_based_newer) & rollbacked)) { + if (!ov->id_based_newer || (os_atmc_get_state(ov->id_based_newer) & rollbacked)) { // TODO: This gives race conditions with os_rollback. os_remove_id_based_chain(ov->os, store, ov->id_based_head); } else { ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - merged
Changeset: a0da4f7ad01f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a0da4f7ad01f Branch: default Log Message: merged diffs (34 lines): diff --git a/sql/test/Dependencies/Tests/dependency_DBobjects.test b/sql/test/Dependencies/Tests/dependency_DBobjects.test --- a/sql/test/Dependencies/Tests/dependency_DBobjects.test +++ b/sql/test/Dependencies/Tests/dependency_DBobjects.test @@ -298,7 +298,7 @@ DEP_INDEX query TTT rowsort SELECT c.name, f.name, 'DEP_FUNC' from sys.functions as f, sys.columns as c, sys.dependencies as dep where c.id = dep.id AND f.id = dep.depend_id AND dep.depend_type = 7 ORDER BY c.name, f.name -372 values hashing to 78fd640e374ca620ee5f10465e0caf4a +366 values hashing to cccf8f0385098793ac0698438837609a query TTT rowsort SELECT c.name, tri.name, 'DEP_TRIGGER' from sys.columns as c, sys.triggers as tri, sys.dependencies as dep where dep.id = c.id AND dep.depend_id =tri.id AND dep.depend_type = 8 order by c.name, tri.name @@ -511,4 +511,3 @@ DROP TABLE t1 statement ok DROP TABLE t3 - diff --git a/sql/test/Dependencies/Tests/dependency_owner_schema_3.test b/sql/test/Dependencies/Tests/dependency_owner_schema_3.test --- a/sql/test/Dependencies/Tests/dependency_owner_schema_3.test +++ b/sql/test/Dependencies/Tests/dependency_owner_schema_3.test @@ -190,7 +190,7 @@ SELECT c.name, i.name, 'DEP_INDEX' from query TTT rowsort SELECT c.name, f.name, 'DEP_FUNC' from sys.functions as f, sys.columns as c, sys.dependencies as dep where c.id = dep.id AND f.id = dep.depend_id AND dep.depend_type = 7 ORDER BY c.name, f.name -357 values hashing to 443639bbb626f6beccc4d57730d3beb9 +351 values hashing to 0357ee3f8bc7b05468e46a56d104a4e9 query TTT rowsort SELECT c.name, tri.name, 'DEP_TRIGGER' from sys.columns as c, sys.objects as tri, sys.dependencies as dep where dep.id = c.id AND dep.depend_id =tri.id AND dep.depend_type = 8 order by c.name, tri.name @@ -325,4 +325,3 @@ query TTT rowsort SELECT k.name, fk.name, 'DEP_FKEY' from sys.keys as k, sys.keys as fk where fk.rkey = k.id order by k.name, fk.name - ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - only try CAS once, incase of persistent delta...
Changeset: df149909b644 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=df149909b644 Modified Files: sql/storage/bat/bat_storage.c Branch: default Log Message: only try CAS once, incase of persistent delta's, ie only first writter should succeed. diffs (142 lines): 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 @@ -48,6 +48,8 @@ static int tc_gc_col( sql_store Store, s static int tc_gc_idx( sql_store Store, sql_change *c, ulng commit_ts, ulng oldest); static int tc_gc_del( sql_store Store, sql_change *c, ulng commit_ts, ulng oldest); +static int tr_merge_delta( sql_trans *tr, sql_delta *obat); + /* used for communication between {append,update}_prepare and {append,update}_execute */ struct prep_exec_cookie { sql_delta *delta; @@ -69,8 +71,6 @@ make_cookie(sql_allocator *sa, sql_delta return cookie; } -static int tr_merge_delta( sql_trans *tr, sql_delta *obat); - static sql_delta * temp_dup_delta(ulng tid, int type) { @@ -741,6 +741,34 @@ dup_bat(sql_trans *tr, sql_table *t, sql return dup_delta( tr, obat, bat, type, c_isnew, isTempTable(t), t->sz); } +static int +destroy_delta(sql_delta *b) +{ + int ok = LOG_OK; + + if (--b->refcnt > 0) + return LOG_OK; + if (b->next) + ok = destroy_delta(b->next); + if (b->name) + _DELETE(b->name); + if (b->ibid) + temp_destroy(b->ibid); + if (b->uibid) + temp_destroy(b->uibid); + if (b->uvbid) + temp_destroy(b->uvbid); + if (b->bid) + temp_destroy(b->bid); + if (b->cached) + bat_destroy(b->cached); + b->bid = b->ibid = b->uibid = b->uvbid = 0; + b->name = NULL; + b->cached = NULL; + _DELETE(b); + return ok; +} + static sql_delta * bind_col_data(sql_trans *tr, sql_column *c) { @@ -763,9 +791,13 @@ bind_col_data(sql_trans *tr, sql_column if(dup_bat(tr, c->t, obat, bat, c->type.type->localtype, isNew(c)) == LOG_ERR) return NULL; bat->ts = tr->tid; - do { - bat->next = obat; - } while(!ATOMIC_PTR_CAS(&c->data, &bat->next, bat)); + /* only one writer else abort */ + bat->next = obat; + if (!ATOMIC_PTR_CAS(&c->data, &bat->next, bat)) { + bat->next = NULL; + destroy_delta(bat); + return NULL; + } return bat; } @@ -833,9 +865,13 @@ bind_idx_data(sql_trans *tr, sql_idx *i) if(dup_bat(tr, i->t, obat, bat, (oid_index(i->type))?TYPE_oid:TYPE_lng, isNew(i)) == LOG_ERR) return NULL; bat->ts = tr->tid; - do { - bat->next = obat; - } while(!ATOMIC_PTR_CAS(&i->data, &bat->next, bat)); + /* only one writer else abort */ + bat->next = obat; + if (!ATOMIC_PTR_CAS(&i->data, &bat->next, bat)) { + bat->next = NULL; + destroy_delta(bat); + return NULL; + } return bat; } @@ -1162,9 +1198,13 @@ bind_del_data(sql_trans *tr, sql_table * bat->refcnt = 1; dup_dbat(tr, obat, bat, isNew(t), isTempTable(t)); bat->ts = tr->tid; - do { - bat->next = obat; - } while(!ATOMIC_PTR_CAS(&t->data, &bat->next, bat)); + /* only one writer else abort */ + bat->next = obat; + if (!ATOMIC_PTR_CAS(&t->data, &bat->next, bat)) { + bat->next = NULL; + destroy_dbat(bat); + return NULL; + } return bat; } @@ -1975,34 +2015,6 @@ log_destroy_delta(sql_trans *tr, sql_del } static int -destroy_delta(sql_delta *b) -{ - int ok = LOG_OK; - - if (--b->refcnt > 0) - return LOG_OK; - if (b->next) - ok = destroy_delta(b->next); - if (b->name) - _DELETE(b->name); - if (b->ibid) - temp_destroy(b->ibid); - if (b->uibid) - temp_destroy(b->uibid); - if (b->uvbid) - temp_destroy(b->uvbid); - if (b->bid) - temp_destroy(b->bid); - if (b->cached) - bat_destroy(b->cached); - b->bid = b->ibid = b->uibid = b->uvbid = 0; - b->name = NULL; - b->cached = NULL; - _DELETE(b); - return ok; -} - -static int destroy_col(sqlstore *store, sql_column *c) { (void)store; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Oct2020 - When computing the resulting decimal type, do...
Changeset: 084cd72813c8 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=084cd72813c8 Modified Files: sql/server/sql_semantic.c sql/test/miscellaneous/Tests/simple_selects.stable.out Branch: Oct2020 Log Message: When computing the resulting decimal type, don't upcast to largest available every time diffs (91 lines): diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c --- a/sql/server/sql_semantic.c +++ b/sql/server/sql_semantic.c @@ -185,14 +185,14 @@ result_datatype(sql_subtype *super, sql_ char *tpe = "varchar"; unsigned int digits = 0; if (!EC_VARCHAR(lclass)) { - tpe = r->type->sqlname; - digits = (!l->digits)?0:r->digits; + tpe = r->type->sqlname; + digits = (!l->digits)?0:r->digits; } else if (!EC_VARCHAR(rclass)) { - tpe = l->type->sqlname; - digits = (!r->digits)?0:l->digits; + tpe = l->type->sqlname; + digits = (!r->digits)?0:l->digits; } else { /* both */ - tpe = (l->type->base.id > r->type->base.id)?l->type->sqlname:r->type->sqlname; - digits = (!l->digits||!r->digits)?0:sql_max(l->digits, r->digits); + tpe = (l->type->base.id > r->type->base.id)?l->type->sqlname:r->type->sqlname; + digits = (!l->digits||!r->digits)?0:sql_max(l->digits, r->digits); } sql_find_subtype(super, tpe, digits, 0); /* case b blob */ @@ -206,30 +206,38 @@ result_datatype(sql_subtype *super, sql_ char *tpe = (l->type->base.id > r->type->base.id)?l->type->sqlname:r->type->sqlname; unsigned int digits = sql_max(l->digits, r->digits); unsigned int scale = sql_max(l->scale, r->scale); - if (l->type->radix == 10 || r->type->radix == 10) { - digits = 0; - /* change to radix 10 */ - if (l->type->radix == 2 && r->type->radix == 10) { - digits = bits2digits(l->type->digits); - digits = sql_max(r->digits, digits); - scale = r->scale; - } else if (l->type->radix == 10 && r->type->radix == 2) { - digits = bits2digits(r->type->digits); - digits = sql_max(l->digits, digits); - scale = l->scale; + + if (l->type->radix == 10 && r->type->radix == 10) { + digits = scale + (sql_max(l->digits - l->scale, r->digits - r->scale)); +#ifdef HAVE_HGE + if (digits > 39) { + digits = 39; +#else + if (digits > 19) { + digits = 19; +#endif + scale = MIN(scale, digits - 1); } + } else if (l->type->radix == 2 && r->type->radix == 10) { /* change to radix 10 */ + digits = bits2digits(l->type->digits); + digits = sql_max(r->digits, digits); + scale = r->scale; + } else if (l->type->radix == 10 && r->type->radix == 2) { /* change to radix 10 */ + digits = bits2digits(r->type->digits); + digits = sql_max(l->digits, digits); + scale = l->scale; } sql_find_subtype(super, tpe, digits, scale); /* case d approximate numeric */ } else if (EC_APPNUM(lclass) || EC_APPNUM(rclass)) { if (!EC_APPNUM(lclass)) { - *super = *r; + *super = *r; } else if (!EC_APPNUM(rclass)) { - *super = *l; + *super = *l; } else { /* both */ - char *tpe = (l->type->base.id > r->type->base.id)?l->type->sqlname:r->type->sqlname; - unsigned int digits = sql_max(l->digits, r->digits); /* bits precision */ - sql_find_subtype(super, tpe, digits, 0); + char *tpe = (l->type->base.id > r->type->base.id)?l->type->sqlname:r->type->sqlname; + unsigned int digits = sql_max(l->digits, r->digits); /* bits precision */ + sql_find_subtype(super, tpe, digits, 0); } /* now its getting serious, ie e any 'case e' datetime data type */ /* 'case f' interval types */ diff --git a/sql/test/miscellaneous/Tests/simple_selects.stable.out b/sql/test/miscellaneous/Tests/si
MonetDB: default - Approve new hashed output.
Changeset: af9d4548e9ad for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=af9d4548e9ad Modified Files: sql/test/Dependencies/Tests/dependency_DBobjects.test sql/test/Dependencies/Tests/dependency_owner_schema_3.test Branch: default Log Message: Approve new hashed output. diffs (34 lines): diff --git a/sql/test/Dependencies/Tests/dependency_DBobjects.test b/sql/test/Dependencies/Tests/dependency_DBobjects.test --- a/sql/test/Dependencies/Tests/dependency_DBobjects.test +++ b/sql/test/Dependencies/Tests/dependency_DBobjects.test @@ -298,7 +298,7 @@ DEP_INDEX query TTT rowsort SELECT c.name, f.name, 'DEP_FUNC' from sys.functions as f, sys.columns as c, sys.dependencies as dep where c.id = dep.id AND f.id = dep.depend_id AND dep.depend_type = 7 ORDER BY c.name, f.name -372 values hashing to 78fd640e374ca620ee5f10465e0caf4a +366 values hashing to cccf8f0385098793ac0698438837609a query TTT rowsort SELECT c.name, tri.name, 'DEP_TRIGGER' from sys.columns as c, sys.triggers as tri, sys.dependencies as dep where dep.id = c.id AND dep.depend_id =tri.id AND dep.depend_type = 8 order by c.name, tri.name @@ -511,4 +511,3 @@ DROP TABLE t1 statement ok DROP TABLE t3 - diff --git a/sql/test/Dependencies/Tests/dependency_owner_schema_3.test b/sql/test/Dependencies/Tests/dependency_owner_schema_3.test --- a/sql/test/Dependencies/Tests/dependency_owner_schema_3.test +++ b/sql/test/Dependencies/Tests/dependency_owner_schema_3.test @@ -190,7 +190,7 @@ SELECT c.name, i.name, 'DEP_INDEX' from query TTT rowsort SELECT c.name, f.name, 'DEP_FUNC' from sys.functions as f, sys.columns as c, sys.dependencies as dep where c.id = dep.id AND f.id = dep.depend_id AND dep.depend_type = 7 ORDER BY c.name, f.name -357 values hashing to 443639bbb626f6beccc4d57730d3beb9 +351 values hashing to 0357ee3f8bc7b05468e46a56d104a4e9 query TTT rowsort SELECT c.name, tri.name, 'DEP_TRIGGER' from sys.columns as c, sys.objects as tri, sys.dependencies as dep where dep.id = c.id AND dep.depend_id =tri.id AND dep.depend_type = 8 order by c.name, tri.name @@ -325,4 +325,3 @@ query TTT rowsort SELECT k.name, fk.name, 'DEP_FKEY' from sys.keys as k, sys.keys as fk where fk.rkey = k.id order by k.name, fk.name - ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - small cleanup and initial atomics
Changeset: 70ff34dcd93c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=70ff34dcd93c Modified Files: sql/storage/bat/bat_storage.c Branch: default Log Message: small cleanup and initial atomics diffs (282 lines): 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 @@ -11,6 +11,8 @@ #include "bat_utils.h" #include "sql_string.h" #include "gdk_atoms.h" +#include "gdk_atoms.h" +#include "matomic.h" /* * The sql data is stored using 2 structure @@ -96,17 +98,6 @@ temp_delta(sql_delta *d, ulng tid) return d; } -static sql_delta * -get_delta(sql_delta *d, ulng tid, int type, int is_temp) -{ - if (is_temp) { - d = temp_delta(d, tid); - if (!d) - return temp_dup_delta(tid, type); - } - return d; -} - static sql_dbat * temp_dup_dbat(ulng tid) { @@ -129,85 +120,87 @@ temp_dbat(sql_dbat *d, ulng tid) return d; } -static sql_dbat * -get_dbat(sql_dbat *d, ulng tid, int is_temp) +static sql_delta * +timestamp_delta( sql_trans *tr, sql_delta *d) { - if (is_temp) { - d = temp_dbat(d, tid); - if (!d) - return temp_dup_dbat(tid); - } + while (d->next && d->ts != tr->tid && (!tr->parent || !tr_version_of_parent(tr, d->ts)) && d->ts > tr->ts) + d = d->next; return d; } static sql_delta * -timestamp_delta( sql_trans *tr, sql_delta *d, int type, int is_temp) +temp_col_timestamp_delta( sql_trans *tr, sql_column *c) { - assert(!is_temp); - if (is_temp) - return get_delta(d, tr->tid, type, is_temp); - while (d->next && d->ts != tr->tid && (!tr->parent || !tr_version_of_parent(tr, d->ts)) && d->ts > tr->ts) - d = d->next; + assert(isTempTable(c->t)); + sql_delta *d = temp_delta(c->data, tr->tid); + if (!d) { + d = temp_dup_delta(tr->tid, c->type.type->localtype); + do { + d->next = c->data; + } while(!ATOMIC_PTR_CAS(&c->data, &d->next, d)); /* set c->data = d, when c->data == d->next else d->next = c->data */ + } return d; } sql_delta * col_timestamp_delta( sql_trans *tr, sql_column *c) { - int is_temp = isTempTable(c->t); - if (is_temp) { - sql_delta *d = temp_delta(c->data, tr->tid); - if (!d) { - d = temp_dup_delta(tr->tid, c->type.type->localtype); - d->next = c->data; - c->data = d; - } - return d; + if (isTempTable(c->t)) + return temp_col_timestamp_delta(tr, c); + return timestamp_delta( tr, c->data); +} + +static sql_delta * +temp_idx_timestamp_delta( sql_trans *tr, sql_idx *i) +{ + assert(isTempTable(i->t)); + sql_delta *d = temp_delta(i->data, tr->tid); + if (!d) { + int type = oid_index(i->type)?TYPE_oid:TYPE_lng; + d = temp_dup_delta(tr->tid, type); + do { + d->next = i->data; + } while(!ATOMIC_PTR_CAS(&i->data, &d->next, d)); /* set i->data = d, when i->data == d->next else d->next = i->data */ } - return timestamp_delta( tr, c->data, c->type.type->localtype, is_temp); + return d; } static sql_delta * idx_timestamp_delta( sql_trans *tr, sql_idx *i) { - int type = oid_index(i->type)?TYPE_oid:TYPE_lng; - int is_temp = isTempTable(i->t); - if (is_temp) { - sql_delta *d = temp_delta(i->data, tr->tid); - if (!d) { - d = temp_dup_delta(tr->tid, type); - d->next = i->data; - i->data = d; - } - return d; - } - return timestamp_delta( tr, i->data, type, is_temp); + if (isTempTable(i->t)) + return temp_idx_timestamp_delta(tr, i); + return timestamp_delta( tr, i->data); } static sql_dbat * -timestamp_dbat( sql_trans *tr, sql_dbat *d, int is_temp) +timestamp_dbat( sql_trans *tr, sql_dbat *d) { - if (is_temp) - return get_dbat(d, tr->tid, is_temp); while (d->next && d->ts != tr->tid && (!tr->parent || !tr_version_of_parent(tr, d->ts)) && d->ts > tr->ts) d = d->next; return d; } static sql_dbat * +temp_tab_timestamp_dbat( sql_trans *tr, sql_table *t) +{ + assert(isTempTable(t)); + sql_dbat *d = temp_dbat(t->data, tr->tid); + if (!d) { + d = temp_dup_dbat(tr->tid); + do { + d->next = t->data; + } while(!ATOMIC_PTR_CAS(&t->data, &d->next, d)); /* set t->data = d, when t->data == d->next else d->next = t->data */ + } + return d; +} + +static sql_dbat * tab_tim
MonetDB: default - Fix read-after-free.
Changeset: cd781d43018f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cd781d43018f Modified Files: sql/storage/objectset.c Branch: default Log Message: Fix read-after-free. diffs (60 lines): diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c --- a/sql/storage/objectset.c +++ b/sql/storage/objectset.c @@ -391,14 +391,14 @@ try_to_mark_deleted_for_destruction(sqls if (ov->state == deleted) { ov->state = under_destruction; - if (!ov->name_based_newer) { + if (!ov->name_based_newer || (os_atmc_get_state(ov->name_based_newer) & rollbacked)) { os_remove_name_based_chain(ov->os, store, ov->name_based_head); } else { ov->name_based_newer->name_based_older = NULL; } - if (!ov->id_based_newer) { + if (!ov->id_based_newer || (os_atmc_get_state(ov->id_based_newer) & rollbacked)) { os_remove_id_based_chain(ov->os, store, ov->id_based_head); } else { @@ -713,16 +713,16 @@ os_add_name_based(objectset *os, struct bte state = os_atmc_get_state(oo); if (state != active) { // This can only happen if the parent oo was a comitted deleted at some point. - assert(state == deleted || state == under_destruction); + assert(state == deleted || state == under_destruction || state == under_resurrection); /* Since our parent oo is comitted deleted objectversion, we might have a conflict with - * another transaction that tries to clean up oo. + * another transaction that tries to clean up oo or also wants to add a new objectversion. */ //TODO ATOMIC CAS if (oo->state == deleted) { oo->state = under_resurrection; } else { - return -1; /*conflict with cleaner*/ + return -1; /*conflict with cleaner or write-write conflict*/ } // END ATOMIC CAS } @@ -771,16 +771,16 @@ os_add_id_based(objectset *os, struct sq bte state = oo->state; if (state != active) { // This can only happen if the parent oo was a comitted deleted at some point. - assert(state == deleted || state == under_destruction); + assert(state == deleted || state == under_destruction || state == under_resurrection); /* Since our parent oo is comitted deleted objectversion, we might have a conflict with - * another transaction that tries to clean up oo. + * another transaction that tries to clean up oo or also wants to add a new objectversion. */ //TODO ATOMIC CAS if (oo->state == deleted) { oo->state = under_resurrection; } else { - return -1; /*conflict with cleaner*/ + return -1; /*conflict with cleaner or write-write conflict*/ } // END ATOMIC CAS } ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Re-converted test. Use right type for floatin...
Changeset: 4bf986377bfa for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4bf986377bfa Modified Files: sql/backends/monet5/generator/Tests/generator02.test Branch: default Log Message: Re-converted test. Use right type for floating-points diffs (62 lines): diff --git a/sql/backends/monet5/generator/Tests/generator02.test b/sql/backends/monet5/generator/Tests/generator02.test --- a/sql/backends/monet5/generator/Tests/generator02.test +++ b/sql/backends/monet5/generator/Tests/generator02.test @@ -9,16 +9,16 @@ 6.400 8.000 9.600 -query T rowsort +query R rowsort select * from generate_series(cast(0.0 as real),cast(10.0 as real),cast(1.6 as real)) -0.0 -1.6 -3.2 -4.8 -6.4 -8.0 -9.6 +0.000 +1.600 +3.200 +4.800 +6.400 +8.000 +9.600 query R rowsort select * from generate_series(cast(0.0 as double),cast(10.0 as double),cast(1.6 as double)) @@ -50,13 +50,13 @@ 0.100 1.870 3.640 -query T rowsort +query R rowsort select * from generate_series(cast(0.1 as real),cast(10.0 as real),cast(1.77 as real)) where value <5.0 -0.1 -1.87 -3.639 +0.100 +1.870 +3.640 query R rowsort select * from generate_series(cast(0.1 as double),cast(10.0 as double),cast(1.77 as double)) @@ -81,12 +81,12 @@ where value <7.0 and value >3.0 4.000 5.900 -query T rowsort +query R rowsort select * from generate_series(cast(0.2 as real),cast(10.0 as real),cast(1.9 as real)) as v where value <7.0 and value >3.0 -4.0 -5.896 +4.000 +5.900 query R rowsort select * from generate_series(cast(0.2 as double),cast(10.0 as double),cast(1.9 as double)) as v ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list