Changeset: deb916713971 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=deb916713971
Added Files:
sql/test/scoping/Tests/scoping04.py
sql/test/scoping/Tests/scoping04.stable.err
sql/test/scoping/Tests/scoping04.stable.out
Modified Files:
clients/mapiclient/mhelp.c
sql/server/sql_parser.y
sql/test/scoping/Tests/All
Branch: scoping2
Log Message:
Changed alter statement for user's schema path. The previous version created a
shift/reduce coflict which would cause problems. Added test.
diffs (170 lines):
diff --git a/clients/mapiclient/mhelp.c b/clients/mapiclient/mhelp.c
--- a/clients/mapiclient/mhelp.c
+++ b/clients/mapiclient/mhelp.c
@@ -83,7 +83,7 @@ SQLhelp sqlhelp1[] = {
"ALTER USER SET [ENCRYPTED | UNENCRYPTED] PASSWORD string USING OLD
PASSWORD string\n"
"ALTER USER ident WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string\n"
"ALTER USER ident [WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string] SET
SCHEMA ident\n"
- "ALTER USER ident [WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string] SET
SCHEMA PATH string",
+ "ALTER USER ident [WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string]
SCHEMA PATH string",
"ident",
"See also https://www.monetdb.org/Documentation/SQLreference/Users"},
{"ANALYZE",
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -1274,8 +1274,8 @@ user_schema:
;
user_schema_path:
- SET SCHEMA PATH string { $$ = $4; }
- | /* empty */ { $$ = NULL; }
+ SCHEMA PATH string { $$ = $3; }
+ | /* empty */ { $$ = NULL; }
;
alter_table_element:
diff --git a/sql/test/scoping/Tests/All b/sql/test/scoping/Tests/All
--- a/sql/test/scoping/Tests/All
+++ b/sql/test/scoping/Tests/All
@@ -2,6 +2,9 @@ scoping01
scoping02
scoping03
+# This test includes schema path changes
+scoping04
+
schema_disambiguity
ambiguity
predefinedvariable
diff --git a/sql/test/scoping/Tests/scoping04.py
b/sql/test/scoping/Tests/scoping04.py
new file mode 100644
--- /dev/null
+++ b/sql/test/scoping/Tests/scoping04.py
@@ -0,0 +1,92 @@
+import sys, os, pymonetdb
+
+# Using schema path to find a function
+db = os.getenv("TSTDB")
+port = int(os.getenv("MAPIPORT"))
+
+client1 = pymonetdb.connect(database=db, port=port, autocommit=True,
username='monetdb', password='monetdb')
+cur1 = client1.cursor()
+cur1.execute('''
+START TRANSACTION;
+CREATE schema "sc1";
+CREATE schema "sc2";
+CREATE FUNCTION "sc1"."foo"() RETURNS INT BEGIN RETURN 1; END;
+CREATE FUNCTION "sc2"."foo"() RETURNS INT BEGIN RETURN 2; END;
+CREATE FUNCTION "sys"."foo"() RETURNS INT BEGIN RETURN 3; END;
+CREATE USER myuser WITH UNENCRYPTED PASSWORD '1' NAME '1' SCHEMA "sys" SCHEMA
PATH '"sc1","sc2"';
+COMMIT;
+''')
+cur1.close()
+client1.close()
+
+client1 = pymonetdb.connect(database=db, port=port, autocommit=True,
username='myuser', password='1')
+cur1 = client1.cursor()
+cur1.execute('SELECT "foo"();')
+if cur1.fetchall() != [(3,)]:
+ sys.stderr.write('Expected result: [(3,)]')
+cur1.close()
+client1.close()
+
+client1 = pymonetdb.connect(database=db, port=port, autocommit=True,
username='monetdb', password='monetdb')
+cur1 = client1.cursor()
+cur1.execute('''
+START TRANSACTION;
+ALTER USER myuser SCHEMA PATH '"sc1","sc2"'; -- no error expected
+DROP FUNCTION "sys"."foo"();
+COMMIT;
+''')
+cur1.close()
+client1.close()
+
+client1 = pymonetdb.connect(database=db, port=port, autocommit=True,
username='myuser', password='1')
+cur1 = client1.cursor()
+cur1.execute('SELECT "foo"();')
+if cur1.fetchall() != [(1,)]:
+ sys.stderr.write('Expected result: [(1,)]')
+cur1.close()
+client1.close()
+
+client1 = pymonetdb.connect(database=db, port=port, autocommit=True,
username='monetdb', password='monetdb')
+cur1 = client1.cursor()
+cur1.execute('DROP FUNCTION "sc1"."foo"();')
+cur1.close()
+client1.close()
+
+client1 = pymonetdb.connect(database=db, port=port, autocommit=True,
username='myuser', password='1')
+cur1 = client1.cursor()
+cur1.execute('SELECT "foo"();')
+if cur1.fetchall() != [(2,)]:
+ sys.stderr.write('Expected result: [(2,)]')
+cur1.close()
+client1.close()
+
+client1 = pymonetdb.connect(database=db, port=port, autocommit=True,
username='monetdb', password='monetdb')
+cur1 = client1.cursor()
+try:
+ cur1.execute('ALTER USER myuser SCHEMA PATH \'sc1\';')
+ sys.stderr.write("Exception expected")
+except pymonetdb.DatabaseError as e:
+ if "A schema in the path must be within '\"'" not in str(e):
+ sys.stderr.write("Error: \"A schema in the path must be within '\"'\"
expected")
+try:
+ cur1.execute('ALTER USER myuser SCHEMA PATH \'"sc1\';')
+ sys.stderr.write("Exception expected")
+except pymonetdb.DatabaseError as e:
+ if " A schema path cannot end inside inside a schema name" not in str(e):
+ sys.stderr.write("Error: \"A schema path cannot end inside inside a
schema name\" expected")
+try:
+ cur1.execute('ALTER USER myuser SCHEMA PATH \'"sc1\';')
+ sys.stderr.write("Exception expected")
+except pymonetdb.DatabaseError as e:
+ if " A schema path cannot end inside inside a schema name" not in str(e):
+ sys.stderr.write("Error: \"A schema path cannot end inside inside a
schema name\" expected")
+
+cur1.execute('''
+START TRANSACTION;
+DROP USER myuser;
+DROP schema "sc1" CASCADE;
+DROP schema "sc2" CASCADE;
+COMMIT;
+''')
+cur1.close()
+client1.close()
diff --git a/sql/test/scoping/Tests/scoping04.stable.err
b/sql/test/scoping/Tests/scoping04.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/scoping/Tests/scoping04.stable.err
@@ -0,0 +1,12 @@
+stderr of test 'scoping04` in directory 'sql/test/scoping` itself:
+
+
+# 15:36:40 >
+# 15:36:40 > "/usr/bin/python3.9" "scoping04.py" "scoping04"
+# 15:36:40 >
+
+
+# 15:36:40 >
+# 15:36:40 > "Done."
+# 15:36:40 >
+
diff --git a/sql/test/scoping/Tests/scoping04.stable.out
b/sql/test/scoping/Tests/scoping04.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/scoping/Tests/scoping04.stable.out
@@ -0,0 +1,12 @@
+stdout of test 'scoping04` in directory 'sql/test/scoping` itself:
+
+
+# 15:36:40 >
+# 15:36:40 > "/usr/bin/python3.9" "scoping04.py" "scoping04"
+# 15:36:40 >
+
+
+# 15:36:40 >
+# 15:36:40 > "Done."
+# 15:36:40 >
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list