Changeset: 7c5f15a4b906 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7c5f15a4b906
Modified Files:
        gdk/gdk_bbp.c
        gdk/gdk_private.h
        sql/common/sql_types.c
        sql/server/rel_optimizer.c
Branch: default
Log Message:

Merge with Jul2021 branch.


diffs (truncated from 539 to 300 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1659,8 +1659,8 @@ heap_entry(FILE *fp, BAT *b, BUN size)
                       free,
                       b->theap->size,
                       (int) b->theap->newstorage,
-                      minprop ? minprop->val.oval : oid_nil,
-                      maxprop ? maxprop->val.oval : oid_nil);
+                      minprop && minprop->val.oval < b->hseqbase + size ? 
minprop->val.oval : oid_nil,
+                      maxprop && maxprop->val.oval < b->hseqbase + size ? 
maxprop->val.oval : oid_nil);
 }
 
 static inline int
@@ -3581,6 +3581,9 @@ BBPsync(int cnt, bat *restrict subcommit
                        bat i = subcommit ? subcommit[idx] : idx;
                        /* BBP_desc(i) may be NULL */
                        BATiter bi = bat_iterator(BBP_desc(i));
+                       BUN size = sizes ? sizes[idx] : BUN_NONE;
+                       if (size > bi.count)
+                               size = bi.count;
 
                        if (BBP_status(i) & BBPPERSISTENT) {
                                BAT *b = dirty_bat(&i, subcommit != NULL);
@@ -3589,10 +3592,10 @@ BBPsync(int cnt, bat *restrict subcommit
                                        break;
                                }
                                if (b)
-                                       ret = BATsave_locked(b, &bi);
+                                       ret = BATsave_locked(b, &bi, size);
                        }
                        if (ret == GDK_SUCCEED) {
-                               n = BBPdir_step(i, sizes ? sizes[idx] : 
BUN_NONE, n, buf, sizeof(buf), &obbpf, nbbpf);
+                               n = BBPdir_step(i, size, n, buf, sizeof(buf), 
&obbpf, nbbpf);
                        }
                        bat_iterator_end(&bi);
                        if (n == -2)
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -81,7 +81,7 @@ void BATrmprop(BAT *b, enum prop_t idx)
        __attribute__((__visibility__("hidden")));
 void BATrmprop_nolock(BAT *b, enum prop_t idx)
        __attribute__((__visibility__("hidden")));
-gdk_return BATsave_locked(BAT *bd, BATiter *bi)
+gdk_return BATsave_locked(BAT *bd, BATiter *bi, BUN size)
        __attribute__((__visibility__("hidden")));
 void BATsetdims(BAT *b)
        __attribute__((__visibility__("hidden")));
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -779,7 +779,7 @@ gettailnamebi(const BATiter *bi)
 }
 
 gdk_return
