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

Reply via email to