Changeset: a9a817016125 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a9a817016125
Modified Files:
        sql/test/Users/Tests/copyinto.SQL.py
Branch: default
Log Message:

Cleaned up and extended the test


diffs (130 lines):

diff --git a/sql/test/Users/Tests/copyinto.SQL.py 
b/sql/test/Users/Tests/copyinto.SQL.py
--- a/sql/test/Users/Tests/copyinto.SQL.py
+++ b/sql/test/Users/Tests/copyinto.SQL.py
@@ -1,77 +1,60 @@
-import os, sys
+###
+# Check that to execute COPY INTO and COPY FROM, a user does not only need the
+#   INSERT and SELECT privileges but also the COPY INTO and COPY FROM
+#   privileges.
+###
 
-TSTSRCBASE = os.environ['TSTSRCBASE']
-SRCDIR = os.path.join(TSTSRCBASE, "sql", "benchmarks", "tpch")
-DATADIR = os.path.join(SRCDIR,"SF-0.01")
-
+import os, sys
 from MonetDBtesting.sqltest import SQLTestCase
 
-with SQLTestCase() as tc:
-    tc.connect(username="monetdb", password="monetdb")
-    tc.execute("CREATE TABLE REGION ( R_REGIONKEY INTEGER NOT NULL, R_NAME 
CHAR(25) NOT NULL, R_COMMENT VARCHAR(152));\n").assertSucceeded()
-    tc.execute("COPY 5 RECORDS INTO region from r'%s' USING DELIMITERS '|', 
E'|\\n';\n" % os.path.join(DATADIR, 'region.tbl'))
-    tc.execute("select count(*) from region;\n")
-    tc.execute("CREATE USER copyuser WITH PASSWORD 'copyuser' name 'copyuser' 
schema sys;\n")
-    tc.execute("GRANT INSERT, SELECT on region to copyuser;\n")
+BASEDIR = os.environ.get('TSTTRGDIR')
+INPUT = os.path.join(BASEDIR, "copyfrom.csv")
+OUTPUT = os.path.join(BASEDIR, "copyinto.csv")
 
-    tc.connect(username="copyuser", password="copyuser")
-    tc.execute("COPY 5 RECORDS INTO region from r'%s' USING DELIMITERS '|', 
E'|\\n';\n" % os.path.join(DATADIR, 'region.tbl')).assertFailed()
-    tc.execute("select count(*) from region;\n").assertSucceeded()
-
-    tc.connect(username="monetdb", password="monetdb")
-    tc.execute("GRANT COPY FROM, COPY INTO to copyuser;\n").assertSucceeded()
+with open(INPUT, 'w') as csvin:
+    csvin.write("24\n42\n")
 
-    tc.connect(username="copyuser", password="copyuser")
-    tc.execute("COPY 5 RECORDS INTO region from r'%s' USING DELIMITERS '|', 
E'|\\n';\n" % os.path.join(DATADIR, 'region.tbl')).assertSucceeded()
-    tc.execute("select count(*) from region;\n").assertSucceeded()
-
-    tc.connect(username="monetdb", password="monetdb")
-    tc.execute("REVOKE COPY FROM, COPY INTO from 
copyuser;\n").assertSucceeded()
-
-
+with SQLTestCase() as mdb:
+    mdb.connect(username="monetdb", password="monetdb")
+    mdb.execute("CREATE TABLE t (i INT);").assertSucceeded()
+    mdb.execute("COPY 2 RECORDS INTO t FROM r'%s' USING DELIMITERS ',', 
E'\\n','\"';" % INPUT).assertSucceeded()
+    mdb.execute("CREATE USER copyuser WITH PASSWORD 'copyuser' name 'copyuser' 
schema sys;").assertSucceeded()
 
-# import os, sys
-# try:
-#     from MonetDBtesting import process
-# except ImportError:
-#     import process
-
-# TSTSRCBASE = os.environ['TSTSRCBASE']
-# SRCDIR = os.path.join(TSTSRCBASE, "sql", "benchmarks", "tpch")
-# DATADIR = os.path.join(SRCDIR,"SF-0.01")
+    # TODO: add check for COPY <INTO|FROM> STDIN
+    with SQLTestCase() as usr:
+        # The user has no privileges
+        usr.connect(username="copyuser", password="copyuser")
+        usr.execute("SELECT * FROM t;").assertFailed(err_code="42000", 
err_message="SELECT: access denied for copyuser to table 'sys.t'")
+        usr.execute("INSERT INTO t VALUES 
(888);").assertFailed(err_code="42000", err_message="INSERT INTO: insufficient 
privileges for user 'copyuser' to insert into table 't'")
+        usr.execute("COPY 2 RECORDS INTO t FROM r'%s' USING DELIMITERS ',', 
E'\\n','\"';" % INPUT).assertFailed(err_code="42000", err_message="COPY INTO: 
insufficient privileges for user 'copyuser' to copy into table 't'")
 
-# with process.client('sql', stdin = process.PIPE, stdout = process.PIPE, 
stderr = process.PIPE) as c:
-#     c.stdin.write("CREATE TABLE REGION ( R_REGIONKEY INTEGER NOT NULL, 
R_NAME CHAR(25) NOT NULL, R_COMMENT VARCHAR(152));\n")
-#     c.stdin.write("COPY 5 RECORDS INTO region from r'%s' USING DELIMITERS 
'|', E'|\\n';\n" % os.path.join(DATADIR, 'region.tbl'))
-#     c.stdin.write("select count(*) from region;\n")
-#     c.stdin.write("CREATE USER copyuser WITH PASSWORD 'copyuser' name 
'copyuser' schema sys;\n")
-#     c.stdin.write("GRANT INSERT, SELECT on region to copyuser;\n")
-#     out, err = c.communicate()
-#     sys.stdout.write(out)
-#     sys.stderr.write(err.replace(DATADIR, 
'$DATADIR').replace(DATADIR.replace('\\', r'\\'), '$DATADIR').replace(r'DIR\\', 
'DIR/').replace('DIR\\', 'DIR/'))
+        # Check that for COPY INTO <table> FROM <file>, the user needs both
+        #  INSERT and COPY FROM privileges
+        mdb.execute("GRANT INSERT ON t TO copyuser;").assertSucceeded()
+        usr.execute("INSERT INTO t VALUES (888);").assertSucceeded()
+        usr.execute("COPY 2 RECORDS INTO t FROM r'%s' USING DELIMITERS ',', 
E'\\n','\"';" % INPUT).assertFailed(err_code="42000", err_message="COPY INTO: 
insufficient privileges: COPY INTO from file(s) requires database administrator 
rights, use 'COPY INTO \"t\" FROM file ON CLIENT' instead")
+        mdb.execute("GRANT COPY FROM TO copyuser;").assertSucceeded()
+        usr.execute("COPY 2 RECORDS INTO t FROM r'%s' USING DELIMITERS ',', 
E'\\n','\"';" % INPUT).assertSucceeded()
 
-# with process.client('sql', user = 'copyuser', passwd = 'copyuser', stdin = 
process.PIPE, stdout = process.PIPE, stderr = process.PIPE) as c:
-#     c.stdin.write("COPY 5 RECORDS INTO region from r'%s' USING DELIMITERS 
'|', E'|\\n';\n" % os.path.join(DATADIR, 'region.tbl'))
-#     c.stdin.write("select count(*) from region;\n")
-#     out, err = c.communicate()
-#     sys.stdout.write(out)
-#     sys.stderr.write(err.replace(DATADIR, 
'$DATADIR').replace(DATADIR.replace('\\', r'\\'), '$DATADIR').replace(r'DIR\\', 
'DIR/').replace('DIR\\', 'DIR/'))
+        mdb.execute("REVOKE INSERT ON t FROM copyuser;\n").assertSucceeded()
+        usr.execute("COPY 2 RECORDS INTO t FROM r'%s' USING DELIMITERS ',', 
E'\\n','\"';" % INPUT).assertFailed(err_code="42000", err_message="COPY INTO: 
insufficient privileges for user 'copyuser' to copy into table 't'")
+        mdb.execute("GRANT INSERT ON t TO copyuser;").assertSucceeded()
+        mdb.execute("REVOKE COPY FROM FROM copyuser;\n").assertSucceeded()
+        usr.execute("COPY 2 RECORDS INTO t FROM r'%s' USING DELIMITERS ',', 
E'\\n','\"';" % INPUT).assertFailed(err_code="42000", err_message="COPY INTO: 
insufficient privileges: COPY INTO from file(s) requires database administrator 
rights, use 'COPY INTO \"t\" FROM file ON CLIENT' instead")
 
-# with process.client('sql', stdin = process.PIPE, stdout = process.PIPE, 
stderr = process.PIPE) as c:
-#     c.stdin.write("GRANT COPY FROM, COPY INTO to copyuser;\n")
-#     out, err = c.communicate()
-#     sys.stdout.write(out)
-#     sys.stderr.write(err.replace(DATADIR, 
'$DATADIR').replace(DATADIR.replace('\\', r'\\'), '$DATADIR').replace(r'DIR\\', 
'DIR/').replace('DIR\\', 'DIR/'))
+        # Check that for COPY <table> INTO <file>, the user needs both SELECT
+        #   and COPY INTO privileges
+        mdb.execute("GRANT SELECT ON t TO copyuser;").assertSucceeded()
+        usr.execute("SELECT * FROM 
t;").assertSucceeded().assertDataResultMatch([(24,), (42,), (888,), (24,), 
(42,)])
+        usr.execute("COPY SELECT * FROM t INTO r'%s';" % 
OUTPUT).assertFailed(err_code="42000", err_message="COPY INTO: insufficient 
privileges: COPY INTO file requires database administrator rights, use 'COPY 
... INTO file ON CLIENT' instead")
 
-# with process.client('sql', user = 'copyuser', passwd = 'copyuser', stdin = 
process.PIPE, stdout = process.PIPE, stderr = process.PIPE) as c:
-#     c.stdin.write("COPY 5 RECORDS INTO region from r'%s' USING DELIMITERS 
'|', E'|\\n';\n" % os.path.join(DATADIR, 'region.tbl'))
-#     c.stdin.write("select count(*) from region;\n")
-#     out, err = c.communicate()
-#     sys.stdout.write(out)
-#     sys.stderr.write(err.replace(DATADIR, 
'$DATADIR').replace(DATADIR.replace('\\', r'\\'), '$DATADIR').replace(r'DIR\\', 
'DIR/').replace('DIR\\', 'DIR/'))
+        mdb.execute("GRANT COPY INTO TO copyuser;").assertSucceeded()
+        usr.execute("COPY SELECT * FROM t INTO r'%s';" % 
OUTPUT).assertSucceeded()
 
-# with process.client('sql', stdin = process.PIPE, stdout = process.PIPE, 
stderr = process.PIPE) as c:
-#     c.stdin.write("REVOKE COPY FROM, COPY INTO from copyuser;\n")
-#     out, err = c.communicate()
-#     sys.stdout.write(out)
-#     sys.stderr.write(err)
+        mdb.execute("REVOKE COPY INTO FROM copyuser;\n").assertSucceeded()
+        usr.execute("COPY SELECT * FROM t INTO r'%s';" % 
OUTPUT).assertFailed(err_code="42000", err_message="COPY INTO: insufficient 
privileges: COPY INTO file requires database administrator rights, use 'COPY 
... INTO file ON CLIENT' instead")
+
+        mdb.execute("GRANT COPY INTO TO copyuser;").assertSucceeded()
+        mdb.execute("REVOKE SELECT ON t FROM copyuser;\n").assertSucceeded()
+        usr.execute("COPY SELECT * FROM t INTO r'%s';" % 
OUTPUT).assertFailed(err_code="42000", err_message="SELECT: access denied for 
copyuser to table 'sys.t'")
+
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to