Changeset: a87d6754f7f1 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a87d6754f7f1 Added Files: sql/ChangeLog.linear-hashing Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 clients/Tests/exports.stable.out debian/control monetdb5/mal/mal_client.c monetdb5/modules/mal/clients.c monetdb5/modules/mal/clients.h monetdb5/modules/mal/clients.mal monetdb5/modules/mal/sysmon.c sql/backends/monet5/sql_upgrades.c sql/scripts/26_sysmon.sql sql/server/rel_select.c sql/test/BugTracker-2010/Tests/TypeException_with_missing_function.Bug-2674.stable.err sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.err sql/test/BugTracker-2012/Tests/table_function_with_column_subselects.Bug-3172.stable.err sql/test/BugTracker-2012/Tests/table_returning_func_returns_too_many_columns.Bug-3077.stable.err sql/test/BugTracker-2013/Tests/psm_functions_and_accessrights.Bug-3300.stable.err sql/test/BugTracker-2016/Tests/invalidcolumns.Bug-3968.stable.err sql/test/BugTracker-2017/Tests/udf_crash_subquery_scalar_paramters.Bug-6399.stable.err sql/test/BugTracker-2018/Tests/crash-after-call-non-existing-loader.stable.err sql/test/Tests/drop-function-if-exists.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/miscellaneous/Tests/simple_selects.sql sql/test/miscellaneous/Tests/simple_selects.stable.err sql/test/sys-schema/Tests/systemfunctions.stable.out sql/test/sys-schema/Tests/systemfunctions.stable.out.int128 testing/Mtest.py.in Branch: default Log Message:
Merged with linear-hashing diffs (truncated from 1507 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 @@ -10466,7 +10466,7 @@ stdout of test 'MAL-signatures` in direc [ "clients", "stopsession", "pattern clients.stopsession(sid:int):void ", "CLTstopSession;", "Stop a particular session" ] [ "clients", "stopsession", "pattern clients.stopsession(sid:sht):void ", "CLTstopSession;", "" ] [ "clients", "suspend", "pattern clients.suspend(id:int):void ", "CLTsuspend;", "Put a client process to sleep for some time.\nIt will simple sleep for a second at a time, until\nthe awake bit has been set in its descriptor" ] -[ "clients", "wakeup", "command clients.wakeup(id:int):void ", "CLTwakeup;", "Wakeup a client process" ] +[ "clients", "wakeup", "pattern clients.wakeup(id:int):void ", "CLTwakeup;", "Wakeup a client process" ] [ "color", "#fromstr", "command color.#fromstr():void ", "color_fromstr;", "" ] [ "color", "#tostr", "command color.#tostr():void ", "color_tostr;", "" ] [ "color", "blue", "command color.blue(c:color):int ", "CLRblue;", "Extracts blue component from a color atom" ] 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 @@ -14872,7 +14872,7 @@ stdout of test 'MAL-signatures` in direc [ "clients", "stopsession", "pattern clients.stopsession(sid:int):void ", "CLTstopSession;", "Stop a particular session" ] [ "clients", "stopsession", "pattern clients.stopsession(sid:sht):void ", "CLTstopSession;", "" ] [ "clients", "suspend", "pattern clients.suspend(id:int):void ", "CLTsuspend;", "Put a client process to sleep for some time.\nIt will simple sleep for a second at a time, until\nthe awake bit has been set in its descriptor" ] -[ "clients", "wakeup", "command clients.wakeup(id:int):void ", "CLTwakeup;", "Wakeup a client process" ] +[ "clients", "wakeup", "pattern clients.wakeup(id:int):void ", "CLTwakeup;", "Wakeup a client process" ] [ "color", "#fromstr", "command color.#fromstr():void ", "color_fromstr;", "" ] [ "color", "#tostr", "command color.#tostr():void ", "color_tostr;", "" ] [ "color", "blue", "command color.blue(c:color):int ", "CLRblue;", "Extracts blue component from a color atom" ] 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 @@ -992,7 +992,7 @@ str CLTshutdown(Client cntxt, MalBlkPtr str CLTstop(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTstopSession(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTsuspend(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); -str CLTwakeup(void *ret, int *id); +str CLTwakeup(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CMDBATimprints(void *ret, bat *bid); str CMDBATimprintsize(lng *ret, bat *bid); str CMDBATnew(Client cntxt, MalBlkPtr m, MalStkPtr s, InstrPtr p); diff --git a/debian/control b/debian/control --- a/debian/control +++ b/debian/control @@ -252,7 +252,7 @@ Description: MonetDB5 128 bit integer (h Package: monetdb-python3 Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, - monetdb5-sql (= ${source:Version}) + monetdb5-sql (= ${source:Version}), python3-numpy Description: Integration of MonetDB and Python, allowing use of Python from within SQL MonetDB is a database management system that is developed from a main-memory perspective with use of a fully decomposed storage model, @@ -269,7 +269,7 @@ Description: Integration of MonetDB and Package: monetdb-r Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, - monetdb5-sql (= ${source:Version}) + monetdb5-sql (= ${source:Version}), r-base-core Description: Integration of MonetDB and R, allowing use of R from within SQL MonetDB is a database management system that is developed from a main-memory perspective with use of a fully decomposed storage model, diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c --- a/monetdb5/mal/mal_client.c +++ b/monetdb5/mal/mal_client.c @@ -605,7 +605,6 @@ MCreadClient(Client c) return 1; } - int MCvalid(Client tc) { 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 @@ -186,82 +186,91 @@ bailout: str CLTquit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - int id; + str msg = MAL_SUCCEED; + int idx = cntxt->idx; (void) mb; /* fool compiler */ - if ( pci->argc==2) - id = *getArgReference_int(stk,pci,1); - else id =cntxt->idx; + if ( pci->argc == 2 && cntxt->user == MAL_ADMIN) + idx = *getArgReference_int(stk,pci,1); - if ( id < 0 || id > MAL_MAXCLIENTS) + if ( idx < 0 || idx > MAL_MAXCLIENTS) throw(MAL,"clients.quit", "Illegal session id"); - if ( !(cntxt->user == MAL_ADMIN || mal_clients[id].user == cntxt->user) ) - throw(MAL, "client.quit", INVCRED_ACCESS_DENIED); /* A user can only quite a session under the same id */ - if ( cntxt->idx == mal_clients[id].idx) - mal_clients[id].mode = FINISHCLIENT; - else - throw(MAL, "client.quit", INVCRED_ACCESS_DENIED); - return MAL_SUCCEED; + MT_lock_set(&mal_contextLock); + if (mal_clients[idx].mode == FREECLIENT) + msg = createException(MAL,"clients.stop","Session not active anymore"); + else + mal_clients[idx].mode = FINISHCLIENT; + MT_lock_unset(&mal_contextLock); + return msg; } /* Stopping a client in a softmanner by setting the time out marker */ str CLTstop(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - int id = *getArgReference_int(stk,pci,1); + int idx = cntxt->idx; + str msg = MAL_SUCCEED; (void) mb; - if ( id < 0 || id > MAL_MAXCLIENTS) + if (cntxt->user == MAL_ADMIN) + idx = *getArgReference_int(stk,pci,1); + + if ( idx < 0 || idx > MAL_MAXCLIENTS) throw(MAL,"clients.stop","Illegal session id"); - if (cntxt->user == mal_clients[id].user || cntxt->user == MAL_ADMIN) - mal_clients[id].querytimeout = 1; /* stop client in one microsecond */ + + MT_lock_set(&mal_contextLock); + if (mal_clients[idx].mode == FREECLIENT) + msg = createException(MAL,"clients.stop","Session not active anymore"); + else + mal_clients[idx].querytimeout = 1; /* stop client in one microsecond */ /* this forces the designated client to stop at the next instruction */ - return MAL_SUCCEED; + MT_lock_unset(&mal_contextLock); + return msg; } str CLTsetoptimizer(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - int idx; - str opt; + int idx = cntxt->idx; + str opt, msg = MAL_SUCCEED; (void) mb; - if( pci->argc == 3){ + if( pci->argc == 3 && cntxt->user == MAL_ADMIN){ idx = *getArgReference_int(stk,pci,1); opt = *getArgReference_str(stk,pci,2); } else { - idx = cntxt->idx; opt = *getArgReference_str(stk,pci,1); } if( idx < 0 || idx > MAL_MAXCLIENTS) throw(MAL,"clients.setoptimizer","Illegal session id"); + if (strNil(opt)) + throw(MAL,"clients.setoptimizer","Input string cannot be NULL"); + if (strlen(opt) >= sizeof(mal_clients[idx].optimizer)) + throw(MAL,"clients.setoptimizer","Input string is too large"); + + MT_lock_set(&mal_contextLock); if (mal_clients[idx].mode == FREECLIENT) - throw(MAL,"clients.setoptimizer","Session not active anymore"); - if (cntxt->user == mal_clients[idx].user || cntxt->user == MAL_ADMIN){ - if (strNil(opt)) - throw(MAL,"clients.setoptimizer","Input string cannot be NULL"); - if (strlen(opt) >= sizeof(mal_clients[idx].optimizer)) - throw(MAL,"clients.setoptimizer","Input string is too large"); - strcpy_len(mal_clients[idx].optimizer, opt, - sizeof(mal_clients[idx].optimizer)); - } - return MAL_SUCCEED; + msg = createException(MAL,"clients.setoptimizer","Session not active anymore"); + else + strcpy_len(mal_clients[idx].optimizer, opt, sizeof(mal_clients[idx].optimizer)); + MT_lock_unset(&mal_contextLock); + return msg; } str CLTsetworkerlimit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - int idx, limit; + str msg = MAL_SUCCEED; + int idx = cntxt->idx, limit; (void) mb; - if(pci->argc == 3){ + if (pci->argc == 3 && cntxt->user == MAL_ADMIN){ idx = *getArgReference_int(stk,pci,1); limit = *getArgReference_int(stk,pci,2); } else { - idx = cntxt->idx; limit = *getArgReference_int(stk,pci,1); } @@ -271,128 +280,164 @@ CLTsetworkerlimit(Client cntxt, MalBlkPt throw(MAL, "clients.setworkerlimit","The number of workers cannot be NULL"); if( limit < 0) throw(MAL, "clients.setworkerlimit","The number of workers cannot be negative"); + + MT_lock_set(&mal_contextLock); 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){ + msg = createException(MAL,"clients.setworkerlimit","Session not active anymore"); + else mal_clients[idx].workerlimit = limit; - } - return MAL_SUCCEED; + MT_lock_unset(&mal_contextLock); + return msg; } str CLTsetmemorylimit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - int idx, limit; + str msg = MAL_SUCCEED; + int idx = cntxt->idx, limit; (void) mb; - if(pci->argc == 3){ + if (pci->argc == 3 && cntxt->user == MAL_ADMIN){ idx = *getArgReference_sht(stk,pci,1); limit = *getArgReference_int(stk,pci,2); - } else{ - idx = cntxt->idx; + } else { limit = *getArgReference_int(stk,pci,1); } if( idx < 0 || idx > MAL_MAXCLIENTS) 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){ + + MT_lock_set(&mal_contextLock); + if (mal_clients[idx].mode == FREECLIENT) + msg = createException(MAL,"clients.setmemorylimit","Session not active anymore"); + else mal_clients[idx].memorylimit = limit; - } - return MAL_SUCCEED; + MT_lock_unset(&mal_contextLock); + return msg; } str CLTstopSession(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - int idx; + str msg = MAL_SUCCEED; + int idx = cntxt->idx; - (void) mb; - switch( getArgType(mb,pci,1)){ - case TYPE_bte: - idx = *getArgReference_bte(stk,pci,1); - break; - case TYPE_sht: - idx = *getArgReference_sht(stk,pci,1); - break; - case TYPE_int: - idx = *getArgReference_int(stk,pci,1); - break; - default: - throw(MAL,"clients.stopSession","Unexpected index type"); + if (cntxt->user == MAL_ADMIN) { + switch( getArgType(mb,pci,1)){ + case TYPE_bte: + idx = *getArgReference_bte(stk,pci,1); + break; + case TYPE_sht: + idx = *getArgReference_sht(stk,pci,1); + break; + case TYPE_int: + idx = *getArgReference_int(stk,pci,1); + break; + default: + throw(MAL,"clients.stopSession","Unexpected index type"); + } } if( idx < 0 || idx > MAL_MAXCLIENTS) throw(MAL,"clients.stopSession","Illegal session id"); - if (mal_clients[idx].mode == FREECLIENT) - throw(MAL,"clients.stopSession","Session not active anymore"); - if (cntxt->user == mal_clients[idx].user || cntxt->user == MAL_ADMIN){ + + MT_lock_set(&mal_contextLock); + if (mal_clients[idx].mode == FREECLIENT) { + msg = createException(MAL,"clients.stopSession","Session not active anymore"); + } else { mal_clients[idx].querytimeout = 1; /* stop client in one microsecond */ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list