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