Changeset: 8290322589aa for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8290322589aa
Modified Files:
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_gencode.mx
        sql/server/rel_bin.c
        sql/server/rel_schema.c
        sql/server/rel_semantic.c
        sql/server/sql_privileges.c
        sql/server/sql_privileges.h
        sql/server/sql_schema.c
        sql/server/sql_semantic.c
        sql/server/sql_statement.c
        sql/server/sql_statement.h
        
sql/test/BugDay_2005-11-09_2.9.3/Tests/grant_public.SF-1114580.stable.err
        sql/test/BugTracker-2010/Tests/crashonschema.Bug-2547.stable.err
        sql/test/BugTracker/Tests/revoke_role.SF-1691646.stable.err
        sql/test/UserDump/Tests/create.stable.out
        sql/test/Users/Tests/schema.stable.err
Branch: default
Log Message:

fix crashonschema bug.
Execute grant/revoke (roles) through mal.


diffs (truncated from 1590 to 300 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
@@ -62,6 +62,14 @@
 address SQLcatalog
 comment "a catalog statement";
 
+pattern catalog(type:int,grantee:str,role:str):void
+address SQLcatalog
+comment "a grant/revoke role statement";
+
+pattern 
catalog(type:int,tname:str,grantee:str,privs:int,cname:str,grant:int,grantor:int):void
+address SQLcatalog
+comment "a grant/revoke privileges statement";
+
 pattern eval(cmd:str):void 
 address SQLstatement
 comment "Compile and execute a single sql statement";
@@ -1989,6 +1997,16 @@
 }
 
 
+static char *
+SaveArgReference(MalStkPtr stk, InstrPtr pci, int arg)
+{
+       char *val = *(str*)getArgReference(stk, pci, arg);
+
+       if (val && strcmp(val, str_nil) == 0)
+               val = NULL;
+       return val;
+}
+
 str
 SQLcatalog(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
@@ -2026,12 +2044,9 @@
                msg = drop_seq( sql, sname, name);
        }       break;
        case DDL_CREATE_SCHEMA: {
-               str name = *(str*) getArgReference(stk, pci, 3);
+               str name = SaveArgReference(stk, pci, 3);
                int auth_id = sql->role_id;
 
-               if (name && strcmp(name, str_nil) == 0)
-                       name = NULL;
-
                if (name && (auth_id = sql_find_auth(sql, name)) < 0) {
                        msg = sql_message("CREATE SCHEMA: no such authorization 
'%s'", name);
                }
@@ -2093,6 +2108,32 @@
 
                msg = drop_key( sql, sname, name, action);
        }       break;
+       case DDL_GRANT_ROLES: {
+               char *auth = SaveArgReference(stk, pci, 3);
+
+               msg = sql_grant_role( sql, sname /*grantee */, auth);
+       }       break;
+       case DDL_REVOKE_ROLES: {
+               char *auth = SaveArgReference(stk, pci, 3);
+
+               msg = sql_revoke_role( sql, sname /*grantee */, auth);
+       }       break;
+       case DDL_GRANT: {
+               char *grantee = *(str*)getArgReference(stk, pci, 3);
+               int privs = *(int*)getArgReference(stk, pci, 4);
+               char *cname = SaveArgReference(stk, pci, 5);
+               int grant = *(int*)getArgReference(stk, pci, 6);
+               int grantor = *(int*)getArgReference(stk, pci, 7);
+               msg = sql_grant_table_privs( sql, grantee, privs, sname, cname, 
grant, grantor);
+       }       break;
+       case DDL_REVOKE: {
+               char *grantee = *(str*)getArgReference(stk, pci, 3);
+               int privs = *(int*)getArgReference(stk, pci, 4);
+               char *cname = SaveArgReference(stk, pci, 5);
+               int grant = *(int*)getArgReference(stk, pci, 6);
+               int grantor = *(int*)getArgReference(stk, pci, 7);
+               msg = sql_revoke_table_privs( sql, grantee, privs, sname, 
cname, grant, grantor);
+       }       break;
        default:
                throw(SQL, "sql.catalog", "catalog unknown type");
        }
