Changeset: 9d75acab2037 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9d75acab2037 Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 monetdb5/modules/kernel/alarm.c monetdb5/modules/kernel/alarm.mal monetdb5/modules/mal/clients.c monetdb5/modules/mal/sysmon.c sql/backends/monet5/sql_upgrades.c sql/scripts/22_clients.sql sql/scripts/25_debug.sql sql/scripts/26_sysmon.sql sql/test/Users/Tests/sessioncontrol.stable.err sql/test/emptydb/Tests/check.stable.out sql/test/emptydb/Tests/check.stable.out.32bit sql/test/emptydb/Tests/check.stable.out.int128 sql/test/sys-schema/Tests/systemfunctions.stable.out sql/test/sys-schema/Tests/systemfunctions.stable.out.int128 Branch: default Log Message:
Merged with linear-hashing diffs (truncated from 1008 to 300 lines): diff --git a/clients/Tests/MAL-signatures.stable.out b/clients/Tests/MAL-signatures.stable.out --- a/clients/Tests/MAL-signatures.stable.out +++ b/clients/Tests/MAL-signatures.stable.out @@ -565,9 +565,9 @@ stdout of test 'MAL-signatures` in direc [ "aggr", "variancep", "command aggr.variancep(b:bat[:any_2]):dbl ", "ALGvariancep;", "Gives the variance of all tail values" ] [ "alarm", "ctime", "unsafe command alarm.ctime():str ", "ALARMctime;", "Return the current time as a C-time string." ] [ "alarm", "epoch", "unsafe command alarm.epoch():int ", "ALARMepoch;", "Return time since Jan 1, 1970 in seconds." ] -[ "alarm", "sleep", "unsafe pattern alarm.sleep(msecs:bat[:int]):bat[:int] ", "ALARMsleep;", "Sleep a few milliseconds and return the slept value" ] -[ "alarm", "sleep", "unsafe pattern alarm.sleep(msecs:int):int ", "ALARMsleep;", "Sleep a few milliseconds and return the slept value" ] -[ "alarm", "sleep", "unsafe pattern alarm.sleep(msecs:int):void ", "ALARMsleep;", "Sleep a few milliseconds" ] +[ "alarm", "sleep", "unsafe pattern alarm.sleep(msecs:any_1):any_1 ", "ALARMsleep;", "Sleep a few milliseconds and return the slept value" ] +[ "alarm", "sleep", "unsafe pattern alarm.sleep(msecs:any_1):void ", "ALARMsleep;", "Sleep a few milliseconds" ] +[ "alarm", "sleep", "unsafe pattern alarm.sleep(msecs:bat[:any_1]):bat[:any_1] ", "ALARMsleep;", "Sleep a few milliseconds and return the slept value" ] [ "alarm", "time", "unsafe command alarm.time():int ", "ALARMtime;", "Return time since program start in milliseconds." ] [ "alarm", "usec", "unsafe command alarm.usec():lng ", "ALARMusec;", "Return time since Jan 1, 1970 in microseconds." ] [ "algebra", "antijoin", "function algebra.antijoin(l:bat[:any_1], r:bat[:any_1], sl:bat[:oid], sr:bat[:oid], nil_matches:bit, estimate:lng) (X_0:bat[:oid], X_1:bat[:oid]);", "", "" ] diff --git a/clients/Tests/MAL-signatures.stable.out.int128 b/clients/Tests/MAL-signatures.stable.out.int128 --- a/clients/Tests/MAL-signatures.stable.out.int128 +++ b/clients/Tests/MAL-signatures.stable.out.int128 @@ -674,9 +674,9 @@ stdout of test 'MAL-signatures` in direc [ "aggr", "variancep", "command aggr.variancep(b:bat[:any_2]):dbl ", "ALGvariancep;", "Gives the variance of all tail values" ] [ "alarm", "ctime", "unsafe command alarm.ctime():str ", "ALARMctime;", "Return the current time as a C-time string." ] [ "alarm", "epoch", "unsafe command alarm.epoch():int ", "ALARMepoch;", "Return time since Jan 1, 1970 in seconds." ] -[ "alarm", "sleep", "unsafe pattern alarm.sleep(msecs:bat[:int]):bat[:int] ", "ALARMsleep;", "Sleep a few milliseconds and return the slept value" ] -[ "alarm", "sleep", "unsafe pattern alarm.sleep(msecs:int):int ", "ALARMsleep;", "Sleep a few milliseconds and return the slept value" ] -[ "alarm", "sleep", "unsafe pattern alarm.sleep(msecs:int):void ", "ALARMsleep;", "Sleep a few milliseconds" ] +[ "alarm", "sleep", "unsafe pattern alarm.sleep(msecs:any_1):any_1 ", "ALARMsleep;", "Sleep a few milliseconds and return the slept value" ] +[ "alarm", "sleep", "unsafe pattern alarm.sleep(msecs:any_1):void ", "ALARMsleep;", "Sleep a few milliseconds" ] +[ "alarm", "sleep", "unsafe pattern alarm.sleep(msecs:bat[:any_1]):bat[:any_1] ", "ALARMsleep;", "Sleep a few milliseconds and return the slept value" ] [ "alarm", "time", "unsafe command alarm.time():int ", "ALARMtime;", "Return time since program start in milliseconds." ] [ "alarm", "usec", "unsafe command alarm.usec():lng ", "ALARMusec;", "Return time since Jan 1, 1970 in microseconds." ] [ "algebra", "antijoin", "function algebra.antijoin(l:bat[:any_1], r:bat[:any_1], sl:bat[:oid], sr:bat[:oid], nil_matches:bit, estimate:lng) (X_0:bat[:oid], X_1:bat[:oid]);", "", "" ] diff --git a/monetdb5/modules/kernel/alarm.c b/monetdb5/modules/kernel/alarm.c --- a/monetdb5/modules/kernel/alarm.c +++ b/monetdb5/modules/kernel/alarm.c @@ -39,57 +39,95 @@ ALARMusec(lng *ret) return MAL_SUCCEED; } +#define SLEEP_SINGLE(TPE) \ + do { \ + TPE *res = (TPE*) getArgReference(stk, pci, 0), *msecs = (TPE*) getArgReference(stk,pci,1); \ + if (is_##TPE##_nil(*msecs)) \ + throw(MAL, "alarm.sleepr", "NULL values not allowed for sleeping time"); \ + if (*msecs < 0) \ + throw(MAL, "alarm.sleepr", "Cannot sleep for a negative time"); \ + MT_sleep_ms((unsigned int) *msecs); \ + *res = *msecs; \ + } while (0) + +#define SLEEP_MULTI(TPE) \ + do { \ + for (i = 0; i < j ; i++) { \ + if (is_##TPE##_nil(bb[i])) { \ + BBPreclaim(r); \ + BBPunfix(b->batCacheid); \ + throw(MAL, "alarm.sleepr", "NULL values not allowed for sleeping time"); \ + } \ + if (bb[i] < 0) { \ + BBPreclaim(r); \ + BBPunfix(b->batCacheid); \ + throw(MAL, "alarm.sleepr", "Cannot sleep for a negative time"); \ + } \ + } \ + for (i = 0; i < j ; i++) { \ + MT_sleep_ms((unsigned int) bb[i]); \ + rb[i] = bb[i]; \ + } \ + } while (0) + str ALARMsleep(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - BAT *r, *b; - int *restrict rb, *restrict bb; + BAT *r = NULL, *b = NULL; + int *restrict rb, *restrict bb, tpe; BUN i, j; (void) cntxt; if (getArgType(mb, pci, 0) != TYPE_void && isaBatType(getArgType(mb, pci, 1))) { bat *res = getArgReference_bat(stk, pci, 0); bat *bid = getArgReference_bat(stk, pci, 1); - + tpe = getArgType(mb, pci, 1); + if (!(b = BATdescriptor(*bid))) throw(MAL, "alarm.sleepr", SQLSTATE(HY005) "Cannot access column descriptor"); j = BATcount(b); bb = Tloc(b, 0); - for (i = 0; i < j ; i++) { - if (is_int_nil(bb[i])) { - BBPunfix(b->batCacheid); - throw(MAL, "alarm.sleepr", "NULL values not allowed for the sleeping time"); - } else if (bb[i]) { - BBPunfix(b->batCacheid); - throw(MAL, "alarm.sleepr", "Cannot sleep for a negative time"); - } - } - r = COLnew(0, TYPE_int, j, TRANSIENT); - if (r == NULL) { + if (!(r = COLnew(0, tpe, j, TRANSIENT))) { BBPunfix(b->batCacheid); throw(MAL, "alarm.sleepr", SQLSTATE(HY013) MAL_MALLOC_FAIL); } + rb = Tloc(r, 0); - rb = Tloc(r, 0); - for (i = 0; i < j ; i++) { - MT_sleep_ms(bb[i]); - rb[i] = bb[i]; + switch (tpe) { + case TYPE_bte: + SLEEP_MULTI(bte); + break; + case TYPE_sht: + SLEEP_MULTI(sht); + break; + case TYPE_int: + SLEEP_MULTI(int); + break; + default: { + BBPreclaim(r); + BBPunfix(b->batCacheid); + throw(MAL, "alarm.sleepr", SQLSTATE(42000) "Sleep function not available for type %s", ATOMname(tpe)); + } } BBPunfix(b->batCacheid); BBPkeepref(*res = r->batCacheid); } else { - int *res = (int*) getArgReference(stk, pci, 0), *msecs = (int*) getArgReference(stk,pci,1); - - if (is_int_nil(*msecs)) - throw(MAL, "alarm.sleepr", "NULL values not allowed for the sleeping time"); - else if (*msecs < 0) - throw(MAL, "alarm.sleepr", "Cannot sleep for a negative time"); - - MT_sleep_ms(*msecs); - *res = *msecs; + switch (getArgType(mb, pci, 1)) { + case TYPE_bte: + SLEEP_SINGLE(bte); + break; + case TYPE_sht: + SLEEP_SINGLE(sht); + break; + case TYPE_int: + SLEEP_SINGLE(int); + break; + default: + throw(MAL, "alarm.sleepr", SQLSTATE(42000) "Sleep function not available for type %s", ATOMname(getArgType(mb, pci, 1))); + } } return MAL_SUCCEED; } diff --git a/monetdb5/modules/kernel/alarm.mal b/monetdb5/modules/kernel/alarm.mal --- a/monetdb5/modules/kernel/alarm.mal +++ b/monetdb5/modules/kernel/alarm.mal @@ -6,15 +6,15 @@ module alarm; -unsafe pattern alarm.sleep(msecs:int) :void +unsafe pattern alarm.sleep(msecs:any_1) :void address ALARMsleep comment "Sleep a few milliseconds"; -unsafe pattern alarm.sleep(msecs:int) :int +unsafe pattern alarm.sleep(msecs:any_1) :any_1 address ALARMsleep comment "Sleep a few milliseconds and return the slept value"; -unsafe pattern alarm.sleep(msecs:bat[:int]) :bat[:int] +unsafe pattern alarm.sleep(msecs:bat[:any_1]) :bat[:any_1] address ALARMsleep comment "Sleep a few milliseconds and return the slept value"; diff --git a/monetdb5/modules/mal/clients.c b/monetdb5/modules/mal/clients.c --- a/monetdb5/modules/mal/clients.c +++ b/monetdb5/modules/mal/clients.c @@ -267,8 +267,10 @@ CLTsetworkerlimit(Client cntxt, MalBlkPt if( idx < 0 || idx > MAL_MAXCLIENTS) throw(MAL,"clients.setworkerlimit","Illegal session id"); + if( is_int_nil(limit)) + throw(MAL, "clients.setworkerlimit","The number of workers cannot be NULL"); if( limit < 0) - throw(MAL, "clients.setworkerlimit", "At least one worker needed"); + throw(MAL, "clients.setworkerlimit","The number of workers cannot be negative"); if (mal_clients[idx].mode == FREECLIENT) throw(MAL,"clients.setworkerlimit","Session not active anymore"); if (cntxt->user == mal_clients[idx].user || cntxt->user == MAL_ADMIN){ @@ -295,6 +297,10 @@ CLTsetmemorylimit(Client cntxt, MalBlkPt throw(MAL,"clients.setmemorylimit","Illegal session id"); if (mal_clients[idx].mode == FREECLIENT) throw(MAL,"clients.setmemorylimit","Session not active anymore"); + if( is_int_nil(limit)) + throw(MAL, "clients.setmemorylimit", "The memmory limit cannot be NULL"); + if( limit < 0) + throw(MAL, "clients.setmemorylimit", "The memmory limit cannot be negative"); if (cntxt->user == mal_clients[idx].user || cntxt->user == MAL_ADMIN){ mal_clients[idx].memorylimit = limit; } @@ -366,7 +372,9 @@ CLTsetSessionTimeout(Client cntxt, MalBl throw(MAL,"clients.setsession","Illegal session id %d", idx); if (mal_clients[idx].mode == FREECLIENT) throw(MAL,"clients.setsession","Session not active anymore"); - sto = *getArgReference_lng(stk,pci,1); + sto = *getArgReference_lng(stk,pci,1); + if (is_lng_nil(sto)) + throw(MAL,"clients.setsession","Session timeout cannot be NULL"); if (sto < 0) throw(MAL,"clients.setsession","Session timeout should be >= 0"); mal_clients[idx].sessiontimeout = sto * 1000000; @@ -386,10 +394,14 @@ CLTsetTimeout(Client cntxt, MalBlkPtr mb if (mal_clients[idx].mode == FREECLIENT) throw(MAL,"clients.settimeout","Session not active anymore"); qto = *getArgReference_lng(stk,pci,1); + if (is_lng_nil(qto)) + throw(MAL,"clients.settimeout","Query timeout cannot be NULL"); if (qto < 0) throw(MAL,"clients.settimeout","Query timeout should be >= 0"); if (pci->argc == 3) { sto = *getArgReference_lng(stk,pci,2); + if (is_lng_nil(sto)) + throw(MAL,"clients.settimeout","Session timeout cannot be NULL"); if( sto < 0) throw(MAL,"clients.settimeout","Session timeout should be >= 0"); mal_clients[idx].sessiontimeout = sto * 1000000; @@ -424,8 +436,10 @@ CLTqueryTimeout(Client cntxt, MalBlkPtr idx = cntxt->idx; qto= *getArgReference_int(stk,pci,1); } + if (is_int_nil(qto)) + throw(MAL,"clients.queryTimeout","Query timeout cannot be NULL"); if( qto < 0) - throw(MAL,"clients.queryTimeout","Query time-out should be >= 0"); + throw(MAL,"clients.queryTimeout","Query timeout should be >= 0"); mal_clients[idx].querytimeout = (lng) qto * 1000000; return MAL_SUCCEED; } @@ -456,8 +470,10 @@ CLTsessionTimeout(Client cntxt, MalBlkPt idx = cntxt->idx; sto = *getArgReference_int(stk,pci,1); } + if (is_lng_nil(sto)) + throw(MAL,"clients.sessionTimeout","Session timeout cannot be NULL"); if( sto < 0) - throw(MAL,"clients.sessionTimeout","Session time-out should be >= 0"); + throw(MAL,"clients.sessionTimeout","Session timeout should be >= 0"); if( idx < 0 || idx > MAL_MAXCLIENTS) throw(MAL,"clients.sessionTimeout","Illegal session id %d", idx); if (mal_clients[idx].mode == FREECLIENT) @@ -749,10 +765,12 @@ CLTshutdown(Client cntxt, MalBlkPtr mb, if (cntxt->user != MAL_ADMIN) throw(MAL,"mal.shutdown", "Administrator rights required"); + if (is_int_nil(delay)) + throw(MAL,"mal.shutdown", "Delay cannot be NULL"); if (delay < 0) throw(MAL,"mal.shutdown", "Delay cannot be negative"); if (is_bit_nil(force)) - throw(MAL,"mal.shutdown", "Force cannot be null"); + throw(MAL,"mal.shutdown", "Force cannot be NULL"); MCstopClients(cntxt); do{ if ( (leftover = MCactiveClients()-1) ) @@ -837,11 +855,14 @@ CLTsessions(Client cntxt, MalBlkPtr mb, timeout = (int)(c->querytimeout / 1000000); if (BUNappend(querytimeout, &timeout, false) != GDK_SUCCEED) goto bailout; - ret = timestamp_fromtime(c->idle); - if (is_timestamp_nil(ret)) { - msg = createException(SQL, "sql.sessions", SQLSTATE(22003) "Failed to convert user logged time"); - goto bailout; - } + if( c->idle){ + ret = timestamp_fromtime(c->idle); + if (is_timestamp_nil(ret)) { + msg = createException(SQL, "sql.sessions", SQLSTATE(22003) "Failed to convert user logged time"); + goto bailout; + } + } else + ret = timestamp_nil; if (BUNappend(idle, &ret, false) != GDK_SUCCEED) goto bailout; if (BUNappend(opt, &c->optimizer, false) != GDK_SUCCEED) diff --git a/monetdb5/modules/mal/sysmon.c b/monetdb5/modules/mal/sysmon.c --- a/monetdb5/modules/mal/sysmon.c +++ b/monetdb5/modules/mal/sysmon.c @@ -129,7 +129,9 @@ SYSMONqueue(Client cntxt, MalBlkPtr mb, str SYSMONpause(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) -{ lng i, tag = 0; +{ + bool set = false; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list