Changeset: 3207d512f1f0 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3207d512f1f0 Modified Files: sql/backends/monet5/rel_bin.c sql/server/rel_select.c Branch: Mar2018 Log Message:
partial revert of revert 40a9865349b9 this part was correct diffs (97 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 @@ -1956,11 +1956,12 @@ rel2bin_semijoin(backend *be, sql_rel *r * second selects/filters */ if (rel->exps && rel->op == op_anti && need_no_nil(rel)) { - list *l; - stmt *sel = NULL; + sql_subtype *lng = sql_bind_localtype("lng"); + stmt *nilcnt = NULL; for( en = rel->exps->h; en; en = en->next ) { sql_exp *e = en->data, *r, *l; + stmt *s; if (e->type != e_cmp || e->flag != cmp_equal) break; @@ -1968,28 +1969,33 @@ rel2bin_semijoin(backend *be, sql_rel *r r = e->r; /* for each equality join add a rel_select(r is NULL) */ - stmt *s = exp_bin(be, r, right, NULL, NULL, NULL, NULL, NULL); + s = exp_bin(be, r, right, NULL, NULL, NULL, NULL, NULL); if (!s) s = exp_bin(be, l, right, NULL, NULL, NULL, NULL, NULL); if (s && !exp_is_atom(r)) { - sql_subtype *lng = sql_bind_localtype("lng"); sql_subaggr *cnt = sql_bind_aggr(sql->sa, sql->session->schema, "count", NULL); - sql_subtype *bt = sql_bind_localtype("bit"); - sql_subfunc *ne = sql_bind_func_result(sql->sa, sql->session->schema, "<>", lng, lng, bt); - - stmt *l; + sql_subfunc *add = sql_bind_func_result(sql->sa, sql->session->schema, "sql_add", lng, lng, lng); + s = stmt_selectnil(be, s); - s = stmt_binop(be, stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1), stmt_atom_lng(be, 0), ne); - - l = bin_first_column(be, left); - /* keep if no nulls are in the right side */ - l = stmt_const(be, l, stmt_bool(be,0)); - sel = stmt_uselect(be, l, s, cmp_equal, sel, 0); + s = stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1); + if (nilcnt) { + nilcnt = stmt_binop(be, nilcnt, s, add); + } else { + nilcnt = s; + } } - } - l = sa_list(sql->sa); - if (left && sel) { + if (nilcnt) { + sql_subtype *bt = sql_bind_localtype("bit"); + sql_subfunc *ne = sql_bind_func_result(sql->sa, sql->session->schema, "<>", lng, lng, bt); + stmt *ls = bin_first_column(be, left), *s, *sel; + list *l; + + s = stmt_binop(be, nilcnt, stmt_atom_lng(be, 0), ne); + /* keep if no nulls are in the right side */ + ls = stmt_const(be, ls, stmt_bool(be,0)); + sel = stmt_uselect(be, ls, s, cmp_equal, NULL, 0); + l = sa_list(sql->sa); for( n = left->op4.lval->h; n; n = n->next ) { stmt *col = n->data; 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 @@ -2539,6 +2539,26 @@ rel_logical_exp(mvc *sql, sql_rel *rel, ek.card = card_set; select = rel_select(sql->sa, rel_dup(rel), NULL); /* dup to make sure we get a new select op */ rel_destroy(rel); + /* first remove the NULLs */ + if (!l_is_value && sc->token == SQL_NOT_IN && + l->card != CARD_ATOM && has_nil(l)) { + sql_exp *ol; + + if (l->type != e_column) { + pexps = rel_projections(sql, rel, NULL, 1, 1); + rel = rel_project(sql->sa, rel, rel_projections(sql, rel, NULL, 1, 1)); + select->l = rel; + l = exp_label(sql->sa, l, ++sql->label); + append(rel->exps, l); + ol = l; + l = exp_column(sql->sa, exp_relname(ol), exp_name(ol), exp_subtype(ol), ol->card, has_nil(ol), is_intern(ol)); + } + e = rel_unop_(sql, l, NULL, "isnull", card_value); + e = exp_compare(sql->sa, e, exp_atom_bool(sql->sa, 0), cmp_equal); + rel_select_add_exp(sql->sa, select, e); + if (pexps) + l = exp_column(sql->sa, exp_relname(ol), exp_name(ol), exp_subtype(ol), ol->card, has_nil(ol), is_intern(ol)); + } rel = left = select; append(ll, l); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list