diff --git a/sql/backends/monet5/sql_gencode.mx 
b/sql/backends/monet5/sql_gencode.mx
--- a/sql/backends/monet5/sql_gencode.mx
+++ b/sql/backends/monet5/sql_gencode.mx
@@ -1706,31 +1706,24 @@
                        break;
                }
                case st_catalog: {
-                       int l = -1, r = -1, k = -1;
+                       _dumpstmt(sql, mb, s->op1);
 
-                       l = _dumpstmt(sql, mb, s->op1);
-                       if (s->op2)
-                               r = _dumpstmt(sql, mb, s->op2);
-                       k = _dumpstmt(sql, mb, s->op3);
                        q = newStmt1(mb, sqlRef, "catalog");
                        q = pushInt(mb, q, s->flag);
-                       q = pushArgument(mb, q, l);
-                       if (r > 0) 
-                               q = pushArgument(mb, q, r);
-                       else
-                               q = pushNil(mb, q, TYPE_str);
-                       q = pushArgument(mb, q, k);
+                       for (n = s->op1->op4.lval->h; n; n = n->next) {
+                               stmt *c = n->data;
+                               q = pushArgument(mb, q, c->nr);
+                       }
                        s->nr = getDestVar(q);
                        break;
                }
                case st_alias:
                        s->nr = _dumpstmt(sql, mb, s->op1);
                        break;
-               case st_list:{
+               case st_list:
                        for (n = s->op4.lval->h; n; n = n->next) {
                                _dumpstmt(sql, mb, n->data);
                        }
-               }
                        s->nr = 1;
                        break;
                case st_rs_column:{
diff --git a/sql/server/rel_bin.c b/sql/server/rel_bin.c
--- a/sql/server/rel_bin.c
+++ b/sql/server/rel_bin.c
@@ -3367,17 +3367,21 @@
 rel2bin_seq(mvc *sql, sql_rel *rel, list *refs) 
 {
        node *en = rel->exps->h;
-       stmt *restart, *sname, *seq, *l = NULL;
+       stmt *restart, *sname, *seq, *sl = NULL;
+       list *l = list_new(sql->sa);
 
        if (rel->l)  /* first construct the sub relation */
-               l = subrel_bin(sql, rel->l, refs);
-
-       restart = exp_bin(sql, en->data, l, NULL, NULL, NULL);
-       sname = exp_bin(sql, en->next->data, l, NULL, NULL, NULL);
-       seq = exp_bin(sql, en->next->next->data, l, NULL, NULL, NULL);
+               sl = subrel_bin(sql, rel->l, refs);
+
+       restart = exp_bin(sql, en->data, sl, NULL, NULL, NULL);
+       sname = exp_bin(sql, en->next->data, sl, NULL, NULL, NULL);
+       seq = exp_bin(sql, en->next->next->data, sl, NULL, NULL, NULL);
 
        (void)refs;
-       return stmt_catalog(sql->sa, rel->flag, sname, seq, restart);
+       append(l, sname);
+       append(l, seq);
+       append(l, restart);
+       return stmt_catalog(sql->sa, rel->flag, stmt_list(sql->sa, l));
 }
 
 static stmt *
@@ -3387,9 +3391,13 @@
        stmt *action = exp_bin(sql, en->data, NULL, NULL, NULL, NULL);
        stmt *sname = exp_bin(sql, en->next->data, NULL, NULL, NULL, NULL);
        stmt *name = exp_bin(sql, en->next->next->data, NULL, NULL, NULL, NULL);
+       list *l = list_new(sql->sa);
 
        (void)refs;
-       return stmt_catalog(sql->sa, rel->flag, sname, name, action);
+       append(l, sname);
+       append(l, name);
+       append(l, action);
+       return stmt_catalog(sql->sa, rel->flag, stmt_list(sql->sa, l));
 }
 
 static stmt *
@@ -3411,13 +3419,20 @@
        node *en = rel->exps->h;
        stmt *action = exp_bin(sql, en->data, NULL, NULL, NULL, NULL);
        stmt *sname = NULL, *name = NULL;
+       list *l = list_new(sql->sa);
 
        (void)refs;
        en = en->next;
        sname = exp_bin(sql, en->data, NULL, NULL, NULL, NULL);
