MonetDB: default - Approve 32 bit output.
Changeset: 48eb5cc65564 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/48eb5cc65564 Modified Files: sql/test/emptydb/Tests/check.stable.out.32bit Branch: default Log Message: Approve 32 bit output. diffs (226 lines): diff --git a/sql/test/emptydb/Tests/check.stable.out.32bit b/sql/test/emptydb/Tests/check.stable.out.32bit --- a/sql/test/emptydb/Tests/check.stable.out.32bit +++ b/sql/test/emptydb/Tests/check.stable.out.32bit @@ -154,6 +154,7 @@ \dSf sys."covar_pop" \dSf sys."covar_samp" \dSf sys."createorderindex" +\dSf sys."current_sessionid" \dSf sys."date_to_str" \dSf sys."date_trunc" \dSf sys."db_users" @@ -567,6 +568,7 @@ SYSTEM PROCEDUREsys.createorderi SYSTEM WINDOW sys.cume_dist SYSTEM FUNCTION sys.curdate SYSTEM FUNCTION sys.current_date +SYSTEM FUNCTION sys.current_sessionid SYSTEM FUNCTION sys.current_time SYSTEM FUNCTION sys.current_timestamp SYSTEM FUNCTION sys.curtime @@ -643,7 +645,6 @@ SYSTEM PROCEDUREsys.hot_snapshot SYSTEM FUNCTION sys.hour SYSTEM FUNCTION sys.identity SYSTEM FUNCTION sys.ifthenelse -SYSTEM FILTER FUNCTION sys.ilike SYSTEM FUNCTION sys.imprintsize SYSTEM FUNCTION sys.index SYSTEM FUNCTION sys.insert @@ -716,7 +717,6 @@ SYSTEM FUNCTION sys.newurl SYSTEM FUNCTION sys.next_value_for SYSTEM FUNCTION sys.not SYSTEM AGGREGATEsys.not_exist -SYSTEM FILTER FUNCTION sys.not_ilike SYSTEM FILTER FUNCTION sys.not_like SYSTEM AGGREGATEsys.not_unique SYSTEM WINDOW sys.nth_value @@ -1130,6 +1130,7 @@ create window covar_samp(e1 real, e2 rea create window covar_samp(e1 smallint, e2 smallint) returns double external name "sql"."covariance"; create window covar_samp(e1 tinyint, e2 tinyint) returns double external name "sql"."covariance"; create procedure sys.createorderindex(sys string, tab string, col string) external name sql.createorderindex; +create function sys.current_sessionid() returns int external name clients.current_sessionid; create function date_to_str(d date, format string) returns string external name mtime."date_to_str"; create function sys.date_trunc(txt string, t timestamp with time zone) returns timestamp with time zone external name sql.date_trunc; create function sys.date_trunc(txt string, t timestamp) returns timestamp external name sql.date_trunc; @@ -1150,7 +1151,7 @@ create procedure sys.droporderindex(sys create function sys.dump_database(describe boolean) returns table(o int, stmt string) begin set schema sys; truncate sys.dump_statements; insert into sys.dump_statements values (1, 'START TRANSACTION;'); insert into sys.dump_statements values ((select count(*) from sys.dump_statements) + 1, 'SET SCHEMA "sys";'); insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(), stmt from sys.dump_create_roles; insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(), stmt from sys.dump_create_users; insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(), stmt from sys.dump_create_schemas; insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(), stmt from sys.dump_user_defined_types; insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(), stmt from sys.dump_add_schemas_to_users; insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(), stmt from sys.dump_grant_user_privileges; insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(), stmt from sys.dump_sequences; insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(), stmt from sys.dump_start_sequences; insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(order by stmts.o), stmts.s from (select * from sys.dump_functions f union select * from sys.dump_tables t) as stmts(o, s); insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(), stmt from sys.dump_column_defaults; insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(), stmt from sys.dump_table_constraint_type; insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(), stmt from sys.dump_indices; insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(), stmt from sys.dump_foreign_keys; insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(), stmt from sys.dump_partition_tables; insert into sys.dump_statements select (select count(*) from sys.dump_statements) + rank() over(), stmt from sys.dump_triggers; insert into
MonetDB: default - Merge with Jul2021 branch.
Changeset: ed74c966801b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/ed74c966801b Modified Files: clients/Tests/exports.stable.out gdk/gdk_bat.c gdk/gdk_bbp.c gdk/gdk_calc.c gdk/gdk_hash.c gdk/gdk_hash.h gdk/gdk_join.c gdk/gdk_private.h gdk/gdk_select.c monetdb5/mal/CMakeLists.txt monetdb5/mal/mal_private.h monetdb5/modules/mal/mkey.c monetdb5/modules/mal/tracer.c sql/backends/monet5/sql.c sql/backends/monet5/sql_upgrades.c sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.ppc64.int128 sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.32bit sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.ppc64 sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.ppc64.int128 sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade/Tests/upgrade.stable.out sql/test/emptydb-upgrade/Tests/upgrade.stable.out.32bit sql/test/emptydb-upgrade/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.32bit sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade/Tests/upgrade.stable.out sql/test/testdb-upgrade/Tests/upgrade.stable.out.32bit sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128 testing/Mz.py.in testing/sqllogictest.py Branch: default Log Message: Merge with Jul2021 branch. diffs (truncated from 114122 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 @@ -331,6 +331,7 @@ gdk_return GDKtracer_set_adapter(const c gdk_return GDKtracer_set_component_level(const char *comp, const char *lvl); gdk_return GDKtracer_set_flush_level(const char *lvl); gdk_return GDKtracer_set_layer_level(const char *layer, const char *lvl); +gdk_return GDKtracer_set_tracefile(const char *tracefile); gdk_return GDKtracer_stop(void); size_t GDKuniqueid(size_t offset); gdk_return GDKupgradevarheap(BAT *b, var_t v, BUN cap, bool copyall) __attribute__((__warn_unused_result__)); @@ -895,6 +896,7 @@ const char *columnRef; const char *comment_onRef; const char *commitRef; str compileString(Symbol *fcn, Client c, str s); +char *concatErrors(char *err1, const char *err2) __attribute__((__nonnull__(1, 2))) __attribute__((__returns_nonnull__)); const char *connectRef; const char *contextRef; str convertConstant(malType type, ValPtr vr); diff --git a/clients/mapilib/monetdb-mapi.pc.in b/clients/mapilib/monetdb-mapi.pc.in --- a/clients/mapilib/monetdb-mapi.pc.in +++ b/clients/mapilib/monetdb-mapi.pc.in @@ -4,11 +4,15 @@ # # Copyright 1997 - July 2008 CWI, August 2008 - 2021 MonetDB B.V. +prefix=@CMAKE_INSTALL_PREFIX@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ + Name: monetdb-mapi Description: MonetDB MAPI C-client libary URL: https://www.monetdb.org/ Version: @MONETDB_VERSION@ Requires.private: monetdb-stream = @MONETDB_VERSION@ openssl -Libs: -L@CMAKE_INSTALL_FULL_LIBDIR@ -lmapi -Cflags: -I@CMAKE_INSTALL_FULL_INCLUDEDIR@/monetdb +Libs: -L${libdir} -lmapi +Cflags: -I${includedir}/monetdb diff --git a/common/stream/monetdb-stream.pc.in b/common/stream/monetdb-stream.pc.in --- a/common/stream/monetdb-stream.pc.in +++ b/common/stream/monetdb-stream.pc.in @@ -4,12 +4,16 @@ # # Copyright 1997 - July 2008 CWI, August 2008 - 2021 MonetDB B.V. +prefix=@CMAKE_INSTALL_PREFIX@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ + Name: monetdb-stream Description: MonetDB streams libary URL: https://www.monetdb.org/ Version: @MONETDB_VERSION@ Requires.private: @PKG_ZLIB@ @PKG_BZIP2@ @PKG_CURL@ @PKG_LZMA@ @PKG_SNAPPY@ -Libs: -L@CMAKE_INSTALL_FULL_LIBDIR@ -lstream +Libs: -L${libdir} -lstream Libs.private: @SOCKET_LIBS@ @PKG_LIBICONV@ -Cflags: -I@CMAKE_INSTALL_FULL_INCLUDEDIR@/monetdb +Cflags: -I${includedir}/monetdb diff --git a/ctest/monetdb5/mal/test_malEmbeddedBoot.c b/ctest/monetdb5/mal/test_malEmbeddedBoot.c --- a/ctest/monetdb5/mal/test_malEmbeddedBoot.c +++ b/ctest/monetdb5/mal/test_malEmbeddedBoot.c @@ -17,8 +17,8 @@ main(void) gdk_return gdk_res; gdk_res = GDKinit(NULL, 0, true); -if (gdk_res == GDK_FAIL) { - msg = createException(MAL, "embedded.monetdb_startup", "GDKinit() failed"); +if (gdk_res != GDK_SUCCEED) { + msg =
MonetDB: Jul2021 - Be more defensive with potential self referen...
Changeset: 0aa4c19a7eb6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/0aa4c19a7eb6 Modified Files: sql/server/rel_optimizer.c sql/test/SQLancer/Tests/sqlancer16.test Branch: Jul2021 Log Message: Be more defensive with potential self references created by rel_push_func_down optimizer diffs (169 lines): diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -1432,22 +1432,22 @@ exps_need_push_down( list *exps ) return 0; } -static sql_exp *exp_push_single_func_down(visitor *v, sql_rel *rel, sql_exp *e, int depth); +static sql_exp *exp_push_single_func_down(visitor *v, sql_rel *rel, sql_rel *ol, sql_rel *or, sql_exp *e, int depth); static list * -exps_push_single_func_down(visitor *v, sql_rel *rel, list *exps, int depth) +exps_push_single_func_down(visitor *v, sql_rel *rel, sql_rel *ol, sql_rel *or, list *exps, int depth) { if (mvc_highwater(v->sql)) return sql_error(v->sql, 10, SQLSTATE(42000) "Query too complex: running out of stack space"); for (node *n = exps->h; n; n = n->next) - if ((n->data = exp_push_single_func_down(v, rel, n->data, depth)) == NULL) + if ((n->data = exp_push_single_func_down(v, rel, ol, or, n->data, depth)) == NULL) return NULL; return exps; } static sql_exp * -exp_push_single_func_down(visitor *v, sql_rel *rel, sql_exp *e, int depth) +exp_push_single_func_down(visitor *v, sql_rel *rel, sql_rel *ol, sql_rel *or, sql_exp *e, int depth) { if (mvc_highwater(v->sql)) return sql_error(v->sql, 10, SQLSTATE(42000) "Query too complex: running out of stack space"); @@ -1455,26 +1455,26 @@ exp_push_single_func_down(visitor *v, sq switch(e->type) { case e_cmp: { if (e->flag == cmp_or || e->flag == cmp_filter) { - if ((e->l = exps_push_single_func_down(v, rel, e->l, depth + 1)) == NULL) + if ((e->l = exps_push_single_func_down(v, rel, ol, or, e->l, depth + 1)) == NULL) return NULL; - if ((e->r = exps_push_single_func_down(v, rel, e->r, depth + 1)) == NULL) + if ((e->r = exps_push_single_func_down(v, rel, ol, or, e->r, depth + 1)) == NULL) return NULL; } else if (e->flag == cmp_in || e->flag == cmp_notin) { - if ((e->l = exp_push_single_func_down(v, rel, e->l, depth + 1)) == NULL) + if ((e->l = exp_push_single_func_down(v, rel, ol, or, e->l, depth + 1)) == NULL) return NULL; - if ((e->r = exps_push_single_func_down(v, rel, e->r, depth + 1)) == NULL) + if ((e->r = exps_push_single_func_down(v, rel, ol, or, e->r, depth + 1)) == NULL) return NULL; } else { - if ((e->l = exp_push_single_func_down(v, rel, e->l, depth + 1)) == NULL) + if ((e->l = exp_push_single_func_down(v, rel, ol, or, e->l, depth + 1)) == NULL) return NULL; - if ((e->r = exp_push_single_func_down(v, rel, e->r, depth + 1)) == NULL) + if ((e->r = exp_push_single_func_down(v, rel, ol, or, e->r, depth + 1)) == NULL) return NULL; - if (e->f && (e->f = exp_push_single_func_down(v, rel, e->f, depth + 1)) == NULL) + if (e->f && (e->f = exp_push_single_func_down(v, rel, ol, or, e->f, depth + 1)) == NULL) return NULL; } } break; case e_convert: - if ((e->l = exp_push_single_func_down(v, rel, e->l, depth + 1)) == NULL) + if ((e->l = exp_push_single_func_down(v, rel, ol, or, e->l, depth + 1)) == NULL) return NULL; break; case e_aggr: @@ -1491,11 +1491,11 @@ exp_push_single_func_down(visitor *v, sq exp_label(v->sql->sa, e, ++v->sql->label); /* we need a full projection, group by's and unions cannot be extended with more expressions */ if (mustr) { - if (!is_simple_project(r->op) || !list_empty(r->r) || !r->l) + if (r == or) /* don't project twice */ rel->r = r = rel_project(v->sql->sa, r, rel_projections(v->sql, r, NULL, 1, 1)); list_append(r->exps, e); } else { - if (!is_simple_project(l->op) || !list_empty(l->r) || !l->l) + if (l == ol) /* don't project twice */
MonetDB: default - attempt lower timeout on sys.stop
Changeset: 0bab22842b80 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/0bab22842b80 Modified Files: monetdb5/mal/mal_interpreter.c Branch: default Log Message: attempt lower timeout on sys.stop diffs (20 lines): diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c --- a/monetdb5/mal/mal_interpreter.c +++ b/monetdb5/mal/mal_interpreter.c @@ -515,6 +515,8 @@ str runMALsequence(Client cntxt, MalBlkP exceptionVar = -1; QryCtx qry_ctx = {.querytimeout=cntxt->querytimeout, .starttime=mb->starttime}; + /* very short timeout */ + QryCtx qry_ctx_abort = {.querytimeout=100, .starttime=mb->starttime}; /* save, in case this function is called recursively */ QryCtx *qry_ctx_save = MT_thread_get_qry_ctx(); MT_thread_set_qry_ctx(_ctx); @@ -546,6 +548,7 @@ str runMALsequence(Client cntxt, MalBlkP if (stk->cmd == 'x' ) { stk->cmd = 0; stkpc = mb->stop; + MT_thread_set_qry_ctx(_ctx_abort); ret= createException(MAL, "mal.interpreter", "prematurely stopped client"); break; } ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - merge
Changeset: 0f97614b1db8 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/0f97614b1db8 Branch: default Log Message: merge diffs (88 lines): diff --git a/monetdb5/mal/mal_profiler.c b/monetdb5/mal/mal_profiler.c --- a/monetdb5/mal/mal_profiler.c +++ b/monetdb5/mal/mal_profiler.c @@ -209,6 +209,10 @@ prepareProfilerEvent(Client cntxt, MalBl if(malprofileruser!= MAL_ADMIN && malprofileruser != cntxt->user) return NULL; +/* align the variable namings with EXPLAIN and TRACE */ + if( pci->pc == 1 && start) + renameVariables(mb); + logbuf = (struct logbuf) {0}; usec= pci->clock; diff --git a/monetdb5/modules/mal/profiler.c b/monetdb5/modules/mal/profiler.c --- a/monetdb5/modules/mal/profiler.c +++ b/monetdb5/modules/mal/profiler.c @@ -90,6 +90,7 @@ CMDstartTrace(Client cntxt, MalBlkPtr mb (void) mb; (void) stk; (void) pci; + renameVariables(mb); // to keep in sink with explain return startTrace(cntxt); } diff --git a/monetdb5/optimizer/opt_dataflow.c b/monetdb5/optimizer/opt_dataflow.c --- a/monetdb5/optimizer/opt_dataflow.c +++ b/monetdb5/optimizer/opt_dataflow.c @@ -417,15 +417,21 @@ OPTdataflowImplementation(Client cntxt, // collect BAT variables garbage collected within the block if( !simple) for( k=q->retc; kargc; k++){ - if (getState(states,q,k) & VAR2READ && getEndScope(mb,getArg(q,k)) == j && isaBatType(getVarType(mb,getArg(q,k))) ) - top = dflowGarbagesink(cntxt, mb, getArg(q,k), sink, top); + if (getState(states,q,k) & VAR2READ && getEndScope(mb,getArg(q,k)) == j && isaBatType(getVarType(mb,getArg(q,k))) ){ + InstrPtr r; + top = dflowGarbagesink(cntxt, mb, getArg(q,k), sink, top); + r = newInstruction(NULL,languageRef, passRef); + getArg(r,0) = newTmpVariable(mb,TYPE_void); + r= addArgument(mb,r, getArg(q,k)); + pushInstruction(mb,r); + } } } /* exit parallel block */ if ( ! simple){ // force the pending final garbage statements - for( j=0; jbarrier= EXITsymbol; getArg(q,0) = flowblock; diff --git a/sql/backends/monet5/sql_execute.c b/sql/backends/monet5/sql_execute.c --- a/sql/backends/monet5/sql_execute.c +++ b/sql/backends/monet5/sql_execute.c @@ -189,6 +189,7 @@ SQLsetTrace(Client cntxt, MalBlkPtr mb) pushEndInstruction(mb); if( msg == MAL_SUCCEED) msg = chkTypes(cntxt->usermodule, mb, TRUE); + renameVariables(mb); return msg; } diff --git a/sql/test/Tests/setoptimizer.test b/sql/test/Tests/setoptimizer.test --- a/sql/test/Tests/setoptimizer.test +++ b/sql/test/Tests/setoptimizer.test @@ -29,7 +29,7 @@ query TTT nosort select * from optimizers() minimal_pipe -optimizer.inline();optimizer.remap();optimizer.bincopyfrom();optimizer.deadcode();optimizer.multiplex();optimizer.generator();optimizer.garbageCollector(); +optimizer.inline();optimizer.remap();optimizer.bincopyfrom();optimizer.deadcode();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.garbageCollector(); stable minimal_fast optimizer.minimalfast() diff --git a/testing/Mz.py.in b/testing/Mz.py.in --- a/testing/Mz.py.in +++ b/testing/Mz.py.in @@ -13,6 +13,7 @@ # which OUT/ERR differ or not and which tests were skipped. # dump HTML-stuff only at end # print an ascii summary at end, too +# - use sorting in .explain.functions_histogram # - if no diffs, but warnings, say so at end # - produce, keep & reference LOG # - add a "grep-like" function and replace "inlined" grep ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - add test for sys.stop
Changeset: 6bd49e0793a7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/6bd49e0793a7 Added Files: sql/test/sysmon/Tests/stop.SQL.py Modified Files: sql/test/sysmon/Tests/All Branch: default Log Message: add test for sys.stop diffs (56 lines): diff --git a/sql/test/sysmon/Tests/All b/sql/test/sysmon/Tests/All --- a/sql/test/sysmon/Tests/All +++ b/sql/test/sysmon/Tests/All @@ -6,3 +6,5 @@ timeout_cross timeout_join timeout_aggr timeout_select +stop + diff --git a/sql/test/sysmon/Tests/stop.SQL.py b/sql/test/sysmon/Tests/stop.SQL.py new file mode 100644 --- /dev/null +++ b/sql/test/sysmon/Tests/stop.SQL.py @@ -0,0 +1,42 @@ +from MonetDBtesting.sqltest import SQLTestCase +import threading +from time import sleep +import sys + +ERR = False + +def mine_excepthook(args): +global ERR +ERR = True + +# overide here because it ignores SystemExit +threading.excepthook = mine_excepthook + +def run_slow_qry(qry): +with SQLTestCase() as tc: +tc.execute(qry)\ +.assertFailed(err_message="prematurely stopped client") + +with SQLTestCase() as tc: +tc.drop() +tc.execute("create table foo(id bigserial, value int);").assertSucceeded() +tc.execute("create table bar(id bigserial, value int);").assertSucceeded() +tc.execute("insert into foo(value) (select * from generate_series(0,1));").assertSucceeded() +tc.execute("insert into bar(value) (select * from generate_series(0,1));").assertSucceeded() +qry = "select * from foo, bar;" +t = threading.Thread(target=run_slow_qry, args=(qry,)) +t.start() +sleep(1) +# get qry tag +tag = None +tc.execute(f"select tag from sys.queue where query='{qry}';").assertSucceeded() +data = tc.test_results[-1:].pop().data +if len(data) > 0: +tag = data.pop()[0] +tc.execute(f"call sys.stop({tag});").assertSucceeded() +t.join(timeout=3) +if ERR: +raise SystemExit(1) +if t.is_alive(): +raise SystemExit("stop long running query failed!") + ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: iso - Merged with Jul2021
Changeset: 849eaf61ce90 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/849eaf61ce90 Branch: iso Log Message: Merged with Jul2021 diffs (truncated from 2965 to 300 lines): diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c --- a/gdk/gdk_analytic_func.c +++ b/gdk/gdk_analytic_func.c @@ -89,14 +89,14 @@ ntile##IMP##TPE: \ #define ANALYTICAL_NTILE_SINGLE_IMP(TPE, LNG_HGE, UPCAST) \ do {\ TPE ntl = *(TPE*) ntile; \ - if (!is_##TPE##_nil(ntl) && ntl < 0) goto invalidntile; \ + if (!is_##TPE##_nil(ntl) && ntl <= 0) goto invalidntile; \ ANALYTICAL_NTILE(SINGLE, TPE, ntl, LNG_HGE, UPCAST, ;); \ } while (0) #define ANALYTICAL_NTILE_MULTI_IMP(TPE, LNG_HGE, UPCAST) \ do {\ TPE *restrict nn = (TPE*)Tloc(n, 0);\ - ANALYTICAL_NTILE(MULTI, TPE, nn[k], LNG_HGE, UPCAST, if (val < 0) goto invalidntile;); \ + ANALYTICAL_NTILE(MULTI, TPE, nn[k], LNG_HGE, UPCAST, if (val <= 0) goto invalidntile;); \ } while (0) gdk_return @@ -1838,7 +1838,7 @@ GDKanalyticalsum(BAT *r, BAT *p, BAT *o, bailout: GDKerror("42000!error while calculating floating-point sum\n"); res = GDK_FAIL; - goto cleanup; + goto cleanup; calc_overflow: GDKerror("22003!overflow in calculation.\n"); res = GDK_FAIL; diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c --- a/gdk/gdk_atoms.c +++ b/gdk/gdk_atoms.c @@ -914,9 +914,10 @@ mskWrite(const msk *a, stream *s, size_t } static void * -mskRead(msk *a, size_t *dstlen, stream *s, size_t cnt) +mskRead(msk *A, size_t *dstlen, stream *s, size_t cnt) { int8_t v; + msk *a = A; if (cnt != 1) return NULL; if (a == NULL || *dstlen == 0) { @@ -924,8 +925,11 @@ mskRead(msk *a, size_t *dstlen, stream * return NULL; *dstlen = 1; } - if (mnstr_readBte(s, ) != 1) + if (mnstr_readBte(s, ) != 1) { + if (a != A) + GDKfree(a); return NULL; + } *a = v != 0; return a; } diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -999,7 +999,9 @@ movestrbats(void) continue; char *oldpath = GDKfilepath(0, BATDIR, BBP_physical(b->batCacheid), "tail"); char *newpath = GDKfilepath(0, BATDIR, b->theap->filename, NULL); - int ret = MT_rename(oldpath, newpath); + int ret = -1; + if (oldpath != NULL && newpath != NULL) + ret = MT_rename(oldpath, newpath); GDKfree(oldpath); GDKfree(newpath); if (ret < 0) @@ -3134,8 +3136,11 @@ BBPsync(int cnt, bat *restrict subcommit MT_lock_set((i)); } BAT *b = dirty_bat(, subcommit != NULL); - if (i <= 0) + if (i <= 0) { + if (lock) + MT_lock_unset((subcommit ? subcommit[idx] : idx)); break; + } if (BBP_status(i) & BBPEXISTING) { if (b != NULL && BBPbackup(b, subcommit != NULL) != GDK_SUCCEED) { BBP_status_off(i, BBPSYNCING); diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -922,7 +922,12 @@ logger_create_types_file(logger *lg, con #elif defined(HAVE_FSYNC) && fsync(fileno(fp)) < 0 #endif - ) || fclose(fp) < 0) { + )) { + MT_remove(filename); + GDKerror("flushing log file %s failed", filename); + return GDK_FAIL; + } + if (fclose(fp) < 0) { MT_remove(filename); GDKerror("closing log file %s failed", filename); return GDK_FAIL; @@ -1242,6 +1247,7 @@ check_version(logger *lg, FILE *fp, cons assert(!lg->inmemory); if (fscanf(fp, "%6d", ) != 1) { GDKerror("Could not read the version number from the file '%s/log'.\n", lg->dir); + fclose(fp); return GDK_FAIL; } if (version < 52300) { /* first CATALOG_VERSION for "new" log format */ @@ -1250,8 +1256,10 @@ check_version(logger *lg, FILE *fp, cons lg->dcatalog = logbat_new(TYPE_oid, BATSIZE, PERSISTENT); if (lg->catalog_bid == NULL || lg->catalog_id == NULL || lg->dcatalog == NULL) { GDKerror("cannot create catalog bats"); + fclose(fp); return GDK_FAIL; } + /* old_logger_load always closes fp */ if
MonetDB: iso - More predicates to fix
Changeset: d8877f746297 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/d8877f746297 Modified Files: sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py Branch: iso Log Message: More predicates to fix diffs (52 lines): diff --git a/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py b/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py --- a/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py +++ b/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py @@ -39,8 +39,41 @@ with SQLTestCase() as mdb1: mdb1.execute('commit;').assertSucceeded() mdb2.execute('commit;').assertFailed(err_code="4", err_message="COMMIT: transaction is aborted because of concurrency conflicts, will ROLLBACK instead") +mdb1.execute('create table x(y int, z int);').assertSucceeded() +mdb1.execute('insert into x values (1, 1);').assertSucceeded() mdb1.execute('start transaction;').assertSucceeded() +mdb2.execute('start transaction;').assertSucceeded() +mdb1.execute("create view myv(a,b) as select y, z from x;").assertSucceeded() +mdb2.execute("alter table x drop column y;").assertSucceeded() +mdb1.execute('commit;').assertSucceeded() +mdb2.execute('commit;').assertFailed(err_code="4", err_message="COMMIT: transaction is aborted because of concurrency conflicts, will ROLLBACK instead") +mdb1.execute('select * from myv;').assertSucceeded().assertDataResultMatch([(1,1)]) + +mdb1.execute("create table ups.no (a int, b int);").assertSucceeded() +mdb1.execute('insert into ups.no values (2, 2);').assertSucceeded() +mdb1.execute('start transaction;').assertSucceeded() +mdb2.execute('start transaction;').assertSucceeded() +mdb1.execute("create function sys.another() returns table(i int) begin return select a from ups.no; end;").assertSucceeded() +mdb2.execute("alter table ups.no drop column a;").assertSucceeded() +mdb1.execute('commit;').assertSucceeded() +mdb2.execute('commit;').assertFailed(err_code="4", err_message="COMMIT: transaction is aborted because of concurrency conflicts, will ROLLBACK instead") +mdb1.execute('select * from another();').assertSucceeded().assertDataResultMatch([(2,2)]) + +mdb1.execute("CREATE TABLE y (i int);").assertSucceeded() +mdb1.execute('truncate integers;').assertSucceeded() +mdb1.execute('insert into integers values (1,1),(2,2),(3,3);').assertSucceeded() +mdb1.execute('start transaction;').assertSucceeded() +mdb2.execute('start transaction;').assertSucceeded() +mdb1.execute("alter table y add constraint nono foreign key(i) references integers(i)").assertSucceeded() +mdb2.execute("insert into y values (4)").assertSucceeded() # violates foreign key +mdb1.execute('commit;').assertSucceeded() +mdb2.execute('commit;').assertFailed(err_code="4", err_message="COMMIT: transaction is aborted because of concurrency conflicts, will ROLLBACK instead") + +mdb1.execute('start transaction;').assertSucceeded() +mdb1.execute('drop table y;').assertSucceeded() mdb1.execute('drop table integers;').assertSucceeded() +mdb1.execute('drop function another;').assertSucceeded() +mdb1.execute('drop table ups.no;').assertSucceeded() mdb1.execute('drop schema ups;').assertSucceeded() mdb1.execute('ALTER TABLE parent1 DROP TABLE child1;').assertSucceeded() mdb1.execute('DROP TABLE parent1;').assertSucceeded() @@ -48,4 +81,6 @@ with SQLTestCase() as mdb1: mdb1.execute('ALTER TABLE parent2 DROP TABLE child2;').assertSucceeded() mdb1.execute('DROP TABLE parent2;').assertSucceeded() mdb1.execute('DROP TABLE child2;').assertSucceeded() +mdb1.execute('DROP VIEW myv;').assertSucceeded() +mdb1.execute('DROP TABLE x;').assertSucceeded() mdb1.execute('commit;').assertSucceeded() ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Jul2021 - Remove references to --set sql_logdir: it no ...
Changeset: 7d2bf1a67acc for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/7d2bf1a67acc Modified Files: gdk/gdk_logger.c Branch: Jul2021 Log Message: Remove references to --set sql_logdir: it no longer exists. diffs (35 lines): diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -1732,11 +1732,7 @@ logger_load(int debug, const char *fn, c * shouldn't exist */ if (fp != NULL) { GDKerror("there is no logger catalog, " -"but there is a log file. " -"Are you sure you are using the correct " -"combination of database " -"(--dbpath) and log directory " -"(--set %s_logdir)?\n", fn); +"but there is a log file.\n"); goto error; } @@ -1800,17 +1796,7 @@ logger_load(int debug, const char *fn, c /* the catalog exists, and so should the log file */ if (fp == NULL && !LOG_DISABLED(lg)) { - GDKerror("There is a logger catalog, but no log file. " -"Are you sure you are using the correct " -"combination of database (--dbpath) and " -"log directory (--set %s_logdir)? " -"If you have done a recent update of the " -"server, it may be that your logs are in " -"an old location. You should then either use " -"--set %s_logdir= " -"or move the old log directory to the new " -"location (%s).\n", -fn, fn, lg->dir); + GDKerror("There is a logger catalog, but no log file.\n"); goto error; } if (fp != NULL) { ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Jul2021 - Coverity inspired fixes.
Changeset: 3fffd12ab87c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/3fffd12ab87c Modified Files: gdk/gdk_analytic_func.c gdk/gdk_atoms.c gdk/gdk_bbp.c gdk/gdk_logger.c gdk/gdk_logger_old.c gdk/gdk_select.c gdk/gdk_storage.c Branch: Jul2021 Log Message: Coverity inspired fixes. diffs (truncated from 400 to 300 lines): diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c --- a/gdk/gdk_analytic_func.c +++ b/gdk/gdk_analytic_func.c @@ -89,14 +89,14 @@ ntile##IMP##TPE: \ #define ANALYTICAL_NTILE_SINGLE_IMP(TPE, LNG_HGE, UPCAST) \ do {\ TPE ntl = *(TPE*) ntile; \ - if (!is_##TPE##_nil(ntl) && ntl < 0) goto invalidntile; \ + if (!is_##TPE##_nil(ntl) && ntl <= 0) goto invalidntile; \ ANALYTICAL_NTILE(SINGLE, TPE, ntl, LNG_HGE, UPCAST, ;); \ } while (0) #define ANALYTICAL_NTILE_MULTI_IMP(TPE, LNG_HGE, UPCAST) \ do {\ TPE *restrict nn = (TPE*)Tloc(n, 0);\ - ANALYTICAL_NTILE(MULTI, TPE, nn[k], LNG_HGE, UPCAST, if (val < 0) goto invalidntile;); \ + ANALYTICAL_NTILE(MULTI, TPE, nn[k], LNG_HGE, UPCAST, if (val <= 0) goto invalidntile;); \ } while (0) gdk_return @@ -1838,7 +1838,7 @@ GDKanalyticalsum(BAT *r, BAT *p, BAT *o, bailout: GDKerror("42000!error while calculating floating-point sum\n"); res = GDK_FAIL; - goto cleanup; + goto cleanup; calc_overflow: GDKerror("22003!overflow in calculation.\n"); res = GDK_FAIL; diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c --- a/gdk/gdk_atoms.c +++ b/gdk/gdk_atoms.c @@ -914,9 +914,10 @@ mskWrite(const msk *a, stream *s, size_t } static void * -mskRead(msk *a, size_t *dstlen, stream *s, size_t cnt) +mskRead(msk *A, size_t *dstlen, stream *s, size_t cnt) { int8_t v; + msk *a = A; if (cnt != 1) return NULL; if (a == NULL || *dstlen == 0) { @@ -924,8 +925,11 @@ mskRead(msk *a, size_t *dstlen, stream * return NULL; *dstlen = 1; } - if (mnstr_readBte(s, ) != 1) + if (mnstr_readBte(s, ) != 1) { + if (a != A) + GDKfree(a); return NULL; + } *a = v != 0; return a; } diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -999,7 +999,9 @@ movestrbats(void) continue; char *oldpath = GDKfilepath(0, BATDIR, BBP_physical(b->batCacheid), "tail"); char *newpath = GDKfilepath(0, BATDIR, b->theap->filename, NULL); - int ret = MT_rename(oldpath, newpath); + int ret = -1; + if (oldpath != NULL && newpath != NULL) + ret = MT_rename(oldpath, newpath); GDKfree(oldpath); GDKfree(newpath); if (ret < 0) @@ -3134,8 +3136,11 @@ BBPsync(int cnt, bat *restrict subcommit MT_lock_set((i)); } BAT *b = dirty_bat(, subcommit != NULL); - if (i <= 0) + if (i <= 0) { + if (lock) + MT_lock_unset((subcommit ? subcommit[idx] : idx)); break; + } if (BBP_status(i) & BBPEXISTING) { if (b != NULL && BBPbackup(b, subcommit != NULL) != GDK_SUCCEED) { BBP_status_off(i, BBPSYNCING); diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -922,7 +922,12 @@ logger_create_types_file(logger *lg, con #elif defined(HAVE_FSYNC) && fsync(fileno(fp)) < 0 #endif - ) || fclose(fp) < 0) { + )) { + MT_remove(filename); + GDKerror("flushing log file %s failed", filename); + return GDK_FAIL; + } + if (fclose(fp) < 0) { MT_remove(filename); GDKerror("closing log file %s failed", filename); return GDK_FAIL; @@ -1242,6 +1247,7 @@ check_version(logger *lg, FILE *fp, cons assert(!lg->inmemory); if (fscanf(fp, "%6d", ) != 1) { GDKerror("Could not read the version number from the file '%s/log'.\n", lg->dir); + fclose(fp); return GDK_FAIL; } if (version < 52300) { /* first CATALOG_VERSION for "new" log format */ @@ -1250,8 +1256,10 @@ check_version(logger *lg, FILE *fp, cons lg->dcatalog = logbat_new(TYPE_oid, BATSIZE, PERSISTENT); if (lg->catalog_bid == NULL || lg->catalog_id == NULL || lg->dcatalog == NULL) { GDKerror("cannot
MonetDB: iso - Adding more predicates
Changeset: 57efa07c77d9 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/57efa07c77d9 Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_cat.c Branch: iso Log Message: Adding more predicates diffs (118 lines): diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -4098,6 +4098,7 @@ static stmt * insert_check_fkey(backend *be, list *inserts, sql_key *k, stmt *idx_inserts, stmt *pin) { mvc *sql = be->mvc; + sql_trans *tr = sql->session->tr; char *msg = NULL; stmt *cs = list_fetch(inserts, 0), *s = cs; sql_subtype *lng = sql_bind_localtype("lng"); @@ -4105,6 +4106,13 @@ insert_check_fkey(backend *be, list *ins sql_subtype *bt = sql_bind_localtype("bit"); sql_subfunc *ne = sql_bind_func_result(sql, "sys", "<>", F_FUNC, bt, 2, lng, lng); + for (node *m = k->columns->h; m; m = m->next) { + sql_kc *c = m->data; + + /* foreach column add predicate */ + tr->predicates = add_predicate(sql->pa, tr->predicates, c->c); + } + if (pin && list_length(pin->op4.lval)) s = pin->op4.lval->h->data; if (s->key && s->nrcols == 0) { @@ -4206,6 +4214,7 @@ static void sql_insert_check_null(backend *be, sql_table *t, list *inserts) { mvc *sql = be->mvc; + sql_trans *tr = sql->session->tr; node *m, *n; sql_subfunc *cnt = sql_bind_func(sql, "sys", "count", sql_bind_localtype("void"), NULL, F_AGGR); @@ -4218,6 +4227,9 @@ sql_insert_check_null(backend *be, sql_t stmt *s = i; char *msg = NULL; + /* foreach column add predicate */ + tr->predicates = add_predicate(sql->pa, tr->predicates, c); + if (!(s->key && s->nrcols == 0)) { s = stmt_selectnil(be, column(be, i)); s = stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1); diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c --- a/sql/backends/monet5/sql_cat.c +++ b/sql/backends/monet5/sql_cat.c @@ -45,6 +45,17 @@ if (store_readonly(sql->session->tr->store))\ throw(SQL,"sql.cat",SQLSTATE(25006) "Schema statements cannot be executed on a readonly database."); +static list * +add_predicate(sql_allocator *sa, list *l, sql_column *c) +{ + pl *p = SA_ZNEW(sa, pl); + p->c = c; + if (!l) + l = sa_list(sa); + list_append(l, p); + return l; +} + static char * SaveArgReference(MalStkPtr stk, InstrPtr pci, int arg) { @@ -202,6 +213,7 @@ static char * alter_table_add_range_partition(mvc *sql, char *msname, char *mtname, char *psname, char *ptname, ptr min, ptr max, bit with_nills, int update) { + sql_trans *tr = sql->session->tr; sql_table *mt = NULL, *pt = NULL; sql_part *err = NULL; str msg = MAL_SUCCEED, err_min = NULL, err_max = NULL, conflict_err_min = NULL, conflict_err_max = NULL; @@ -319,6 +331,18 @@ alter_table_add_range_partition(mvc *sql } finish: + if (!msg) { + if (isPartitionedByColumnTable(mt)) { + sql_column *c = list_fetch(pt->columns->l, mt->part.pcol->colnr); + tr->predicates = add_predicate(sql->pa, tr->predicates, c); + } else { + for (node *n = mt->part.pexp->cols->h; n; n = n->next) { + int next = *(int*) n->data; + sql_column *c = list_fetch(pt->columns->l, next); + tr->predicates = add_predicate(sql->pa, tr->predicates, c); + } + } + } if (err_min) GDKfree(err_min); if (err_max) @@ -334,6 +358,7 @@ static char * alter_table_add_value_partition(mvc *sql, MalStkPtr stk, InstrPtr pci, char *msname, char *mtname, char *psname, char *ptname, bit with_nills, int update) { + sql_trans *tr = sql->session->tr; sql_table *mt = NULL, *pt = NULL; str msg = MAL_SUCCEED; sql_part *err = NULL; @@ -420,6 +445,18 @@ alter_table_add_value_partition(mvc *sql } finish: + if (!msg) { + if (isPartitionedByColumnTable(mt)) { + sql_column *c = list_fetch(pt->columns->l, mt->part.pcol->colnr); + tr->predicates = add_predicate(sql->pa, tr->predicates, c); + } else { + for (node *n = mt->part.pexp->cols->h; n; n = n->next) { + int next = *(int*) n->data; + sql_column *c =
MonetDB: Jul2021 - Approve new plan.
Changeset: 734333d6e5eb for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/734333d6e5eb Modified Files: sql/test/miscellaneous/Tests/simple_plans.test Branch: Jul2021 Log Message: Approve new plan. diffs (18 lines): diff --git a/sql/test/miscellaneous/Tests/simple_plans.test b/sql/test/miscellaneous/Tests/simple_plans.test --- a/sql/test/miscellaneous/Tests/simple_plans.test +++ b/sql/test/miscellaneous/Tests/simple_plans.test @@ -474,12 +474,8 @@ plan select count(*) from another_t t1, project ( | project ( | | crossproduct ( -| | | group by ( -| | | | table("sys"."another_t") [ "another_t"."%TID%" NOT NULL as "t1"."%TID%" ] COUNT -| | | ) [ ] [ "sys"."count"() NOT NULL as "%2"."%2" ], -| | | group by ( -| | | | table("sys"."another_t") [ "another_t"."%TID%" NOT NULL as "t2"."%TID%" ] COUNT -| | | ) [ ] [ "sys"."count"() NOT NULL as "%3"."%3" ] +| | | [ "sys"."cnt"(clob "sys", clob "another_t") NOT NULL as "%2"."%2" ], +| | | [ "sys"."cnt"(clob "sys", clob "another_t") NOT NULL as "%3"."%3" ] | | ) [ ] | ) [ "sys"."sql_mul"("%2"."%2" NOT NULL, "%3"."%3" NOT NULL) NOT NULL as "%1"."%1" ] ) [ "%1"."%1" NOT NULL ] ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Jul2021 - Fix test by adding table to merge table.
Changeset: dfde312b4e50 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/dfde312b4e50 Modified Files: sql/test/mergetables/Tests/addtable.test Branch: Jul2021 Log Message: Fix test by adding table to merge table. diffs (20 lines): diff --git a/sql/test/mergetables/Tests/addtable.test b/sql/test/mergetables/Tests/addtable.test --- a/sql/test/mergetables/Tests/addtable.test +++ b/sql/test/mergetables/Tests/addtable.test @@ -34,7 +34,10 @@ create merge table ups(a int) statement ok create table notsame(b int) -statement ok rowcount 2 +statement ok +alter table ups add table notsame + +statement ok rowcount 1 insert into notsame values (1) query II rowsort @@ -75,3 +78,4 @@ 2 statement ok rollback + ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Jul2021 - Don't stop processing input when we encounter...
Changeset: c2e65485 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/c2e65485 Modified Files: testing/sqllogictest.py Branch: Jul2021 Log Message: Don't stop processing input when we encounter a comment. diffs (14 lines): diff --git a/testing/sqllogictest.py b/testing/sqllogictest.py --- a/testing/sqllogictest.py +++ b/testing/sqllogictest.py @@ -610,7 +610,9 @@ class SQLLogic: if not line: break if line[0] == '#': # skip mal comments -break +if self.approve: +self.approve.write(line) +continue conn = None # look for connection string if line.startswith('@connection'): ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Jul2021 - Sort explain.function_histogram output (and a...
Changeset: 1020e1b87dae for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/1020e1b87dae Modified Files: sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.test sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.test sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test sql/test/BugTracker/Tests/explain.SF-1739353.test sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.test sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-0join-query.test sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-0join-view.test sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-query.test sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-view.test sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-query.test sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-view.test sql/test/SQLancer/Tests/sqlancer10.test sql/test/SQLancer/Tests/sqlancer13.test sql/test/mapi/Tests/sql_int128.test sql/test/miscellaneous/Tests/simple_plans.test sql/test/remote/Tests/partition_elim.test testing/explain.py Branch: Jul2021 Log Message: Sort explain.function_histogram output (and also explain.function_with_more_than_one_result_bat) diffs (truncated from 2260 to 300 lines): diff --git a/sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.test b/sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.test --- a/sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.test +++ b/sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.test @@ -105,174 +105,160 @@ top N ( query T python .explain.function_histogram EXPLAIN select * from oblo -user.main -1 -querylog.define -1 -sql.mvc -1 -sql.tid -1 -sql.bind -1 -sql.emptybind -1 -sql.delta -1 algebra.projection 1 bat.pack 5 +querylog.define +1 +sql.bind +1 +sql.delta +1 +sql.emptybind +1 +sql.mvc +1 sql.resultSet 1 +sql.tid +1 +user.main +1 query T python .explain.function_histogram EXPLAIN select * from oblo OFFSET 2 -user.main -1 -querylog.define -1 -sql.mvc -1 -sql.tid -1 -sql.bind -1 -sql.emptybind -1 -sql.delta -1 algebra.projection 2 algebra.subslice 1 bat.pack 5 +querylog.define +1 +sql.bind +1 +sql.delta +1 +sql.emptybind +1 +sql.mvc +1 sql.resultSet 1 +sql.tid +1 +user.main +1 query T python .explain.function_histogram EXPLAIN select * from oblo LIMIT 2 -user.main -1 -querylog.define -1 -sql.mvc -1 -sql.tid -1 -sql.bind -1 -sql.emptybind -1 -sql.delta -1 algebra.projection 2 algebra.subslice 1 bat.pack 5 +querylog.define +1 +sql.bind +1 +sql.delta +1 +sql.emptybind +1 +sql.mvc +1 sql.resultSet 1 +sql.tid +1 +user.main +1 query T python .explain.function_histogram EXPLAIN select * from oblo LIMIT 1 OFFSET 2 -user.main -1 -querylog.define -1 -sql.mvc -1 -sql.tid -1 -sql.bind -1 -sql.emptybind -1 -sql.delta -1 algebra.projection 2 algebra.subslice 1 bat.pack 5 +querylog.define +1 +sql.bind +1 +sql.delta +1 +sql.emptybind +1 +sql.mvc +1 sql.resultSet 1 +sql.tid +1 +user.main +1 query T python .explain.function_histogram EXPLAIN select * from oblo LIMIT 2 OFFSET 1 -user.main -1 -querylog.define -1 -sql.mvc -1 -sql.tid -1 -sql.bind -1 -sql.emptybind -1 -sql.delta -1 algebra.projection 2 algebra.subslice 1 bat.pack 5 +querylog.define +1 +sql.bind +1 +sql.delta +1 +sql.emptybind +1 +sql.mvc +1 sql.resultSet 1 +sql.tid +1 +user.main +1 query T python .explain.function_histogram EXPLAIN select * from oblo ORDER BY a -user.main -1 -querylog.define -1 -sql.mvc -1 -sql.tid -1 -sql.bind -1 -sql.emptybind -1 -sql.delta -1 algebra.projection 2 algebra.sort 1 bat.pack 5 +querylog.define +1 +sql.bind +1 +sql.delta +1 +sql.emptybind +1 +sql.mvc +1 sql.resultSet 1 +sql.tid +1 +user.main +1 query T python .explain.function_histogram EXPLAIN select * from oblo ORDER BY a OFFSET 2 -user.main -1 -querylog.define -1 -sql.mvc -1 -sql.tid -1 -sql.bind -1 -sql.emptybind -1 -sql.delta -1 algebra.projection 3 algebra.sort @@ -281,98 +267,112 @@ algebra.subslice 1 bat.pack 5 +querylog.define +1 +sql.bind +1 +sql.delta +1 +sql.emptybind +1 +sql.mvc +1 sql.resultSet 1 +sql.tid +1 +user.main +1 query T python .explain.function_histogram EXPLAIN select * from oblo ORDER BY a LIMIT 2 -user.main -1 -querylog.define -1 -sql.mvc -1 -sql.tid -1 -sql.bind -1 -sql.emptybind -1 -sql.delta +algebra.firstn ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Jul2021 - Fix some test output types.
Changeset: 6b2527eb7a16 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/6b2527eb7a16 Modified Files: sql/test/SQLancer/Tests/sqlancer13.test sql/test/SQLancer/Tests/sqlancer16.test Branch: Jul2021 Log Message: Fix some test output types. diffs (255 lines): diff --git a/sql/test/SQLancer/Tests/sqlancer13.test b/sql/test/SQLancer/Tests/sqlancer13.test --- a/sql/test/SQLancer/Tests/sqlancer13.test +++ b/sql/test/SQLancer/Tests/sqlancer13.test @@ -191,7 +191,7 @@ query I rowsort SELECT 1 FROM t2, t1 WHERE (t2.c0 > 4 OR false) AND (CASE WHEN 9 IN (t2.c0, t1.c2) THEN TRUE END) -query T rowsort +query I rowsort SELECT t1.c2 FROM t2, t1 WHERE (t2.c0)^(2))) NOT BETWEEN SYMMETRIC (least(t1.c2, t1.c2)) AND (4))AND(NOT (TRUEOR(least(FALSE, FALSEAND(CASE WHEN (9) NOT IN (t2.c0, t1.c2) THEN TRUE ELSE greatest(TRUE, FALSE) END)) @@ -388,7 +388,64 @@ 108 query I rowsort SELECT 1 FROM t0, t1 CROSS JOIN (SELECT DISTINCT t1.c0 > 4 FROM t1, t2 WHERE t2.c2) AS sub0 WHERE (('Bw') NOT IN (least(t0.c2, t0.c2), CAST(t1.c0 AS VARCHAR(64 IS NULL -58 values hashing to 8fdc0683e1f7f9ff9590af46dca75282 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 statement ok ROLLBACK @@ -399,13 +456,13 @@ START TRANSACTION statement ok CREATE TABLE "sys"."t1" ("c3" BOOLEAN) -query T rowsort +query R rowsort select (345*(case when t1.c3 then 0 else 58.9 end))*3 from t1 union all select (345*(case when t1.c3 then 0 else 58.9 end))*3 from t1 -query T rowsort +query R rowsort select (11*(case when t1.c3 then 0 else 0.57 end))*3 from t1 union all select (11*(case when t1.c3 then 0 else 0.57 end))*3 from t1 @@ -414,10 +471,10 @@ select (11*(case when t1.c3 then 0 else statement ok ROLLBACK -query T rowsort +query R rowsort select round((0.52)*(0.10), -8) -0. +0.000 statement ok START TRANSACTION @@ -551,26 +608,26 @@ SELECT CAST(10)+(0.3607000614109831) 102 values hashing to a98471bd784fc82e6e3165302bc0080a -query T rowsort +query I rowsort SELECT t1.c2 > 10 + 0.3607000614109831 FROM t1 -False -False -False +0 +0 +0 -query T rowsort +query I rowsort SELECT t1.c2 > 10 + 0.36 FROM t1 -False -False -False +0 +0 +0 -query T rowsort +query I rowsort SELECT t1.c2 > 10 + 0.36111 FROM t1 -False -False -False +0 +0 +0 query I rowsort SELECT CAST(SUM(count) AS BIGINT) FROM (SELECT CAST(10)+(0.3607000614109831)))<(least(t1.c2, t1.c2))) AS INT) as count FROM t0, t1) as res @@ -761,43 +818,43 @@ INSERT INTO t0(c0) VALUES(BLOB ''), (BLO statement ok INSERT INTO t2(c0) VALUES(BLOB '050aC56fd0') -query T rowsort +query I rowsort SELECT '' >= t1.c3 FROM t0, t1, t2 -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False -False +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 statement ok DROP TABLE t0 diff --git a/sql/test/SQLancer/Tests/sqlancer16.test b/sql/test/SQLancer/Tests/sqlancer16.test --- a/sql/test/SQLancer/Tests/sqlancer16.test +++ b/sql/test/SQLancer/Tests/sqlancer16.test @@ -106,7 +106,7 @@ CREATE TABLE "t1" ("c2" BIGINT NOT NULL, statement ok rowcount 4 INSERT INTO "t1" VALUES (69), (-12), (9), (0) -query T rowsort +query I rowsort SELECT -3 < least((SELECT 1 WHERE FALSE), (SELECT DISTINCT 2 FROM t1)) FROM t1 True @@ -122,7 +122,7 @@ 0 69 9 -query T rowsort +query I rowsort SELECT least((SELECT 1 WHERE FALSE), (SELECT DISTINCT 2 FROM t1)) > -3 FROM t1 True @@ -151,7 +151,7 @@ statement ok rowcount 9 INSERT INTO "t0" VALUES (INTERVAL '6' SECOND),(INTERVAL '9' SECOND),(INTERVAL '1' SECOND), (INTERVAL '0' SECOND),(INTERVAL '9' SECOND),(INTERVAL '4' SECOND),(INTERVAL '6' SECOND),(INTERVAL '1' SECOND),(NULL) -query T rowsort +query I rowsort SELECT (SELECT 2 WHERE FALSE) = ANY(SELECT 3 WHERE FALSE) False ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Oct2020 - Added test and fix for bug #7142. Only regula...
Changeset: 358cb6f436fb for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/358cb6f436fb Added Files: sql/test/BugTracker-2021/Tests/aggregates-tables.Bug-7142.sql sql/test/BugTracker-2021/Tests/aggregates-tables.Bug-7142.stable.err sql/test/BugTracker-2021/Tests/aggregates-tables.Bug-7142.stable.out Modified Files: sql/server/rel_psm.c sql/test/BugTracker-2021/Tests/All Branch: Oct2020 Log Message: Added test and fix for bug #7142. Only regular functions can return tables diffs (129 lines): diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c --- a/sql/server/rel_psm.c +++ b/sql/server/rel_psm.c @@ -862,11 +862,15 @@ rel_create_func(sql_query *query, dlist int instantiate = (sql->emode == m_instantiate); int deps = (sql->emode == m_deps); int create = (!instantiate && !deps); - bit vararg = FALSE; + bit vararg = FALSE, union_err = 0; char *F = NULL, *fn = NULL, is_func; - if (res && res->token == SQL_TABLE) - type = F_UNION; + if (res && res->token == SQL_TABLE) { + if (type == F_FUNC) + type = F_UNION; + else + union_err = 1; + } FUNC_TYPE_STR(type) @@ -876,7 +880,9 @@ rel_create_func(sql_query *query, dlist if (STORE_READONLY && create) return sql_error(sql, 06, SQLSTATE(42000) "Schema statements cannot be executed on a readonly database."); - if (res && type == F_PROC) + if (union_err) + return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: %ss cannot return tables", F, fn); + else if (res && type == F_PROC) return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: procedures cannot have return parameters", F); else if (res && (type == F_FILT || type == F_LOADER)) return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: %s functions don't have to specify a return type", F, fn); diff --git a/sql/test/BugTracker-2021/Tests/All b/sql/test/BugTracker-2021/Tests/All --- a/sql/test/BugTracker-2021/Tests/All +++ b/sql/test/BugTracker-2021/Tests/All @@ -13,3 +13,4 @@ batappend-undefined.Bug-7130 KNOWNFAIL?WITH-alias-DELETE-1.deletes-wrong-tuples.Bug-7133 KNOWNFAIL?WITH-alias-DELETE-2.deletes-too-many-tuples.Bug-7133 HAVE_LIBPY3?python-aggregates-void-bat.Bug-7138 +HAVE_LIBPY3?aggregates-tables.Bug-7142 diff --git a/sql/test/BugTracker-2021/Tests/aggregates-tables.Bug-7142.sql b/sql/test/BugTracker-2021/Tests/aggregates-tables.Bug-7142.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2021/Tests/aggregates-tables.Bug-7142.sql @@ -0,0 +1,29 @@ +START TRANSACTION; + +CREATE AGGREGATE linear_least_squares(xg DOUBLE, yg DOUBLE) +RETURNS TABLE (a DOUBLE, b DOUBLE) +LANGUAGE PYTHON { +import numpy as np +# Define an inner function to do the work +def perform_least_squares(x, y): +mx = np.average(x) +my = np.average(y) +N = len(x) +a = (np.dot(x,y) - mx*my)/(np.dot(x,x) - N*mx*mx) +b = (my*np.dot(x,x) - mx*(np.dot(x,y)))/(np.dot(x,x) - N*mx*mx) +return [a, b] +ab = {"a": list(), "b": list()} +try: +groups = np.unique(aggr_group) +for i in range(groups): +a,b = perform_least_squares(xg[aggr_group==groups[i]], yg[aggr_group==groups[i]]) +ab["a"].append(a) +ab["b"].append(b) +except NameError: +a,b = perform_least_squares(xg, yg) +ab["a"].append(a) +ab["b"].append(b) +return ab +}; + +ROLLBACK; diff --git a/sql/test/BugTracker-2021/Tests/aggregates-tables.Bug-7142.stable.err b/sql/test/BugTracker-2021/Tests/aggregates-tables.Bug-7142.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2021/Tests/aggregates-tables.Bug-7142.stable.err @@ -0,0 +1,30 @@ +stderr of test 'aggregates-tables.Bug-7142` in directory 'sql/test/BugTracker-2021` itself: + + +# 11:30:33 > +# 11:30:33 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-218832" "--port=38265" +# 11:30:33 > + +MAPI = (monetdb) /var/tmp/mtest-218832/.s.monetdb.38265 +QUERY = CREATE AGGREGATE linear_least_squares(xg DOUBLE, yg DOUBLE) +RETURNS TABLE (a DOUBLE, b DOUBLE) +LANGUAGE PYTHON { +import numpy as np +# Define an inner function to do the work +def perform_least_squares(x, y): +mx = np.average(x) +my = np.average(y) +N = len(x) +a = (np.dot(x,y) - mx*my)/(np.dot(x,x) - N*mx*mx) +b = (my*np.dot(x,x) - mx*(np.dot(x,y)))/(np.dot(x,x) - N*mx*mx) +return [a, b] +ab = {"a": list(), "b": list()} +try: +groups = np.unique(aggr_group) +ERROR = !CREATE AGGREGATE: aggregates cannot return tables +CODE = 42000 + +# 11:30:33 > +# 11:30:33 > "Done." +#
MonetDB: default - Also align variables during profiling
Changeset: 61e18cba214a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/61e18cba214a Modified Files: monetdb5/mal/mal_profiler.c Branch: default Log Message: Also align variables during profiling diffs (14 lines): diff --git a/monetdb5/mal/mal_profiler.c b/monetdb5/mal/mal_profiler.c --- a/monetdb5/mal/mal_profiler.c +++ b/monetdb5/mal/mal_profiler.c @@ -209,6 +209,10 @@ prepareProfilerEvent(Client cntxt, MalBl if(malprofileruser!= MAL_ADMIN && malprofileruser != cntxt->user) return NULL; +/* align the variable namings with EXPLAIN and TRACE */ + if( pci->pc == 1 && start) + renameVariables(mb); + logbuf = (struct logbuf) {0}; usec= pci->clock; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Align variable names in TRACE and EXPLAIN
Changeset: 8617e2b4cf31 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/8617e2b4cf31 Modified Files: monetdb5/modules/mal/profiler.c sql/backends/monet5/sql_execute.c Branch: default Log Message: Align variable names in TRACE and EXPLAIN diffs (22 lines): diff --git a/monetdb5/modules/mal/profiler.c b/monetdb5/modules/mal/profiler.c --- a/monetdb5/modules/mal/profiler.c +++ b/monetdb5/modules/mal/profiler.c @@ -90,6 +90,7 @@ CMDstartTrace(Client cntxt, MalBlkPtr mb (void) mb; (void) stk; (void) pci; + renameVariables(mb); // to keep in sink with explain return startTrace(cntxt); } diff --git a/sql/backends/monet5/sql_execute.c b/sql/backends/monet5/sql_execute.c --- a/sql/backends/monet5/sql_execute.c +++ b/sql/backends/monet5/sql_execute.c @@ -189,6 +189,7 @@ SQLsetTrace(Client cntxt, MalBlkPtr mb) pushEndInstruction(mb); if( msg == MAL_SUCCEED) msg = chkTypes(cntxt->usermodule, mb, TRUE); + renameVariables(mb); return msg; } ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: iso - More crude protection for merge tables and changi...
Changeset: 6aaea4bc569c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/6aaea4bc569c Modified Files: sql/storage/store.c sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py Branch: iso Log Message: More crude protection for merge tables and changing schemas diffs (36 lines): diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -4607,6 +4607,8 @@ sql_trans_add_table(sql_trans *tr, sql_t int res = 0; sql_table *dup = NULL; + if (os_has_changes(mt->s->parts, tr)) /* for inserts disallow concurrent transactions */ + return -2; /* merge table depends on part table */ if ((res = sql_trans_create_dependency(tr, pt->base.id, mt->base.id, TABLE_DEPENDENCY))) return res; @@ -4933,6 +4935,8 @@ sql_trans_set_table_schema(sql_trans *tr oid rid; int res = 0; + if (os_has_changes(os->parts, tr)) /* because of merge tables disallow if there are changes there */ + return -2; rid = store->table_api.column_find_row(tr, find_sql_column(systable, "id"), >base.id, NULL); assert(!is_oid_nil(rid)); if ((res = store->table_api.column_update_value(tr, find_sql_column(systable, "schema_id"), rid, &(ns->base.id diff --git a/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py b/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py --- a/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py +++ b/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py @@ -26,9 +26,9 @@ with SQLTestCase() as mdb1: mdb1.execute('start transaction;').assertSucceeded() mdb2.execute('start transaction;').assertSucceeded() mdb1.execute("ALTER TABLE parent1 ADD TABLE child1 AS PARTITION FROM '1' TO '2';").assertSucceeded() # these merge tables are very difficult, maybe allow only 1 transaction on the system? -mdb2.execute("alter table child1 set schema ups;").assertSucceeded() +mdb2.execute("alter table child1 set schema ups;").assertFailed(err_code="42000", err_message="ALTER TABLE: transaction conflict detected") mdb1.execute('commit;').assertSucceeded() -mdb2.execute('commit;').assertFailed(err_code="4", err_message="COMMIT: transaction is aborted because of concurrency conflicts, will ROLLBACK instead") +mdb2.execute('rollback;').assertSucceeded() mdb1.execute('create merge table parent2(a int) PARTITION BY RANGE ON (a);').assertSucceeded() mdb1.execute('create table child2(c int);').assertSucceeded() ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: iso - More predicates to fix
Changeset: c6319350f7da for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/c6319350f7da Modified Files: sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py Branch: iso Log Message: More predicates to fix diffs (57 lines): diff --git a/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py b/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py --- a/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py +++ b/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py @@ -5,28 +5,47 @@ with SQLTestCase() as mdb1: mdb1.connect(username="monetdb", password="monetdb") mdb2.connect(username="monetdb", password="monetdb") -mdb1.execute("CREATE TABLE integers (i int);").assertSucceeded() +mdb1.execute("CREATE TABLE integers (i int, j int);").assertSucceeded() mdb1.execute('start transaction;').assertSucceeded() mdb2.execute('start transaction;').assertSucceeded() mdb1.execute('alter table integers add primary key (i);').assertSucceeded() -mdb2.execute('insert into integers values (5),(5),(5);').assertSucceeded() +mdb2.execute('insert into integers values (5,1),(5,2),(5,3);').assertSucceeded() +mdb1.execute('commit;').assertSucceeded() +mdb2.execute('commit;').assertFailed(err_code="4", err_message="COMMIT: transaction is aborted because of concurrency conflicts, will ROLLBACK instead") + +mdb1.execute('start transaction;').assertSucceeded() +mdb2.execute('start transaction;').assertSucceeded() +mdb1.execute('alter table integers alter j set not null;').assertSucceeded() +mdb2.execute('insert into integers values (6,NULL),(7,NULL),(8,NULL);').assertSucceeded() mdb1.execute('commit;').assertSucceeded() mdb2.execute('commit;').assertFailed(err_code="4", err_message="COMMIT: transaction is aborted because of concurrency conflicts, will ROLLBACK instead") mdb1.execute('create schema ups;').assertSucceeded() -mdb1.execute('create merge table parent(a int) PARTITION BY RANGE ON (a);').assertSucceeded() +mdb1.execute('create merge table parent1(a int) PARTITION BY RANGE ON (a);').assertSucceeded() mdb1.execute('create table child1(c int);').assertSucceeded() mdb1.execute('start transaction;').assertSucceeded() mdb2.execute('start transaction;').assertSucceeded() -mdb1.execute("ALTER TABLE parent ADD TABLE child1 AS PARTITION FROM '1' TO '2';").assertSucceeded() # these merge tables are very difficult, maybe allow only 1 transaction on the system? +mdb1.execute("ALTER TABLE parent1 ADD TABLE child1 AS PARTITION FROM '1' TO '2';").assertSucceeded() # these merge tables are very difficult, maybe allow only 1 transaction on the system? mdb2.execute("alter table child1 set schema ups;").assertSucceeded() mdb1.execute('commit;').assertSucceeded() mdb2.execute('commit;').assertFailed(err_code="4", err_message="COMMIT: transaction is aborted because of concurrency conflicts, will ROLLBACK instead") +mdb1.execute('create merge table parent2(a int) PARTITION BY RANGE ON (a);').assertSucceeded() +mdb1.execute('create table child2(c int);').assertSucceeded() +mdb1.execute('start transaction;').assertSucceeded() +mdb2.execute('start transaction;').assertSucceeded() +mdb1.execute("ALTER TABLE parent2 ADD TABLE child2 AS PARTITION FROM '1' TO '2';").assertSucceeded() +mdb2.execute("insert into child2 values (3);").assertSucceeded() +mdb1.execute('commit;').assertSucceeded() +mdb2.execute('commit;').assertFailed(err_code="4", err_message="COMMIT: transaction is aborted because of concurrency conflicts, will ROLLBACK instead") + mdb1.execute('start transaction;').assertSucceeded() mdb1.execute('drop table integers;').assertSucceeded() mdb1.execute('drop schema ups;').assertSucceeded() -mdb1.execute('ALTER TABLE parent DROP TABLE child1;').assertSucceeded() -mdb1.execute('DROP TABLE parent;').assertSucceeded() +mdb1.execute('ALTER TABLE parent1 DROP TABLE child1;').assertSucceeded() +mdb1.execute('DROP TABLE parent1;').assertSucceeded() mdb1.execute('DROP TABLE child1;').assertSucceeded() +mdb1.execute('ALTER TABLE parent2 DROP TABLE child2;').assertSucceeded() +mdb1.execute('DROP TABLE parent2;').assertSucceeded() +mdb1.execute('DROP TABLE child2;').assertSucceeded() mdb1.execute('commit;').assertSucceeded() ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: iso - Don't re-lock on predicate failure, cleanup
Changeset: 006f30e15e4d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/006f30e15e4d Modified Files: sql/server/sql_mvc.c sql/storage/store.c Branch: iso Log Message: Don't re-lock on predicate failure, cleanup diffs (138 lines): diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c --- a/sql/server/sql_mvc.c +++ b/sql/server/sql_mvc.c @@ -441,7 +441,7 @@ mvc_debug_on(mvc *m, int flg) void mvc_cancel_session(mvc *m) { - (void)sql_trans_end(m->session, 0); + (void)sql_trans_end(m->session, SQL_ERR); } int @@ -460,7 +460,7 @@ mvc_trans(mvc *m) /* TODO Change into recreate all */ m->qc = qc_create(m->pa, m->clientid, seqnr); if (!m->qc) { - (void)sql_trans_end(m->session, 0); + (void)sql_trans_end(m->session, SQL_ERR); return -1; } } @@ -511,7 +511,7 @@ mvc_commit(mvc *m, int chain, const char } if (!tr->parent && !name) { - if (sql_trans_end(m->session, 1) != SQL_OK) { + if (sql_trans_end(m->session, ok) != SQL_OK) { /* transaction conflict */ return createException(SQL, "sql.commit", SQLSTATE(4) "%s transaction is aborted because of concurrency conflicts, will ROLLBACK instead", operation); } @@ -541,7 +541,7 @@ mvc_commit(mvc *m, int chain, const char /* if there is nothing to commit reuse the current transaction */ if (tr->changes == NULL) { if (!chain) - (void)sql_trans_end(m->session, ok == SQL_OK ? 1 : 0); /* if a conflict happened while committing, rollback */ + (void)sql_trans_end(m->session, ok); m->type = Q_TRANS; /* save points not handled by WLC... msg = WLCcommit(m->clientid); @@ -566,7 +566,7 @@ mvc_commit(mvc *m, int chain, const char return msg; } */ - (void)sql_trans_end(m->session, ok == SQL_OK ? 1 : 0); /* if a conflict happened while committing, rollback */ + (void)sql_trans_end(m->session, ok); if (chain) sql_trans_begin(m->session); m->type = Q_TRANS; @@ -615,7 +615,7 @@ mvc_rollback(mvc *m, int chain, const ch /* make sure we do not reuse changed data */ if (tr->changes) tr->status = 1; - (void)sql_trans_end(m->session, 0); + (void)sql_trans_end(m->session, SQL_ERR); if (chain) sql_trans_begin(m->session); } @@ -831,7 +831,7 @@ mvc_destroy(mvc *m) tr = m->session->tr; if (tr) { if (m->session->tr->active) - (void)sql_trans_end(m->session, 0); + (void)sql_trans_end(m->session, SQL_ERR); while (tr->parent) tr = sql_trans_destroy(tr); } diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -3237,7 +3237,7 @@ sql_trans_copy_column( sql_trans *tr, sq } static void -sql_trans_rollback(sql_trans *tr) +sql_trans_rollback(sql_trans *tr, int locked) { sqlstore *store = tr->store; @@ -3263,7 +3263,8 @@ sql_trans_rollback(sql_trans *tr) list_prepend(nl, n->data); /* rollback */ - store_lock(store); + if (!locked) + store_lock(store); ulng oldest = store_oldest(store); ulng commit_ts = store_get_timestamp(store); /* use most recent timestamp such that we can cleanup savely */ for(node *n=nl->h; n; n = n->next) { @@ -3288,7 +3289,8 @@ sql_trans_rollback(sql_trans *tr) list_destroy(tr->changes); tr->changes = NULL; tr->logchanges = 0; - store_unlock(store); + if (!locked) + store_unlock(store); } if (tr->localtmps.dset) { list_destroy2(tr->localtmps.dset, tr->store); @@ -3328,7 +3330,7 @@ sql_trans_destroy(sql_trans *tr) tr->name = NULL; } if (tr->changes) - sql_trans_rollback(tr); + sql_trans_rollback(tr, 0); sqlstore *store = tr->store; store_lock(store); cs_destroy(>localtmps, tr->store); @@ -3457,6 +3459,7 @@ sql_trans_commit(sql_trans *tr) ulng oldest = store_oldest(store); if (tr->predicates && (ok = sql_trans_valid(tr)) != LOG_OK) { + sql_trans_rollback(tr, 1); store_unlock(store); MT_lock_unset(>commit); return ok; @@ -6327,17 +6330,13 @@ sql_trans_begin(sql_session *s) } int
MonetDB: iso - Compilation fix and more predicates to fix
Changeset: 29aae82e4d0d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/29aae82e4d0d Added Files: sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py Modified Files: sql/include/sql_relation.h sql/test/miscellaneous/Tests/All sql/test/miscellaneous/Tests/transaction_isolation2.SQL.py Branch: iso Log Message: Compilation fix and more predicates to fix diffs (84 lines): diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h --- a/sql/include/sql_relation.h +++ b/sql/include/sql_relation.h @@ -289,7 +289,7 @@ typedef struct relation { typedef struct pl { sql_column *c; - comp_type cmp; + unsigned int cmp; atom *r; /* if r is NULL then a full match is required */ atom *f; /* make it match range expressions */ uint8_t diff --git a/sql/test/miscellaneous/Tests/All b/sql/test/miscellaneous/Tests/All --- a/sql/test/miscellaneous/Tests/All +++ b/sql/test/miscellaneous/Tests/All @@ -21,3 +21,4 @@ vessels prepare transaction_isolation transaction_isolation2 +transaction_isolation3 diff --git a/sql/test/miscellaneous/Tests/transaction_isolation2.SQL.py b/sql/test/miscellaneous/Tests/transaction_isolation2.SQL.py --- a/sql/test/miscellaneous/Tests/transaction_isolation2.SQL.py +++ b/sql/test/miscellaneous/Tests/transaction_isolation2.SQL.py @@ -188,13 +188,12 @@ with SQLTestCase() as mdb1: mdb2.execute('rollback;').assertSucceeded() mdb1.execute('DROP FUNCTION myfunc;').assertSucceeded() -# currently runs up till here.. mdb1.execute('start transaction;').assertSucceeded() mdb2.execute('start transaction;').assertSucceeded() mdb1.execute('insert into longs values (4),(5),(6);').assertSucceeded() mdb2.execute('insert into longs values (5),(6),(7);').assertSucceeded() mdb1.execute('commit;').assertSucceeded() -mdb2.execute('commit;').assertFailed() # Duplicate values on the primary key 'i' from 'longs' +mdb2.execute('commit;').assertFailed(err_code="4", err_message="COMMIT: transaction is aborted because of concurrency conflicts, will ROLLBACK instead") # Duplicate values on the primary key 'i' from 'longs' mdb1.execute('SELECT i FROM longs order by i;').assertDataResultMatch([(1,),(2,),(3,),(4,),(5,),(6,)]) mdb1.execute('start transaction;').assertSucceeded() @@ -202,7 +201,7 @@ with SQLTestCase() as mdb1: mdb1.execute('delete from longs where i > 3;').assertRowCount(3) mdb2.execute('insert into integers values (4);').assertSucceeded() mdb1.execute('commit;').assertSucceeded() -mdb2.execute('commit;').assertFailed() # The foreign key value 4 doesn't exist on the primary key +mdb2.execute('commit;').assertFailed(err_code="4", err_message="COMMIT: transaction is aborted because of concurrency conflicts, will ROLLBACK instead") # The foreign key value 4 doesn't exist on the primary key mdb1.execute('SELECT i FROM longs order by i;').assertDataResultMatch([(1,),(2,),(3,)]) mdb1.execute('start transaction;').assertSucceeded() diff --git a/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py b/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py new file mode 100644 --- /dev/null +++ b/sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py @@ -0,0 +1,32 @@ +from MonetDBtesting.sqltest import SQLTestCase + +with SQLTestCase() as mdb1: +with SQLTestCase() as mdb2: +mdb1.connect(username="monetdb", password="monetdb") +mdb2.connect(username="monetdb", password="monetdb") + +mdb1.execute("CREATE TABLE integers (i int);").assertSucceeded() +mdb1.execute('start transaction;').assertSucceeded() +mdb2.execute('start transaction;').assertSucceeded() +mdb1.execute('alter table integers add primary key (i);').assertSucceeded() +mdb2.execute('insert into integers values (5),(5),(5);').assertSucceeded() +mdb1.execute('commit;').assertSucceeded() +mdb2.execute('commit;').assertFailed(err_code="4", err_message="COMMIT: transaction is aborted because of concurrency conflicts, will ROLLBACK instead") + +mdb1.execute('create schema ups;').assertSucceeded() +mdb1.execute('create merge table parent(a int) PARTITION BY RANGE ON (a);').assertSucceeded() +mdb1.execute('create table child1(c int);').assertSucceeded() +mdb1.execute('start transaction;').assertSucceeded() +mdb2.execute('start transaction;').assertSucceeded() +mdb1.execute("ALTER TABLE parent ADD TABLE child1 AS PARTITION FROM '1' TO '2';").assertSucceeded() # these merge tables are very difficult, maybe allow only 1 transaction on the system? +mdb2.execute("alter table child1 set schema ups;").assertSucceeded() +mdb1.execute('commit;').assertSucceeded() +mdb2.execute('commit;').assertFailed(err_code="4",