Changeset: 1097aa8d82c7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1097aa8d82c7 Modified Files: sql/backends/monet5/rel_bin.c sql/server/rel_select.c Branch: Jun2020 Log Message:
also handle in/notin as direct semijoin operators (not needing a crossproduct first) for both push_compare_exp_down and exp_filter handle a compare expression on a basetable using a simple rel_select. diffs (38 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 @@ -2181,11 +2181,11 @@ split_join_exps(sql_rel *rel, list *join int left_reference = 0, right_reference = 0; /* we can handle thetajoins, rangejoins and filter joins (like) */ - /* ToDo how about in/notin, mark_in/notin, mark_exists/not_exists and atom expressions? */ + /* ToDo how about mark_exists/not_exists and atom expressions? */ if (e->type == e_cmp) { int flag = e->flag & ~CMP_BETWEEN; /* check if its a select or join expression, ie use only expressions of one relation left and of the other right (than join) */ - if (flag < cmp_filter) { /* theta and range joins */ + if (flag < cmp_filter || flag == mark_in || flag == mark_notin) { /* theta and range joins */ /* join or select ? */ sql_exp *l = e->l, *r = e->r, *f = e->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 @@ -1649,6 +1649,8 @@ rel_filter(mvc *sql, sql_rel *rel, list else return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query results without an aggregate function"); } + if (!is_join(rel->op) && !is_select(rel->op)) + return rel_select(sql->sa, rel, e); if (exps_card(r) <= CARD_ATOM && (exps_are_atoms(r) || exps_have_freevar(sql, r) || exps_have_freevar(sql, l))) { if (exps_card(l) == exps_card(r) || rel->processed) /* bin compare op */ return rel_select(sql->sa, rel, e); @@ -1701,6 +1703,8 @@ rel_filter_exp_(mvc *sql, sql_rel *rel, static sql_rel * rel_compare_push_exp(mvc *sql, sql_rel *rel, sql_exp *e, sql_exp *ls, sql_exp *L, sql_exp *rs, sql_exp *R, sql_exp *rs2) { + if (!is_join(rel->op) && !is_select(rel->op)) + return rel_select(sql->sa, rel, e); if (rs->card <= CARD_ATOM && (exp_is_atom(rs) || 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) || rel->processed) /* bin compare op */ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list