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

Reply via email to