Changeset: f8a6a41ef020 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f8a6a41ef020 Added Files: sql/test/sysmon/Tests/query_timeout.test Modified Files: gdk/gdk.h gdk/gdk_cross.c monetdb5/mal/mal_interpreter.c sql/test/sysmon/Tests/All Branch: qcancel Log Message:
qtimeout in gdk cross product diffs (105 lines): diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -2113,4 +2113,10 @@ gdk_export BAT *BATsample_with_seed(BAT */ #define MAXPARAMS 32 +#define _CHECK_TIMEOUT(starttime, querytimeout) \ + if (querytimeout && starttime && (GDKusec() - starttime) > querytimeout) { \ + GDKerror("Timeout was reached!"); \ + return GDK_FAIL; \ + } + #endif /* _GDK_H_ */ diff --git a/gdk/gdk_cross.c b/gdk/gdk_cross.c --- a/gdk/gdk_cross.c +++ b/gdk/gdk_cross.c @@ -9,6 +9,7 @@ #include "monetdb_config.h" #include "gdk.h" #include "gdk_private.h" +#include "gdk_system.h" /* Calculate a cross product between bats l and r with optional * candidate lists sl for l and sr for r. @@ -26,6 +27,7 @@ BATsubcross(BAT **r1p, BAT **r2p, BAT *l cnt1 = canditer_init(&ci1, l, sl); cnt2 = canditer_init(&ci2, r, sr); + QryCtx *qry_ctx = MT_thread_get_qry_ctx(); if (max_one && cnt1 > 0 && cnt2 > 1) { GDKerror("more than one match"); @@ -50,6 +52,7 @@ BATsubcross(BAT **r1p, BAT **r2p, BAT *l bn1->tnonil = true; p = (oid *) Tloc(bn1, 0); for (i = 0; i < cnt1; i++) { + _CHECK_TIMEOUT(qry_ctx->starttime, qry_ctx->querytimeout); oid x = canditer_next(&ci1); for (j = 0; j < cnt2; j++) { *p++ = x; @@ -66,6 +69,7 @@ BATsubcross(BAT **r1p, BAT **r2p, BAT *l bn2->tnonil = true; p = (oid *) Tloc(bn2, 0); for (i = 0; i < cnt1; i++) { + _CHECK_TIMEOUT(qry_ctx->starttime, qry_ctx->querytimeout); for (j = 0; j < cnt2; j++) { *p++ = canditer_next(&ci2); } 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 @@ -463,7 +463,6 @@ str runMALsequence(Client cntxt, MalBlkP int startedProfileQueue = 0; #define CHECKINTERVAL 1000 /* how often do we check for client disconnect */ runtimeProfile.ticks = runtimeProfileFunction.ticks = 0; - QryCtx qry_ctx = {.starttime=mb->starttime, .querytimeout=cntxt->querytimeout}; if (stk == NULL) throw(MAL, "mal.interpreter", MAL_STACK_FAIL); @@ -513,10 +512,12 @@ str runMALsequence(Client cntxt, MalBlkP stkpc = startpc; exceptionVar = -1; + QryCtx qry_ctx = {.querytimeout=cntxt->querytimeout, .starttime=mb->starttime}; + MT_thread_set_qry_ctx(&qry_ctx); + while (stkpc < mb->stop && stkpc != stoppc) { // incomplete block being executed, requires at least signature and end statement MT_thread_setalgorithm(NULL); - MT_thread_set_qry_ctx(&qry_ctx); pci = getInstrPtr(mb, stkpc); if (cntxt->mode == FINISHCLIENT){ stkpc = stoppc; 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 @@ -2,3 +2,4 @@ sys_queue sys_queue_expand sys_user_statistics sys_queue_multisessions +query_timeout diff --git a/sql/test/sysmon/Tests/query_timeout.test b/sql/test/sysmon/Tests/query_timeout.test new file mode 100644 --- /dev/null +++ b/sql/test/sysmon/Tests/query_timeout.test @@ -0,0 +1,18 @@ +statement ok +create table foo(id bigserial, value int); + +statement ok +create table bar(id bigserial, value int); + +statement ok +insert into foo(value) (select * from generate_series(0,10000)); + +statement ok +insert into bar(value) (select * from generate_series(0,10000)); + +statement ok +call setquerytimeout(0, 1); + +# test crossproduct +statement error HYT00!Query aborted due to timeout +select * from foo, bar _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list