Changeset: e87b49ae6227 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e87b49ae6227
Modified Files:
        sql/backends/monet5/sql.mx
        sql/server/rel_schema.c
        sql/test/BugTracker-2011/Tests/All
        sql/test/BugTracker-2011/Tests/user_create_temp_table.Bug-2916.SQL.py
Branch: Aug2011
Log Message:

allow local temps to be created by any body (is al session local schema)


diffs (121 lines):

diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx
--- a/sql/backends/monet5/sql.mx
+++ b/sql/backends/monet5/sql.mx
@@ -1800,7 +1800,7 @@ create_table_or_view( mvc *sql, char *sn
        if (mvc_bind_table(sql, s, t->base.name)) {
                char *cd = (temp == SQL_DECLARED_TABLE)?"DECLARE":"CREATE";
                return sql_message("%s TABLE: name '%s' already in use", cd, 
t->base.name);
-       } else if (temp != SQL_DECLARED_TABLE &&!schema_privs(sql->role_id, s)){
+       } else if (temp != SQL_DECLARED_TABLE && (!schema_privs(sql->role_id, 
s) && !(isTempSchema(s) && temp == SQL_LOCAL_TEMP))){
                return sql_message("CREATE TABLE: insufficient privileges for 
user '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name);
        }
 
@@ -1868,7 +1868,7 @@ alter_table( mvc *sql, char *sname, sql_
        if ((nt = mvc_bind_table(sql, s, t->base.name)) == NULL) {
                return sql_message("ALTER TABLE: no such table '%s'", 
t->base.name);
 
-       } else if (!schema_privs(sql->role_id, s)){
+       } else if (!schema_privs(sql->role_id, s) && !(isTempSchema(s) && 
t->persistence == SQL_LOCAL_TEMP)){
                return sql_message("ALTER TABLE: insufficient privileges for 
user '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name);
        }
 
@@ -1996,7 +1996,7 @@ drop_table(mvc *sql, char *sname, char *
                return sql_message("DROP TABLE: cannot drop VIEW '%s'", tname);
        } else if (t->system) {
                return sql_message("DROP TABLE: cannot drop system table '%s'", 
tname);
-       } else if (!schema_privs(sql->role_id, s)) {
+       } else if (!schema_privs(sql->role_id, s) && !(isTempSchema(s) && 
t->persistence == SQL_LOCAL_TEMP)){
                return sql_message("DROP TABLE: access denied for %s to schema 
;'%s'", stack_get_string(sql, "current_user"), s->base.name);
        }
        if ( !drop_action && t->keys.set) {
@@ -2041,7 +2041,7 @@ drop_view(mvc *sql, char *sname, char *t
 
        t = mvc_bind_table(sql, ss, tname);
 
-       if (!schema_privs(sql->role_id, ss)) {  
+       if (!schema_privs(sql->role_id, ss) && !(isTempSchema(ss) && t && 
t->persistence == SQL_LOCAL_TEMP)){  
                return sql_message("DROP VIEW: access denied for %s to schema 
'%s'", stack_get_string(sql, "current_user"), ss->base.name);
        } else if (!t) {
                return sql_message("DROP VIEW: unknown view '%s'", tname);
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -795,7 +795,7 @@ rel_create_table(mvc *sql, sql_schema *s
        if (mvc_bind_table(sql, s, name)) {
                char *cd = (temp == SQL_DECLARED_TABLE)?"DECLARE":"CREATE";
                return sql_error(sql, 02, "%s TABLE: name '%s' already in use", 
cd, name);
-       } else if (temp != SQL_DECLARED_TABLE &&!schema_privs(sql->role_id, s)){
+       } else if (temp != SQL_DECLARED_TABLE && (!schema_privs(sql->role_id, 
s) && !(isTempSchema(s) && temp == SQL_LOCAL_TEMP))){
                return sql_error(sql, 02, "CREATE TABLE: insufficient 
privileges for user '%s' in schema '%s'", stack_get_string(sql, 
"current_user"), s->base.name);
        } else if (table_elements_or_subquery->token == SQL_CREATE_TABLE) { 
                /* table element list */
@@ -864,7 +864,7 @@ rel_create_view(mvc *sql, sql_schema *ss
 
        if (create && mvc_bind_table(sql, s, name) != NULL) {
                return sql_error(sql, 02, "CREATE VIEW: name '%s' already in 
use", name);
-       } else if (create && !schema_privs(sql->role_id, s)) {
+       } else if (create && (!schema_privs(sql->role_id, s) && 
!(isTempSchema(s) && persistent == SQL_LOCAL_TEMP))) {
                return sql_error(sql, 02, "CREATE VIEW: access denied for %s to 
schema ;'%s'", stack_get_string(sql, "current_user"), s->base.name);
        } else if (query) {
                char emode = sql->emode;
diff --git a/sql/test/BugTracker-2011/Tests/All 
b/sql/test/BugTracker-2011/Tests/All
--- a/sql/test/BugTracker-2011/Tests/All
+++ b/sql/test/BugTracker-2011/Tests/All
@@ -59,3 +59,4 @@ sqltables.Bug-2921
 Multiplication_and_cast.Bug-2923
 like_or.Bug-2924
 update_with_count.Bug-2928
+user_create_temp_table.Bug-2916
diff --git 
a/sql/test/BugTracker-2011/Tests/user_create_temp_table.Bug-2916.SQL.py 
b/sql/test/BugTracker-2011/Tests/user_create_temp_table.Bug-2916.SQL.py
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2011/Tests/user_create_temp_table.Bug-2916.SQL.py
@@ -0,0 +1,48 @@
+import os, sys
+try:
+    from MonetDBtesting import process
+except ImportError:
+    import process
+
+c = process.client('sql',
+                   args = ['-s', '''CREATE USER "testuser" WITH PASSWORD 
\'password\' NAME \'Test User\' SCHEMA "sys";''' ],
+                   stdout = process.PIPE,
+                   stderr = process.PIPE)
+out, err = c.communicate()
+if out:
+    sys.stdout.write(out)
+if err:
+    sys.stderr.write(err)
+
+c = process.client('sql',
+                   args = ['-s', 'CREATE GLOBAL TEMPORARY TABLE TempTable (i 
int);' ],
+                   user = 'testuser', passwd = 'password',
+                   stdout = process.PIPE,
+                   stderr = process.PIPE)
+out, err = c.communicate()
+if out:
+    sys.stdout.write(out)
+if err:
+    sys.stderr.write(err)
+
+c = process.client('sql',
+                   args = ['-s', 'CREATE LOCAL TEMPORARY TABLE TempTable (i 
int); '],
+                   user = 'testuser', passwd = 'password',
+                   stdout = process.PIPE,
+                   stderr = process.PIPE)
+out, err = c.communicate()
+if out:
+    sys.stdout.write(out)
+if err:
+    sys.stderr.write(err)
+
+# undo damage
+c = process.client('sql',
+                   args = ['-s', '''DROP USER "testuser"'''],
+                   stdout = process.PIPE,
+                   stderr = process.PIPE)
+out, err = c.communicate()
+if out:
+    sys.stdout.write(out)
+if err:
+    sys.stderr.write(err)
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to