Changeset: 0e04e56be9d4 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0e04e56be9d4
Modified Files:
sql/backends/monet5/rel_bin.c
sql/server/rel_rel.c
sql/storage/bat/bat_storage.c
sql/storage/store.c
Branch: Dec2016
Log Message:
fixed crash when using ordered indices
diffs (174 lines):
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -622,39 +622,47 @@ exp_bin(mvc *sql, sql_exp *e, stmt *left
sel1 = sel;
sel2 = sel;
for( n = l->h; n; n = n->next ) {
- s = exp_bin(sql, n->data, left, right, grp,
ext, cnt, sel1);
+ stmt *sin = (sel1 && sel1->nrcols)?sel1:NULL;
+
+ s = exp_bin(sql, n->data, left, right, grp,
ext, cnt, sin);
if (!s)
return s;
- if (sel1 && sel1->nrcols == 0 && s->nrcols ==
0) {
+ if (!sin && sel1 && sel1->nrcols == 0 &&
s->nrcols == 0) {
sql_subtype *bt =
sql_bind_localtype("bit");
sql_subfunc *f = sql_bind_func(sql->sa,
sql->session->schema, "and", bt, bt, F_FUNC);
assert(f);
s = stmt_binop(sql->sa, sel1, s, f);
- }
- if (sel1 && sel1->nrcols && s->nrcols == 0) {
+ } else if (sel1 && (sel1->nrcols == 0 ||
s->nrcols == 0)) {
stmt *predicate =
bin_first_column(sql->sa, left);
predicate = stmt_const(sql->sa,
predicate, stmt_bool(sql->sa, 1));
- s = stmt_uselect(sql->sa, predicate, s,
cmp_equal, sel1);
+ if (s->nrcols == 0)
+ s = stmt_uselect(sql->sa,
predicate, s, cmp_equal, sel1);
+ else
+ s = stmt_uselect(sql->sa,
predicate, sel1, cmp_equal, s);
}
sel1 = s;
}
l = e->r;
for( n = l->h; n; n = n->next ) {
- s = exp_bin(sql, n->data, left, right, grp,
ext, cnt, sel2);
+ stmt *sin = (sel2 && sel2->nrcols)?sel2:NULL;
+
+ s = exp_bin(sql, n->data, left, right, grp,
ext, cnt, sin);
if (!s)
return s;
- if (sel2 && sel2->nrcols == 0 && s->nrcols ==
0) {
+ if (!sin && sel2 && sel2->nrcols == 0 &&
s->nrcols == 0) {
sql_subtype *bt =
sql_bind_localtype("bit");
sql_subfunc *f = sql_bind_func(sql->sa,
sql->session->schema, "and", bt, bt, F_FUNC);
assert(f);
s = stmt_binop(sql->sa, sel2, s, f);
- }
- if (sel2 && sel2->nrcols && s->nrcols == 0) {
+ } else if (sel2 && (sel2->nrcols == 0 ||
s->nrcols == 0)) {
stmt *predicate =
bin_first_column(sql->sa, left);
predicate = stmt_const(sql->sa,
predicate, stmt_bool(sql->sa, 1));
- s = stmt_uselect(sql->sa, predicate, s,
cmp_equal, sel2);
+ if (s->nrcols == 0)
+ s = stmt_uselect(sql->sa,
predicate, s, cmp_equal, sel2);
+ else
+ s = stmt_uselect(sql->sa,
predicate, sel2, cmp_equal, s);
}
sel2 = s;
}
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
@@ -1110,9 +1110,13 @@ rel_or(mvc *sql, sql_rel *l, sql_rel *r,
set_processed(l);
set_processed(r);
rel = rel_setop(sql->sa, l, r, op_union);
+ if (!rel)
+ return NULL;
rel->exps = rel_projections(sql, rel, NULL, 1, 1);
set_processed(rel);
rel = rel_distinct(rel);
+ if (!rel)
+ return NULL;
if (exps_card(l->exps) <= CARD_AGGR &&
exps_card(r->exps) <= CARD_AGGR)
{
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
@@ -723,6 +723,8 @@ dup_idx(sql_trans *tr, sql_idx *i, sql_i
{
int ok = LOG_OK;
+ if (!isTable(i->t) || !idx_has_column(i->type))
+ return ok;
if (i->data) {
int type = (oid_index(ni->type))?TYPE_oid:TYPE_lng;
sql_delta *bat = ni->data = ZNEW(sql_delta), *obat = i->data;
@@ -930,6 +932,8 @@ delete_tab(sql_trans *tr, sql_table * t,
sql_idx *i = n->data;
sql_delta *bat;
+ if (!isTable(i->t) || !idx_has_column(i->type))
+ continue;
if (!i->data) {
sql_idx *oi = tr_find_idx(tr->parent, i);
i->data = timestamp_delta(oi->data, tr->stime);
@@ -1011,7 +1015,7 @@ count_idx(sql_trans *tr, sql_idx *i, int
{
sql_delta *b;
- if (!isTable(i->t))
+ if (!isTable(i->t) || !idx_has_column(i->type))
return 0;
if (!i->data) {
sql_idx *oi = tr_find_idx(tr->parent, i);
@@ -1064,7 +1068,8 @@ count_idx_upd(sql_trans *tr, sql_idx *i)
{
sql_delta *b;
- assert (isTable(i->t)) ;
+ if (!isTable(i->t) || !idx_has_column(i->type))
+ return 0;
if (!i->data) {
sql_idx *oi = tr_find_idx(tr->parent, i);
i->data = timestamp_delta(oi->data, tr->stime);
@@ -1093,6 +1098,8 @@ count_upd(sql_trans *tr, sql_table *t)
for( n = t->idxs.set->h; n; n = n->next) {
sql_idx *i = n->data;
+ if (!isTable(i->t) || !idx_has_column(i->type))
+ continue;
if (count_idx_upd(tr, i))
return 1;
}
@@ -1726,10 +1733,14 @@ clear_col(sql_trans *tr, sql_column *c)
static BUN
clear_idx(sql_trans *tr, sql_idx *i)
{
+ if (!isTable(i->t) || !idx_has_column(i->type))
+ return 0;
if (!i->data || !i->base.allocated) {
int type = (oid_index(i->type))?TYPE_oid:TYPE_lng;
sql_idx *oi = tr_find_idx(tr->parent, i);
- sql_delta *bat = i->data = ZNEW(sql_delta), *obat =
timestamp_delta(oi->data, tr->stime);
+ sql_delta *bat = i->data = ZNEW(sql_delta), *obat;
+
+ obat = timestamp_delta(oi->data, tr->stime);
(void)dup_bat(tr, i->t, obat, bat, type, isNew(i), i->base.flag
== TR_NEW);
i->base.allocated = 1;
}
@@ -1779,6 +1790,8 @@ empty_idx(sql_idx *i)
int type = (oid_index(i->type))?TYPE_oid:TYPE_lng;
sql_delta *bat = i->data;
+ if (!isTable(i->t) || !idx_has_column(i->type))
+ return ;
assert(i->data && i->base.allocated && bat->bid == 0);
bat->bid = bat->ibid;
bat->ibid = e_bat(type);
@@ -1947,6 +1960,8 @@ gtr_update_table(sql_trans *tr, sql_tabl
sql_idx *ci = n->data;
/* some indices have no bats */
+ if (!isTable(ci->t) || !idx_has_column(ci->type))
+ continue;
if (!ci->base.wtime || ci->base.wtime <=
ci->base.allocated)
continue;
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -4545,7 +4545,8 @@ sql_trans_clear_table(sql_trans *tr, sql
sql_idx *ci = n->data;
ci->base.wtime = tr->wstime;
- (void)store_funcs.clear_idx(tr, ci);
+ if (isTable(ci->t) && idx_has_column(ci->type))
+ (void)store_funcs.clear_idx(tr, ci);
}
}
return sz;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list