Changeset: 805afe049210 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/805afe049210
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/store.c
Branch: iso
Log Message:
Merged with Jul2021
diffs (truncated from 499 to 300 lines):
diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -1267,6 +1267,7 @@ HASHdelete_locked(BAT *b, BUN p, const v
seen = atomcmp(v, BUNtail(bi, hb)) == 0;
BUN hb2 = HASHgetlink(h, hb);
assert(hb2 != h->nil);
+ assert(hb2 < hb);
if (hb2 == p) {
for (hb2 = HASHgetlink(h, hb2);
!seen && hb2 != h->nil;
diff --git a/gdk/gdk_hash.h b/gdk/gdk_hash.h
--- a/gdk/gdk_hash.h
+++ b/gdk/gdk_hash.h
@@ -86,14 +86,17 @@ HASHputlink(Hash *h, BUN i, BUN v)
switch (h->width) {
#ifdef BUN2
case BUN2:
+ assert(v == BUN_NONE || v == BUN2_NONE || v < i);
((BUN2type *) h->Link)[i] = (BUN2type) v;
break;
#endif
default: /* BUN4 */
+ assert(v == BUN_NONE || v == BUN4_NONE || v < i);
((BUN4type *) h->Link)[i] = (BUN4type) v;
break;
#ifdef BUN8
case BUN8:
+ assert(v == BUN_NONE || v == BUN8_NONE || v < i);
((BUN8type *) h->Link)[i] = (BUN8type) v;
break;
#endif
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -566,7 +566,7 @@ BAT *
BATproject2(BAT *restrict l, BAT *restrict r1, BAT *restrict r2)
{
BAT *bn = NULL;
- BAT *or1 = r1, *or2 = r2;
+ BAT *or1 = r1, *or2 = r2, *ol = l;
oid lo, hi;
gdk_return res;
int tpe = ATOMtype(r1->ttype);
@@ -602,11 +602,15 @@ BATproject2(BAT *restrict l, BAT *restri
goto doreturn;
}
}
- if (complex_cand(l) || l->ttype == TYPE_msk) {
+ if (complex_cand(l)) {
/* l is candidate list with exceptions or is a bitmask */
assert(l->ttype == TYPE_msk || !is_oid_nil(l->tseqbase));
lcount = canditer_init(&ci, NULL, l);
lci = &ci;
+ } else if (l->ttype == TYPE_msk) {
+ l = BATunmask(l);
+ if (l == NULL)
+ goto doreturn;
}
if (lcount == 0 ||
(l->ttype == TYPE_void && is_oid_nil(l->tseqbase)) ||
@@ -766,6 +770,8 @@ BATproject2(BAT *restrict l, BAT *restri
ALGOOPTBATPAR(bn),
bn && bn->ttype == TYPE_str && bn->tvheap == r1->tvheap ? "
sharing string heap" : "",
msg, GDKusec() - t0);
+ if (l != ol)
+ BBPreclaim(l);
if (r1 != or1)
BBPreclaim(r1);
if (r2 != or2)
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -1128,9 +1128,7 @@ rel_select_push_exp_down(mvc *sql, sql_r
return rel;
}
-/* ls is the left expression of the select, rs is a simple atom, e is the
- select expression.
- */
+/* ls is the left expression of the select, e is the select expression. */
sql_rel *
rel_push_select(mvc *sql, sql_rel *rel, sql_exp *ls, sql_exp *e, int f)
{
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
@@ -1461,7 +1461,7 @@ rel_convert_types(mvc *sql, sql_rel *ll,
}
static sql_rel *
-push_select_exp(mvc *sql, sql_rel *rel, sql_exp *e, sql_exp *ls, sql_exp *L,
int f) /* 'e' is an expression where the right is a constant(s)! */
+push_select_exp(mvc *sql, sql_rel *rel, sql_exp *e, sql_exp *ls, int f)
{
if (is_outerjoin(rel->op)) {
if ((is_left(rel->op) || is_full(rel->op)) &&
rel_find_exp(rel->l, ls)) {
@@ -1472,15 +1472,15 @@ push_select_exp(mvc *sql, sql_rel *rel,
return rel;
}
if (is_left(rel->op) && rel_find_exp(rel->r, ls)) {
- rel->r = rel_push_select(sql, rel->r, L, e, f);
+ rel->r = rel_push_select(sql, rel->r, ls, e, f);
return rel;
} else if (is_right(rel->op) && rel_find_exp(rel->l, ls)) {
- rel->l = rel_push_select(sql, rel->l, L, e, f);
+ rel->l = rel_push_select(sql, rel->l, ls, e, f);
return rel;
}
}
/* push select into the given relation */
- return rel_push_select(sql, rel, L, e, f);
+ return rel_push_select(sql, rel, ls, e, f);
}
static sql_rel *
@@ -1502,7 +1502,7 @@ static sql_rel *
rel_filter(mvc *sql, sql_rel *rel, list *l, list *r, char *sname, char
*filter_op, int anti, int ff)
{
node *n;
- sql_exp *L = l->h->data, *R = r->h->data, *e = NULL;
+ sql_exp *e = NULL;
sql_subfunc *f = NULL;
list *tl = sa_list(sql->sa);
bool found = false;
@@ -1577,9 +1577,9 @@ rel_filter(mvc *sql, sql_rel *rel, list
if (exps_card(l) == exps_card(r) || rel->processed) /* bin
compare op */
return rel_select(sql->sa, rel, e);
- return push_select_exp(sql, rel, e, l->h->data, L, ff);
+ return push_select_exp(sql, rel, e, l->h->data, ff);
} else { /* join */
- return push_join_exp(sql, rel, e, L, R, NULL, ff);
+ return push_join_exp(sql, rel, e, l->h->data, r->h->data, NULL,
ff);
}
return rel;
}
@@ -1600,19 +1600,26 @@ rel_filter_exp_(mvc *sql, sql_rel *rel,
}
static sql_rel *
-rel_select_push_exp_down(mvc *sql, sql_rel *rel, sql_exp *e, sql_exp *ls,
sql_exp *L, sql_exp *rs, sql_exp *R, sql_exp *rs2, int f)
+rel_select_push_exp_down(mvc *sql, sql_rel *rel, sql_exp *e, sql_exp *ls,
sql_exp *rs, sql_exp *rs2, int f)
{
if (!is_join(rel->op) && !is_select(rel->op))
return rel_select(sql->sa, rel, e);
if ((rs->card <= CARD_ATOM || (rs2 && ls->card <= CARD_ATOM)) &&
(exp_is_atom(rs) || (rs2 && exp_is_atom(ls)) ||
exp_has_freevar(sql, rs) || exp_has_freevar(sql, ls)) &&
(!rs2 || (rs2->card <= CARD_ATOM && (exp_is_atom(rs2) ||
exp_has_freevar(sql, rs2))))) {
- if (ls->card == rs->card || (rs2 && (ls->card == rs2->card ||
rs->card == rs2->card)) || rel->processed) /* bin compare op */
+ int ls_is_col = ls->card > CARD_ATOM ? 1 : 0;
+ int rs_is_col = rs->card > CARD_ATOM ? 1 : 0;
+ int rs2_is_col = rs2 && rs2->card > CARD_ATOM ? 1 : 0;
+ int ncols = ls_is_col + rs_is_col + rs2_is_col;
+
+ /* later on we could improve this to pushdown more between
cases */
+ if (rel->processed || ncols > 1 || exp_has_freevar(sql, rs) ||
exp_has_freevar(sql, ls) || (rs2 && exp_has_freevar(sql, rs2))) /* bin compare
op */
return rel_select(sql->sa, rel, e);
- return push_select_exp(sql, rel, e, ls, L, f);
+ sql_exp *col_exp = ls_is_col || !ncols ? ls : rs_is_col ? rs :
rs2;
+ return push_select_exp(sql, rel, e, col_exp, f);
} else { /* join */
- return push_join_exp(sql, rel, e, L, R, rs2, f);
+ return push_join_exp(sql, rel, e, ls, rs, rs2, f);
}
return rel;
}
@@ -1676,7 +1683,7 @@ rel_compare_exp_(sql_query *query, sql_r
else
return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000)
"SELECT: cannot use non GROUP BY column in query results without an aggregate
function");
}
- return rel_select_push_exp_down(sql, rel, e, ls, ls, rs, rs, rs2, f);
+ return rel_select_push_exp_down(sql, rel, e, ls, rs, rs2, f);
}
static sql_rel *
@@ -2081,7 +2088,7 @@ rel_in_exp(sql_query *query, sql_rel *re
if ((exp_card(ls) == rcard) || rel->processed) /* bin
compare op */
return rel_select(sql->sa, rel, e);
- return push_select_exp(sql, rel, e, ls, ls, f);
+ return push_select_exp(sql, rel, e, ls, f);
} else { /* join */
sql_exp *rs = rlist ? ((list*)e->r)->h->data : e->r;
return push_join_exp(sql, rel, e, ls, rs, NULL, f);
@@ -2683,7 +2690,7 @@ rel_logical_exp(sql_query *query, sql_re
set_anti(le);
set_has_no_nil(le);
set_semantics(le);
- return rel_select_push_exp_down(sql, rel, le, le->l, le->l,
le->r, le->r, NULL, f);
+ return rel_select_push_exp_down(sql, rel, le, le->l, le->r,
NULL, f);
}
case SQL_NOT: {
if (not_symbol_can_be_propagated(sql, sc->data.sym)) {
@@ -2697,7 +2704,7 @@ rel_logical_exp(sql_query *query, sql_re
if (!le || !(le = exp_check_type(sql, &bt, rel, le,
type_equal)))
return NULL;
le = exp_compare(sql->sa, le, exp_atom_bool(sql->sa, 0),
cmp_equal);
- return rel_select_push_exp_down(sql, rel, le, le->l, le->l,
le->r, le->r, NULL, f);
+ return rel_select_push_exp_down(sql, rel, le, le->l, le->r,
NULL, f);
}
case SQL_ATOM: {
/* TRUE or FALSE */
@@ -2714,7 +2721,7 @@ rel_logical_exp(sql_query *query, sql_re
if (!e || or != rel)
return NULL;
e = exp_compare(sql->sa, e, exp_atom_bool(sql->sa, 1),
cmp_equal);
- return rel_select_push_exp_down(sql, rel, e, e, e, e, e, NULL,
f);
+ return rel_select_push_exp_down(sql, rel, e, e->l, e->r, NULL,
f);
}
case SQL_IDENT:
case SQL_COLUMN: {
@@ -2730,7 +2737,7 @@ rel_logical_exp(sql_query *query, sql_re
if (!e || or != rel)
return NULL;
e = exp_compare(sql->sa, e, exp_atom_bool(sql->sa, 1),
cmp_equal);
- return rel_select_push_exp_down(sql, rel, e, e, e, e, e, NULL,
f);
+ return rel_select_push_exp_down(sql, rel, e, e->l, e->r, NULL,
f);
}
case SQL_UNION:
case SQL_EXCEPT:
@@ -2760,7 +2767,7 @@ rel_logical_exp(sql_query *query, sql_re
if (!le)
return NULL;
le = exp_compare(sql->sa, le, exp_atom_bool(sql->sa,
1), cmp_equal);
- return rel_select_push_exp_down(sql, rel, le, le->l,
le->l, le->r, le->r, NULL, f);
+ return rel_select_push_exp_down(sql, rel, le, le->l,
le->r, NULL, f);
} else {
sq = rel_crossproduct(sql->sa, rel, sq, (f==sql_sel ||
sq->single)?op_left:op_join);
}
@@ -2778,7 +2785,7 @@ rel_logical_exp(sql_query *query, sql_re
if (!(le = exp_check_type(sql, &bt, rel, le, type_equal)))
return NULL;
le = exp_compare(sql->sa, le, exp_atom_bool(sql->sa, 1),
cmp_equal);
- return rel_select_push_exp_down(sql, rel, le, le->l, le->l,
le->r, le->r, NULL, f);
+ return rel_select_push_exp_down(sql, rel, le, le->l, le->r,
NULL, f);
}
}
/* never reached, as all switch cases have a `return` */
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -939,6 +939,10 @@ cs_update_bat( sql_trans *tr, column_sto
otids = sorted;
oupdates = BATproject(order, oupdates);
bat_destroy(order);
+ if (!oupdates) {
+ bat_destroy(otids);
+ return LOG_ERR;
+ }
}
assert(otids->tsorted);
BAT *ui = NULL, *uv = NULL;
@@ -982,7 +986,7 @@ cs_update_bat( sql_trans *tr, column_sto
if (void_inplace(b,
rid, upd, true) != GDK_SUCCEED)
res = LOG_ERR;
- int word = rid/32;
+ oid word = rid/32;
int pos = rid%32;
msk[word] |= 1U<<pos;
cnt++;
@@ -1022,7 +1026,7 @@ cs_update_bat( sql_trans *tr, column_sto
if (void_inplace(b, rid[i],
upd, true) != GDK_SUCCEED)
res = LOG_ERR;
- int word = rid[i]/32;
+ oid word = rid[i]/32;
int pos = rid[i]%32;
msk[word] |= 1U<<pos;
cnt++;
@@ -1041,11 +1045,15 @@ cs_update_bat( sql_trans *tr, column_sto
ui = temp_descriptor(otids->batCacheid);
uv =
temp_descriptor(oupdates->batCacheid);
}
- temp_destroy(cs->uibid);
- temp_destroy(cs->uvbid);
- cs->uibid = temp_create(ui);
- cs->uvbid = temp_create(uv);
- cs->ucnt = BATcount(ui);
+ if (!ui || !uv) {
+ res = LOG_ERR;
+ } else {
+ temp_destroy(cs->uibid);
+ temp_destroy(cs->uvbid);
+ cs->uibid = temp_create(ui);
+ cs->uvbid = temp_create(uv);
+ cs->ucnt = BATcount(ui);
+ }
} else {
BAT *nui = NULL, *nuv = NULL;
@@ -1057,77 +1065,82 @@ cs_update_bat( sql_trans *tr, column_sto
ptr upd = NULL;
nui = bat_new(TYPE_oid, cs->ucnt + ucnt
- cnt, PERSISTENT);
nuv = bat_new(uv->ttype, cs->ucnt +
ucnt - cnt, PERSISTENT);
- BATiter ovi = bat_iterator(uv);
-
- /* handle dense (void) cases together
as we need too merge updates (which is slower anyway) */
- BUN uip = 0, uie = BATcount(ui);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list