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