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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list