Changeset: e110b6e1a2b9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e110b6e1a2b9
Added Files:
        sql/test/sysmon/Tests/sys_queue_multisessions.SQL.py
        sql/test/sysmon/Tests/sys_queue_multisessions.stable.err
        sql/test/sysmon/Tests/sys_queue_multisessions.stable.out
Modified Files:
        monetdb5/modules/mal/sysmon.c
        sql/test/sysmon/Tests/All
Branch: Oct2020
Log Message:

A user should be able to see all its queries from all current sessions of this
user in sys.queue() output.


diffs (169 lines):

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
@@ -164,7 +164,6 @@ SYSMONqueue(Client cntxt, MalBlkPtr mb, 
        timestamp tsn;
        str msg = MAL_SUCCEED;
 
-       (void) cntxt;
        (void) mb;
        sz = (BUN) qsize;       // reserve space for all tuples in QRYqueue
        tag = COLnew(0, TYPE_lng, sz, TRANSIENT);
@@ -196,7 +195,8 @@ SYSMONqueue(Client cntxt, MalBlkPtr mb, 
                        if( i == qhead)
                                break;
                }
-               if( QRYqueue[i].query && (cntxt->user == MAL_ADMIN || 
cntxt->idx == QRYqueue[i].idx) ){
+               if( QRYqueue[i].query && (cntxt->user == MAL_ADMIN || 
+                                       strcmp(cntxt->username, 
QRYqueue[i].username) == 0) ){
                        qtag = (lng) QRYqueue[i].tag;
                        if (BUNappend(tag, &qtag, false) != GDK_SUCCEED)
                                goto bailout;
@@ -272,11 +272,8 @@ SYSMONpause(Client cntxt, MalBlkPtr mb, 
 {
        bool set = false;
        lng tag = 0;
-       (void) mb;
-       (void) stk;
-       (void) pci;
 
-       switch( getArgType(mb,pci,1)){
+       switch(getArgType(mb,pci,1)){
        case TYPE_bte: tag = *getArgReference_bte(stk,pci,1); break;
        case TYPE_sht: tag = *getArgReference_sht(stk,pci,1); break;
        case TYPE_int: tag = *getArgReference_int(stk,pci,1); break;
@@ -308,11 +305,8 @@ SYSMONresume(Client cntxt, MalBlkPtr mb,
 {
        bool set = false;
        lng tag = 0;
-       (void) mb;
-       (void) stk;
-       (void) pci;
 
-       switch( getArgType(mb,pci,1)){
+       switch(getArgType(mb,pci,1)){
        case TYPE_bte: tag = *getArgReference_bte(stk,pci,1); break;
        case TYPE_sht: tag = *getArgReference_sht(stk,pci,1); break;
        case TYPE_int: tag = *getArgReference_int(stk,pci,1); break;
@@ -344,11 +338,8 @@ SYSMONstop(Client cntxt, MalBlkPtr mb, M
 {
        bool set = false;
        lng tag = 0;
-       (void) mb;
-       (void) stk;
-       (void) pci;
 
-       switch( getArgType(mb,pci,1)){
+       switch(getArgType(mb,pci,1)){
        case TYPE_bte: tag = *getArgReference_bte(stk,pci,1); break;
        case TYPE_sht: tag = *getArgReference_sht(stk,pci,1); break;
        case TYPE_int: tag = *getArgReference_int(stk,pci,1); break;
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
@@ -4,3 +4,4 @@ sys_queue_rotate
 HAVE_PYMONETDB?sys_queue_expand
 HAVE_PYMONETDB?sys_user_statistics
 drop_sleep
+sys_queue_multisessions
diff --git a/sql/test/sysmon/Tests/sys_queue_multisessions.SQL.py 
b/sql/test/sysmon/Tests/sys_queue_multisessions.SQL.py
new file mode 100644
--- /dev/null
+++ b/sql/test/sysmon/Tests/sys_queue_multisessions.SQL.py
@@ -0,0 +1,58 @@
+###
+# Check that an ordinary user can see queries in all its sessions
+###
+import pymonetdb
+import os
+
+DB = os.environ['TSTDB']
+PORT = int(os.environ['MAPIPORT'])
+HOST = os.environ['MAPIHOST']
+USR = 'u1'
+PSWD = 'u1'
+
+try:
+    mdbdbh = pymonetdb.connect(database=DB, port=PORT, hostname=HOST, 
autocommit=True)
+    mdbcursor = mdbdbh.cursor()
+    mdbcursor.execute('create role r1;')
+    mdbcursor.execute('create schema s1 authorization r1;')
+    mdbcursor.execute('create user u1 with password \'u1\' name \'u1\' schema 
s1;')
+    mdbcursor.execute('grant r1 to u1;')
+
+    # Let the user establish several connections to the server
+    usrdbh1 = pymonetdb.connect(database=DB, port=PORT, hostname=HOST,
+                            username=USR, password=PSWD, autocommit=True)
+    usrcursor1 = usrdbh1.cursor()
+
+    usrdbh2 = pymonetdb.connect(database=DB, port=PORT, hostname=HOST,
+                            username=USR, password=PSWD, autocommit=True)
+    usrcursor2 = usrdbh2.cursor()
+
+    # NB, we only have 4-1 slots in sys.queue to use because of the
+    # SingleServer config in this test
+    usrcursor1.execute('select \'u1 session_1\';')
+    usrcursor2.execute('select \'u1 session_2\';')
+
+    # Check that the sys.queue() output of each user contains queries from both
+    # connections
+    usrcursor1.execute('select username, sessionid  from sys.queue() group by 
username, sessionid order by sessionid;')
+    for row in usrcursor1.fetchall():
+        print(row)
+    usrcursor2.execute('select username, sessionid from sys.queue() group by 
username, sessionid order by sessionid;')
+    for row in usrcursor2.fetchall():
+        print(row)
+except pymonetdb.exceptions.Error as e:
+    print(e)
+finally:
+    # clean up and don't stop by an error
+    try:
+        if usrdbh1:
+            usrdbh1.close()
+        if usrdbh2:
+            usrdbh2.close()
+        mdbcursor.execute('drop user u1')
+        mdbcursor.execute('drop role r1')
+        mdbcursor.execute('drop schema s1')
+        mdbdbh.close()
+    except pymonetdb.exceptions.Error as e:
+        print(e)
+
diff --git a/sql/test/sysmon/Tests/sys_queue_multisessions.stable.err 
b/sql/test/sysmon/Tests/sys_queue_multisessions.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/sysmon/Tests/sys_queue_multisessions.stable.err
@@ -0,0 +1,12 @@
+stderr of test 'sys_queue_multisessions` in directory 'sql/test/sysmon` itself:
+
+
+# 13:06:34 >  
+# 13:06:34 >  "/usr/bin/python3.8" "sys_queue_multisessions.SQL.py" 
"sys_queue_multisessions"
+# 13:06:34 >  
+
+
+# 13:06:34 >  
+# 13:06:34 >  "Done."
+# 13:06:34 >  
+
diff --git a/sql/test/sysmon/Tests/sys_queue_multisessions.stable.out 
b/sql/test/sysmon/Tests/sys_queue_multisessions.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/sysmon/Tests/sys_queue_multisessions.stable.out
@@ -0,0 +1,16 @@
+stdout of test 'sys_queue_multisessions` in directory 'sql/test/sysmon` itself:
+
+
+# 13:06:34 >  
+# 13:06:34 >  "/usr/bin/python3.8" "sys_queue_multisessions.SQL.py" 
"sys_queue_multisessions"
+# 13:06:34 >  
+
+('u1', 1)
+('u1', 2)
+('u1', 1)
+('u1', 2)
+
+# 13:06:34 >  
+# 13:06:34 >  "Done."
+# 13:06:34 >  
+
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to