-       if (en->next) 
+       if (en->next) {
                name = exp_bin(sql, en->next->data, NULL, NULL, NULL, NULL);
-       return stmt_catalog(sql->sa, rel->flag, sname, name, action);
+       } else {
+               name = stmt_atom_string_nil(sql->sa);
+       }
+       append(l, sname);
+       append(l, name);
+       append(l, action);
+       return stmt_catalog(sql->sa, rel->flag, stmt_list(sql->sa, l));
 }
 
 static stmt *
@@ -3426,6 +3441,7 @@
        node *en = rel->exps->h;
        stmt *action = exp_bin(sql, en->data, NULL, NULL, NULL, NULL);
        stmt *table = NULL, *sname;
+       list *l = list_new(sql->sa);
 
        (void)refs;
        en = en->next;
@@ -3433,7 +3449,32 @@
        en = en->next;
        if (en) 
                table = exp_bin(sql, en->data, NULL, NULL, NULL, NULL);
-       return stmt_catalog(sql->sa, rel->flag, sname, table, action);
+       append(l, sname);
+       append(l, table);
+       append(l, action);
+       return stmt_catalog(sql->sa, rel->flag, stmt_list(sql->sa, l));
+}
+
+static stmt *
+rel2bin_privs(mvc *sql, sql_rel *rel, list *refs) 
+{
+       node *en;
+       list *l = list_new(sql->sa);
+
+       (void)refs;
+       for (en = rel->exps->h; en; en = en->next) {
+               stmt *es = NULL;
+
+               if (en->data) {
+                       es = exp_bin(sql, en->data, NULL, NULL, NULL, NULL);
+                       if (!es) 
+                               return NULL;
+               } else {
+                       es = stmt_atom_string_nil(sql->sa);
+               }
+               append(l,es);
+       }
+       return stmt_catalog(sql->sa, rel->flag, stmt_list(sql->sa, l));
 }
 
 static stmt *
@@ -3461,6 +3502,9 @@
        } else if (rel->flag <= DDL_ALTER_TABLE) {
                s = rel2bin_catalog_table(sql, rel, refs);
                sql->type = Q_SCHEMA;
+       } else if (rel->flag <= DDL_REVOKE) {
+               s = rel2bin_privs(sql, rel, refs);
+               sql->type = Q_SCHEMA;
        }
        return s;
 }
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
@@ -67,6 +67,8 @@
 {
        sql_rel *rel = rel_create(sa);
 
+       if (!l)
+               return r;
        rel->l = l;
        rel->r = r;
        rel->op = op_ddl;
@@ -959,6 +961,7 @@
                sql_error(sql, 02, "CREATE SCHEMA: name '%s' already in use", 
name);
                return NULL;
        } else {
+               sql_schema *os = sql->session->schema;
                dnode *n;
                sql_schema *ss = ZNEW(sql_schema);
                sql_rel *ret;
@@ -971,10 +974,12 @@
                ss->auth_id = auth_id;
                ss->owner = sql->user_id;
 
+               sql->session->schema = ss;
                n = schema_elements->h;
                while (n) {
                        sql_rel *res = NULL;
 
+                       /*
                        if (n->data.sym->token == SQL_CREATE_TABLE) {
                                dlist *l = n->data.sym->data.lval;
                                dlist *qname = l->h->next->data.lval;
@@ -991,6 +996,8 @@
                                assert(l->h->next->next->next->next->type == 
type_int);
                                res = rel_create_view(sql, ss, l->h->data.lval, 
l->h->next->data.lval, l->h->next->next->data.sym, 
l->h->next->next->next->data.i_val, l->h->next->next->next->next->data.i_val);
                        }
+                       */
+                       res = rel_semantic(sql, n->data.sym);
                        if (!res) {
                                rel_destroy(ret);
                                return NULL;
@@ -998,6 +1005,7 @@
                        ret = rel_list(sql->sa, ret, res);
                        n = n->next;
                }
+               sql->session->schema = os;
                return ret;
        }
 }
@@ -1116,6 +1124,299 @@
        }
 }
 
+static sql_rel *
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to