Changeset: 30d12a4105a0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=30d12a4105a0
Modified Files:
gdk/gdk_select.c
monetdb5/modules/mal/clients.c
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_optimizer.c
sql/server/rel_schema.c
sql/server/rel_select.c
sql/server/sql_privileges.c
sql/test/BugDay_2005-11-09_2.9.3/Tests/grant_public.SF-1114580.stable.err
sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.stable.out.int128
sql/test/BugTracker-2012/Tests/scalar_subquery_with_alias.Bug-3093.stable.out
sql/test/BugTracker-2015/Tests/assertHead.Bug-3706.stable.out
sql/test/Users/Tests/test_privs2_p2.stable.err
Branch: Jul2015
Log Message:
Bug fixes
Bug 3759 fixed types of returned bats (ie use timestamps instead of lng) in
modules/mal/clients.c
Bug 3769 fixed crash (triggered assert) by properly looking for referenced
groupby columns in push aggr down
optimizer in rel_optimizer.c
Bug 3760 fixed correlated subquery handling in rel_select.c, ie merge only
distinct expressions.
Bug 3761 fixed by properly adding the zero_or_one aggregation only when needed
(ie when the cardinality of
the outer query is a column/table, ie when we expect one value per row for the
subquery).
Bug 3364 fixed in sql_privileges.c, ie allow set role when role_id == auth_id
(ie default role).
Bug 3365 fixed in sql_privileges.c, the sql_grant_table_privs always added
'all' privileges in one go
in rel_schema.c properly pass the login_id or role_id based on
the 'from current_{role/user}'
part of the grant statement
Bug 3476 was already fixed by previous revoke / schema fixes.
in gdk/gdk_select.c fixed problem with anti select and nils (stop before first
nil instead of last)
diffs (truncated from 449 to 300 lines):
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1518,7 +1518,7 @@ BATsubselect(BAT *b, BAT *s, const void
BATcount(b) +
b->hseqbase);
}
} else {
- BUN last = SORTfndlast(b, nil) - BUNfirst(b);
+ BUN last = SORTfndfirst(b, nil) - BUNfirst(b);
/* match: [0..low) + [high..last) */
if (s) {
oid o = (oid) last + b->H->seq;
diff --git a/monetdb5/modules/mal/clients.c b/monetdb5/modules/mal/clients.c
--- a/monetdb5/modules/mal/clients.c
+++ b/monetdb5/modules/mal/clients.c
@@ -591,9 +591,9 @@ CLTsessions(Client cntxt, MalBlkPtr mb,
(void) mb;
user = BATnew(TYPE_void, TYPE_str, 0, TRANSIENT);
- login = BATnew(TYPE_void, TYPE_lng, 0, TRANSIENT);
+ login = BATnew(TYPE_void, TYPE_timestamp, 0, TRANSIENT);
stimeout = BATnew(TYPE_void, TYPE_lng, 0, TRANSIENT);
- last = BATnew(TYPE_void, TYPE_lng, 0, TRANSIENT);
+ last = BATnew(TYPE_void, TYPE_timestamp, 0, TRANSIENT);
qtimeout = BATnew(TYPE_void, TYPE_lng, 0, TRANSIENT);
active = BATnew(TYPE_void, TYPE_bit, 0, TRANSIENT);
if ( user == NULL || login == NULL || stimeout == NULL || qtimeout ==
NULL || active == NULL){
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -625,6 +625,16 @@ exp_cmp( sql_exp *e1, sql_exp *e2)
}
int
+exp_equal( sql_exp *e1, sql_exp *e2)
+{
+ if (e1 == e2)
+ return 0;
+ if (e1->rname && e2->rname && strcmp(e1->rname, e2->rname) == 0)
+ return strcmp(e1->name, e2->name);
+ return -1;
+}
+
+int
exp_match( sql_exp *e1, sql_exp *e2)
{
if (exp_cmp(e1, e2) == 0)
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -92,6 +92,7 @@ extern char *exp_find_rel_name(sql_exp *
extern sql_exp *rel_find_exp( sql_rel *rel, sql_exp *e);
extern int exp_cmp( sql_exp *e1, sql_exp *e2);
+extern int exp_equal( sql_exp *e1, sql_exp *e2);
extern int exp_refers( sql_exp *c, sql_exp *p);
extern int exp_match( sql_exp *e1, sql_exp *e2);
extern int exp_match_exp( sql_exp *e1, sql_exp *e2);
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -2972,7 +2972,7 @@ static sql_exp *
exp_uses_exp( list *exps, sql_exp *e)
{
node *n;
- char *rname = exp_find_rel_name(e);
+ char *rname = exp_relname(e);
char *name = exp_name(e);
if (!exps)
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
@@ -1702,7 +1702,7 @@ rel_schemas(mvc *sql, symbol *s)
ret = rel_grant_roles(sql, cur_schema(sql), l->h->data.lval,
/* authids */
l->h->next->data.lval, /* grantees */
l->h->next->next->data.i_val, /* admin? */
- l->h->next->next->next->data.i_val ?
sql->user_id : sql->role_id);
+ l->h->next->next->next->data.i_val ==
cur_user ? sql->user_id : sql->role_id);
/* grantor ? */
} break;
case SQL_REVOKE_ROLES:
@@ -1714,7 +1714,7 @@ rel_schemas(mvc *sql, symbol *s)
ret = rel_revoke_roles(sql, cur_schema(sql), l->h->data.lval,
/* authids */
l->h->next->data.lval, /* grantees */
l->h->next->next->data.i_val, /* admin? */
- l->h->next->next->next->data.i_val ?
sql->user_id : sql->role_id);
+ l->h->next->next->next->data.i_val ==
cur_user? sql->user_id : sql->role_id);
/* grantor ? */
} break;
case SQL_GRANT:
@@ -1726,7 +1726,7 @@ rel_schemas(mvc *sql, symbol *s)
ret = rel_grant_privs(sql, cur_schema(sql), l->h->data.lval,
/* privileges */
l->h->next->data.lval, /* grantees */
l->h->next->next->data.i_val, /* grant ? */
- l->h->next->next->next->data.i_val ?
sql->user_id : sql->role_id);
+ l->h->next->next->next->data.i_val ==
cur_user? sql->user_id : sql->role_id);
/* grantor ? */
} break;
case SQL_REVOKE:
@@ -1738,7 +1738,7 @@ rel_schemas(mvc *sql, symbol *s)
ret = rel_revoke_privs(sql, cur_schema(sql), l->h->data.lval,
/* privileges */
l->h->next->data.lval, /* grantees */
l->h->next->next->data.i_val, /*
grant ? */
- l->h->next->next->next->data.i_val ?
sql->user_id : sql->role_id);
+ l->h->next->next->next->data.i_val ==
cur_user? sql->user_id : sql->role_id);
/* grantor ? */
} break;
case SQL_CREATE_ROLE:
@@ -1746,7 +1746,7 @@ rel_schemas(mvc *sql, symbol *s)
dlist *l = s->data.lval;
char *rname = l->h->data.sval;
ret = rel_schema2(sql->sa, DDL_CREATE_ROLE, rname, NULL,
- l->h->next->data.i_val ? sql->user_id :
sql->role_id);
+ l->h->next->data.i_val == cur_user?
sql->user_id : sql->role_id);
} break;
case SQL_DROP_ROLE:
{
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -976,7 +976,8 @@ rel_sample(sql_allocator *sa, sql_rel *l
return rel;
}
-static char * rel_get_name( sql_rel *rel )
+static char *
+rel_get_name( sql_rel *rel )
{
switch(rel->op) {
case op_table:
@@ -5056,6 +5057,7 @@ rel_value_exp2(mvc *sql, sql_rel **rel,
}
if (!r && sql->session->status != -ERR_AMBIGUOUS) {
sql_exp *rs = NULL;
+ int card = 0;
if (!*rel)
return NULL;
@@ -5064,10 +5066,12 @@ rel_value_exp2(mvc *sql, sql_rel **rel,
sql->session->status = 0;
sql->errstr[0] = '\0';
+ /* add unique */
+ card = exps_card((*rel)->exps);
*rel = r = rel_subquery(sql, *rel, se, ek, f ==
sql_sel?APPLY_LOJ:APPLY_JOIN);
if (r) {
rs = rel_lastexp(sql, r);
- if (f == sql_sel && r->card > CARD_ATOM &&
r->r) {
+ if (f == sql_sel && card > CARD_ATOM && r->card
> CARD_ATOM && r->r) {
sql_subaggr *zero_or_one =
sql_bind_aggr(sql->sa, sql->session->schema, "zero_or_one", exp_subtype(rs));
rs = exp_aggr1(sql->sa, rs,
zero_or_one, 0, 0, CARD_ATOM, 0);
@@ -5075,7 +5079,7 @@ rel_value_exp2(mvc *sql, sql_rel **rel,
r->r = rel_groupby(sql, r->r, NULL);
rs = rel_groupby_add_aggr(sql, r->r,
rs);
rs = exp_column(sql->sa,
exp_relname(rs), exp_name(rs), exp_subtype(rs), exp_card(rs), has_nil(rs),
is_intern(rs));
- } else if (f == sql_sel) {
+ } else if (f == sql_sel && !r->r) {
*rel = rel_project(sql->sa, *rel,
new_exp_list(sql->sa));
}
}
@@ -5615,6 +5619,7 @@ rel_query(mvc *sql, sql_rel *rel, symbol
list *exps = rel_projections(sql, outer->l, NULL, 1, 1
);
list_merge(outer->exps, exps, (fdup)NULL);
+ outer->exps = list_distinct(outer->exps,
(fcmp)exp_equal, (fdup)NULL);
}
rel = rel_crossproduct(sql->sa, outer, rel, op_apply);
rel->exps = applyexps;
diff --git a/sql/server/sql_privileges.c b/sql/server/sql_privileges.c
--- a/sql/server/sql_privileges.c
+++ b/sql/server/sql_privileges.c
@@ -82,7 +82,7 @@ sql_grant_table_privs( mvc *sql, char *g
if (!cname) {
if (!allowed)
- allowed = sql_grantable(sql, grantor, t->base.id, all,
0);
+ allowed = sql_grantable(sql, grantor, t->base.id,
privs, 0);
if (!allowed)
return sql_message("0L000!GRANT: grantor '%s' is not
allowed to grant privileges for table '%s'",
stack_get_string(sql,"current_user"), tname);
@@ -102,12 +102,23 @@ sql_grant_table_privs( mvc *sql, char *g
grantee_id = sql_find_auth(sql, grantee);
if (grantee_id <= 0)
return sql_message("42M32!GRANT: user/role '%s' unknown",
grantee);
- if (privs == all)
+ /* first check if privilege isn't already given */
+ if ((privs == all &&
+ (sql_privilege(sql, grantee_id, t->base.id, PRIV_SELECT, 0) ||
+ sql_privilege(sql, grantee_id, t->base.id, PRIV_UPDATE, 0) ||
+ sql_privilege(sql, grantee_id, t->base.id, PRIV_INSERT, 0) ||
+ sql_privilege(sql, grantee_id, t->base.id, PRIV_DELETE, 0))) ||
+ (privs != all && !c && sql_privilege(sql, grantee_id, t->base.id,
privs, 0)) ||
+ (privs != all && c && sql_privilege(sql, grantee_id, c->base.id,
privs, 0))) {
+ return sql_message("42M32!GRANT: user/role '%s' already has
this privilege", grantee);
+ }
+ if (privs == all) {
sql_insert_all_privs(sql, grantee_id, t->base.id, grantor,
grant);
- else if (!c)
+ } else if (!c) {
sql_insert_priv(sql, grantee_id, t->base.id, privs, grantor,
grant);
- else
+ } else {
sql_insert_priv(sql, grantee_id, c->base.id, privs, grantor,
grant);
+ }
tr->schema_updates++;
return NULL;
}
@@ -154,7 +165,7 @@ sql_revoke_table_privs( mvc *sql, char *
allowed = schema_privs(grantor, t->s);
if (!allowed)
- allowed = sql_grantable(sql, grantor, t->base.id, all, 0);
+ allowed = sql_grantable(sql, grantor, t->base.id, privs, 0);
if (!allowed)
return sql_message("0L000!REVOKE: grantor '%s' is not allowed
to revoke privileges for table '%s'", stack_get_string(sql,"current_user"),
tname);
@@ -497,20 +508,26 @@ mvc_set_role(mvc *m, char *role)
rid = table_funcs.column_find_row(m->session->tr, auths_name, role,
NULL);
if (rid != oid_nil) {
- sql_table *roles = find_sql_table(sys, "user_role");
- sql_column *role_id = find_sql_column(roles, "role_id");
- sql_column *login_id = find_sql_column(roles, "login_id");
-
sql_column *auths_id = find_sql_column(auths, "id");
void *p = table_funcs.column_find_value(m->session->tr,
auths_id, rid);
int id = *(int *)p;
_DELETE(p);
- rid = table_funcs.column_find_row(m->session->tr, login_id,
&m->user_id, role_id, &id, NULL);
-
- if (rid != oid_nil) {
+
+ if (m->user_id == id) {
m->role_id = id;
res = 1;
+ } else {
+ sql_table *roles = find_sql_table(sys, "user_role");
+ sql_column *role_id = find_sql_column(roles, "role_id");
+ sql_column *login_id = find_sql_column(roles,
"login_id");
+
+ rid = table_funcs.column_find_row(m->session->tr,
login_id, &m->user_id, role_id, &id, NULL);
+
+ if (rid != oid_nil) {
+ m->role_id = id;
+ res = 1;
+ }
}
}
return res;
diff --git
a/sql/test/BugDay_2005-11-09_2.9.3/Tests/grant_public.SF-1114580.stable.err
b/sql/test/BugDay_2005-11-09_2.9.3/Tests/grant_public.SF-1114580.stable.err
--- a/sql/test/BugDay_2005-11-09_2.9.3/Tests/grant_public.SF-1114580.stable.err
+++ b/sql/test/BugDay_2005-11-09_2.9.3/Tests/grant_public.SF-1114580.stable.err
@@ -10,10 +10,25 @@ stderr of test 'grant_public.SF-1114580`
# 19:58:17 > Mtimeout -timeout 60 MapiClient -lsql -u monetdb -P monetdb
--host=localhost --port=46797 < grant_public.SF-1114580.sql
# 19:58:17 >
-MAPI = (monetdb) /var/tmp/mtest-23209/.s.monetdb.33225
+MAPI = (monetdb) /var/tmp/mtest-15225/.s.monetdb.34050
QUERY = GRANT UPDATE(dumdum) ON test1114580 TO PUBLIC;
ERROR = !GRANT: table test1114580 has no column dumdum
-MAPI = (monetdb) /var/tmp/mtest-23209/.s.monetdb.33225
+MAPI = (monetdb) /var/tmp/mtest-15225/.s.monetdb.34050
+QUERY = GRANT INSERT ON test1114580 TO PUBLIC;
+ERROR = !GRANT: user/role 'public' already has this privilege
+MAPI = (monetdb) /var/tmp/mtest-15225/.s.monetdb.34050
+QUERY = GRANT INSERT ON test1114580 TO PUBLIC;
+ERROR = !current transaction is aborted (please ROLLBACK)
+MAPI = (monetdb) /var/tmp/mtest-15225/.s.monetdb.34050
+QUERY = GRANT INSERT ON test1114580 TO PUBLIC;
+ERROR = !current transaction is aborted (please ROLLBACK)
+MAPI = (monetdb) /var/tmp/mtest-15225/.s.monetdb.34050
+QUERY = REVOKE SELECT ON test1114580 FROM PUBLIC;
+ERROR = !current transaction is aborted (please ROLLBACK)
+MAPI = (monetdb) /var/tmp/mtest-15225/.s.monetdb.34050
+QUERY = REVOKE SELECT ON test1114580 FROM PUBLIC;
+ERROR = !current transaction is aborted (please ROLLBACK)
+MAPI = (monetdb) /var/tmp/mtest-15225/.s.monetdb.34050
QUERY = REVOKE SELECT ON test1114580 TO PUBLIC;
ERROR = !syntax error, unexpected TO, expecting FROM in: "revoke select on
test1114580 to"
diff --git
a/sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.stable.out.int128
b/sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.stable.out.int128
--- a/sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.stable.out.int128
+++ b/sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.stable.out.int128
@@ -35,8 +35,8 @@ Ready.
[ 6, 4 ]
[ 7, 5 ]
#select ( select count( * )+1 from countt1 as tt3 where tt3.b < tt2.b ) from
countt1 as tt2;
-% .L3 # table_name
-% L3 # name
+% .L2 # table_name
+% L2 # name
% hugeint # type
% 1 # length
[ 2 ]
diff --git
a/sql/test/BugTracker-2012/Tests/scalar_subquery_with_alias.Bug-3093.stable.out
b/sql/test/BugTracker-2012/Tests/scalar_subquery_with_alias.Bug-3093.stable.out
---
a/sql/test/BugTracker-2012/Tests/scalar_subquery_with_alias.Bug-3093.stable.out
+++
b/sql/test/BugTracker-2012/Tests/scalar_subquery_with_alias.Bug-3093.stable.out
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list