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 <[email protected]>
+- [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 <[email protected]>
- 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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list