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

Reply via email to