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

Reply via email to