-BATsave_locked(BAT *b, BATiter *bi)
+BATsave_locked(BAT *b, BATiter *bi, BUN size)
 {
        gdk_return err = GDK_SUCCEED;
        const char *nme;
@@ -859,7 +859,6 @@ BATsave_locked(BAT *b, BATiter *bi)
 
        if (err == GDK_SUCCEED) {
                MT_lock_set(&b->theaplock);
-               b->batCopiedtodisk = true;
                if (b->theap != bi->h) {
                        assert(b->theap->dirty);
                        b->theap->wasempty = bi->h->wasempty;
@@ -868,8 +867,19 @@ BATsave_locked(BAT *b, BATiter *bi)
                        assert(b->tvheap->dirty);
                        b->tvheap->wasempty = bi->vh->wasempty;
                }
-               b->batDirtyflushed = DELTAdirty(b);
-               b->batDirtydesc = false;
+               if (size != b->batCount || b->batInserted < b->batCount) {
+                       /* if the sizes don't match, the BAT must be dirty */
+                       b->batCopiedtodisk = false;
+                       b->batDirtyflushed = true;
+                       b->batDirtydesc = true;
+                       b->theap->dirty = true;
+                       if (b->tvheap)
+                               b->tvheap->dirty = true;
+               } else {
+                       b->batCopiedtodisk = true;
+                       b->batDirtyflushed = DELTAdirty(b);
+                       b->batDirtydesc = false;
+               }
                MT_lock_unset(&b->theaplock);
                if (MT_rwlock_rdtry(&b->thashlock)) {
                        /* if we can't get the lock, don't bother saving
@@ -893,7 +903,7 @@ BATsave(BAT *b)
 
        MT_rwlock_rdlock(&b->thashlock);
        BATiter bi = bat_iterator(b);
-       rc = BATsave_locked(b, &bi);
+       rc = BATsave_locked(b, &bi, bi.count);
        bat_iterator_end(&bi);
        MT_rwlock_rdunlock(&b->thashlock);
        return rc;
diff --git a/monetdb5/modules/mal/tablet.c b/monetdb5/modules/mal/tablet.c
--- a/monetdb5/modules/mal/tablet.c
+++ b/monetdb5/modules/mal/tablet.c
@@ -643,7 +643,7 @@ tablet_error(READERtask *task, lng row, 
 {
        MT_lock_set(&errorlock);
        if (task->cntxt->error_row != NULL) {
-               if (BUNappend(task->cntxt->error_row, &(lng){(lng)task->cnt + 
row + 1}, false) != GDK_SUCCEED ||
+               if (BUNappend(task->cntxt->error_row, &lineno, false) != 
GDK_SUCCEED ||
                        BUNappend(task->cntxt->error_fld, &col, false) != 
GDK_SUCCEED ||
                        BUNappend(task->cntxt->error_msg, msg, false) != 
GDK_SUCCEED ||
                        BUNappend(task->cntxt->error_input, fcn, false) != 
GDK_SUCCEED)
diff --git a/sql/ChangeLog.Jul2021 b/sql/ChangeLog.Jul2021
--- a/sql/ChangeLog.Jul2021
+++ b/sql/ChangeLog.Jul2021
@@ -1,7 +1,19 @@
 # ChangeLog file for sql
 # This file is updated with Maddlog
 
+* Tue Aug 17 2021 Ying Zhang <y.zh...@cwi.nl>
+- [This feature was already released in Jul2021 (11.41.5), but the ChangeLog 
was missing]
+  Grant indirect privileges.  With "GRANT SELECT ON <my_view> TO
+  <another_user>"  and "GRANT EXECUTE ON FUNCTION <my_func> TO
+  <another_user>", one can grant access to "my_view" and "my_func"
+  to another user who does not have access to the underlying database 
+  objects (e.g. tables, views) used in "my_view" and "my_func".  The 
+  grantee will only be able to access data revealed by "my_view" or 
+  conduct operations provided by "my_func".
+
 * Mon Aug 16 2021 Sjoerd Mullender <sjo...@acm.org>
 - Improved error reporting in COPY INTO by giving the line number
-  (starting with one) for the row in which an error was found.
+  (starting with one) for the row in which an error was found.  In
+  particular, the sys.rejects() table now lists the line number of the
+  CSV file on which the record started in which an error was found.
 
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -150,9 +150,9 @@ int sql_type_convert (int from, int to)
        return convert_matrix[from][to];
 }
 
-bool is_commutative(const char *fnm)
+bool is_commutative(const char *sname, const char *fnm)
 {
-       return strcmp("sql_add", fnm) == 0 || strcmp("sql_mul", fnm) == 0 || 
strcmp("scale_up", fnm) == 0;
+       return (!sname || strcmp("sys", sname) == 0) && (strcmp("sql_add", fnm) 
== 0 || strcmp("sql_mul", fnm) == 0 || strcmp("scale_up", fnm) == 0);
 }
 
 void
diff --git a/sql/common/sql_types.h b/sql/common/sql_types.h
--- a/sql/common/sql_types.h
+++ b/sql/common/sql_types.h
@@ -26,7 +26,7 @@ extern unsigned int digits2bits(unsigned
 extern unsigned int type_digits_to_char_digits(sql_subtype *t);
 
 extern int sql_type_convert(int form, int to); /* return 1, convert possible 
but it's a down cast, 2 convert possible can be done savely */
-extern bool is_commutative(const char *fnm);   /* return true if commutative */
+extern bool is_commutative(const char *sname, const char *fnm);        /* 
return true if commutative */
 
 extern char *sql_bind_alias(const char *alias);
 
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
@@ -1348,7 +1348,8 @@ exp_match_exp( sql_exp *e1, sql_exp *e2)
                        break;
                case e_func: {
                        sql_subfunc *e1f = (sql_subfunc*) e1->f;
-                       int (*comp)(list*, list*) = !e1f->func->s && 
is_commutative(e1f->func->base.name) ? exp_match_list : exps_equal;
+                       const char *sname = e1f->func->s ? 
e1f->func->s->base.name : NULL;
+                       int (*comp)(list*, list*) = is_commutative(sname, 
e1f->func->base.name) ? exp_match_list : exps_equal;
 
                        if (!e1f->func->side_effect &&
                                !subfunc_cmp(e1f, e2->f) && /* equal functions 
*/
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
@@ -88,7 +88,7 @@ name_find_column( sql_rel *rel, const ch
                                }
                        }
                }
-               if (ol_length(t->idxs) && name[0]) {
+               if (name[0] == '%' && ol_length(t->idxs)) {
                        for (node *cn = ol_first_node(t->idxs); cn; cn = 
cn->next) {
                                sql_idx *i = cn->data;
                                if (strcmp(i->base.name, name+1 /* skip % */) 
== 0) {
@@ -1013,9 +1013,8 @@ order_joins(visitor *v, list *rels, list
                }
        }
        if (list_length(exps)) { /* more expressions (add selects) */
-               node *n;
                top = rel_select(v->sql->sa, top, NULL);
-               for(n=exps->h; n; n = n->next) {
+               for(node *n=exps->h; n; n = n->next) {
                        sql_exp *e = n->data;
 
                        /* find the involved relations */
@@ -1030,8 +1029,32 @@ order_joins(visitor *v, list *rels, list
                        */
                        if (exp_is_join_exp(e) == 0) {
                                sql_rel *nr = NULL;
-                               if (e->flag == cmp_equal)
-                                       nr = rel_push_join(v->sql, top->l, 
e->l, e->r, NULL, e, 0);
+                               if (is_theta_exp(e->flag)) {
+                                       nr = rel_push_join(v->sql, top->l, 
e->l, e->r, e->f, e, 0);
+                               } else if (e->flag == cmp_filter || e->flag == 
cmp_or) {
+                                       sql_exp *l = NULL, *r = NULL;
+                                       int skip = 0;
+
+                                       /* Attempt to push down a filter 
expression if possible */
+                                       for (node *m = ((list*)e->l)->h ; m && 
!skip ; m = m->next) {
+                                               sql_exp *nl = m->data;
+
+                                               if (nl->card > CARD_ATOM) {
+                                                       skip |= l != NULL;
+                                                       l = nl;
+                                               }
+                                       }
+                                       for (node *m = ((list*)e->r)->h ; m && 
!skip ; m = m->next) {
+                                               sql_exp *nr = m->data;
+
+                                               if (nr->card > CARD_ATOM) {
+                                                       skip |= r != NULL;
+                                                       r = nr;
+                                               }
+                                       }
+                                       if (l && r && !skip)
+                                               nr = rel_push_join(v->sql, 
top->l, l, r, NULL, e, 0);
+                               }
                                if (!nr)
                                        rel_join_add_exp(v->sql->sa, top->l, e);
                        } else
@@ -2389,18 +2412,20 @@ exp_is_pkey(sql_rel *rel, sql_exp *e)
        return NULL;
 }
 
-static int
-rel_is_join_on_pkey(sql_rel *rel)
+static sql_exp *
+rel_is_join_on_pkey(sql_rel *rel, bool pk_fk)
 {
        if (!rel || !rel->exps)
-               return 0;
+               return NULL;
        for (node *n = rel->exps->h; n; n = n->next) {
                sql_exp *je = n->data;
 
-               if (je->type == e_cmp && je->flag == cmp_equal && 
(exp_is_pkey(rel, je->l) || exp_is_pkey(rel, je->r)))
-                       return 1;
-       }
-       return 0;
+               if (je->type == e_cmp && je->flag == cmp_equal &&
+                       (exp_is_pkey(rel, je->l) || exp_is_pkey(rel, je->r)) &&
+                       (!pk_fk || find_prop(je->p, PROP_JOINIDX)))
+                       return je;
+       }
+       return NULL;
 }
 
 /* if all arguments to a distinct aggregate are unique, remove 'distinct' 
property */
@@ -2593,7 +2618,7 @@ rel_distinct_project2groupby(visitor *v,
        /* rewrite distinct project ( join(p,f) [ p.pk = f.fk ] ) [ p.pk ]
         *      into project( (semi)join(p,f) [ p.pk = f.fk ] ) [ p.pk ] */
        if (rel->op == op_project && rel->l && !rel->r /* no order by */ && 
need_distinct(rel) &&
-           l && (is_select(l->op) || l->op == op_join) && 
rel_is_join_on_pkey(l) /* [ pk == fk ] */) {
+           l && (is_select(l->op) || l->op == op_join) && 
rel_is_join_on_pkey(l, true) /* [ pk == fk ] */) {
                sql_exp *found = NULL, *pk = NULL, *fk = NULL;
                bool all_exps_atoms = true;
                sql_column *pkc = NULL;
@@ -2602,6 +2627,9 @@ rel_distinct_project2groupby(visitor *v,
                        sql_exp *je = (sql_exp *) m->data;
                        sql_exp *le = je->l, *re = je->r;
 
+                       if (!find_prop(je->p, PROP_JOINIDX)) /* must be a pk-fk 
join expression */
+                               continue;
+
                        if ((pkc = exp_is_pkey(l, le))) { /* le is the primary 
key */
                                all_exps_atoms = true;
 
@@ -4355,7 +4383,7 @@ gen_push_groupby_down(mvc *sql, sql_rel 
 
                if ((left && is_base(jl->op)) || (!left && is_base(jr->op))||
                    (left && is_select(jl->op)) || (!left && is_select(jr->op))
-                   || rel_is_join_on_pkey(j))
+                   || rel_is_join_on_pkey(j, false))
                        return rel;
 
                /* only add aggr (based on left/right), and repeat the group by 
column */
@@ -5021,7 +5049,7 @@ rel_push_join_down_union(visitor *v, sql
        if ((is_join(rel->op) && !is_outerjoin(rel->op) && !is_single(rel)) || 
is_semi(rel->op)) {
                sql_rel *l = rel->l, *r = rel->r, *ol = l, *or = r;
                list *exps = rel->exps;
-               sql_exp *je = exps_find_prop(exps, PROP_JOINIDX);
+               sql_exp *je = NULL;
 
                if (!l || !r || need_distinct(l) || need_distinct(r) || 
rel_is_ref(l) || rel_is_ref(r))
                        return rel;
@@ -5032,8 +5060,7 @@ rel_push_join_down_union(visitor *v, sql
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to