Changeset: f09425a42821 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f09425a42821
Modified Files:
        sql/server/rel_optimize_sel.c
Branch: default
Log Message:

Make outer2inner-join opt to apply to all cases #7559


diffs (119 lines):

diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -1303,35 +1303,31 @@ is_non_trivial_select_applied_to_outer_j
 
 extern list *list_append_before(list *l, node *n, void *data);
 
-static void replace_column_references_with_nulls_2(mvc *sql, list* crefs, 
sql_exp* e);
+static void
+replace_column_references_with_nulls_2(mvc *sql, sql_rel *inner_join_side, 
sql_exp* e);
 
 static void
-replace_column_references_with_nulls_1(mvc *sql, list* crefs, list* exps) {
+replace_column_references_with_nulls_1(mvc *sql, sql_rel *inner_join_side, 
list* exps) {
        if (list_empty(exps))
                return;
        for(node* n = exps->h; n; n=n->next) {
                sql_exp* e = n->data;
-               replace_column_references_with_nulls_2(sql, crefs, e);
+               replace_column_references_with_nulls_2(sql, inner_join_side, e);
        }
 }
 
 static void
-replace_column_references_with_nulls_2(mvc *sql, list* crefs, sql_exp* e) {
+replace_column_references_with_nulls_2(mvc *sql, sql_rel *inner_join_side, 
sql_exp* e) {
        if (e == NULL) {
                return;
        }
 
        switch (e->type) {
        case e_column:
-               {
-                       sql_exp *c = NULL;
-                       if (e->nid)
-                               c = exps_bind_nid(crefs, e->nid);
-                       if (c) {
-                               e->type = e_atom;
-                               e->l = atom_general(sql->sa, &e->tpe, NULL, 0);
-                               e->r = e->f = NULL;
-                       }
+               if (rel_find_exp_and_corresponding_rel(inner_join_side, e, 
true, NULL, NULL)) {
+                       e->type = e_atom;
+                       e->l = atom_general(sql->sa, &e->tpe, NULL, 0);
+                       e->r = e->f = NULL;
                }
                break;
        case e_cmp:
@@ -1347,9 +1343,9 @@ replace_column_references_with_nulls_2(m
                        sql_exp* r = e->r;
                        sql_exp* f = e->f;
 
-                       replace_column_references_with_nulls_2(sql, crefs, l);
-                       replace_column_references_with_nulls_2(sql, crefs, r);
-                       replace_column_references_with_nulls_2(sql, crefs, f);
+                       replace_column_references_with_nulls_2(sql, 
inner_join_side, l);
+                       replace_column_references_with_nulls_2(sql, 
inner_join_side, r);
+                       replace_column_references_with_nulls_2(sql, 
inner_join_side, f);
                        break;
                }
                case cmp_filter:
@@ -1357,8 +1353,8 @@ replace_column_references_with_nulls_2(m
                {
                        list* l = e->l;
                        list* r = e->r;
-                       replace_column_references_with_nulls_1(sql, crefs, l);
-                       replace_column_references_with_nulls_1(sql, crefs, r);
+                       replace_column_references_with_nulls_1(sql, 
inner_join_side, l);
+                       replace_column_references_with_nulls_1(sql, 
inner_join_side, r);
                        break;
                }
                case cmp_in:
@@ -1366,8 +1362,8 @@ replace_column_references_with_nulls_2(m
                {
                        sql_exp* l = e->l;
                        list* r = e->r;
-                       replace_column_references_with_nulls_2(sql, crefs, l);
-                       replace_column_references_with_nulls_1(sql, crefs, r);
+                       replace_column_references_with_nulls_2(sql, 
inner_join_side, l);
+                       replace_column_references_with_nulls_1(sql, 
inner_join_side, r);
                        break;
                }
                default:
@@ -1377,13 +1373,13 @@ replace_column_references_with_nulls_2(m
        case e_func:
        {
                list* l = e->l;
-               replace_column_references_with_nulls_1(sql, crefs, l);
+               replace_column_references_with_nulls_1(sql, inner_join_side, l);
                break;
        }
        case e_convert:
        {
                sql_exp* l = e->l;
-               replace_column_references_with_nulls_2(sql, crefs, l);
+               replace_column_references_with_nulls_2(sql, inner_join_side, l);
                break;
        }
        default:
@@ -1397,17 +1393,12 @@ out2inner(visitor *v, sql_rel* sel, sql_
        /* handle inner_join relations with a simple select */
        if (is_select(inner_join_side->op) && inner_join_side->l)
                inner_join_side = inner_join_side->l;
-       if (!is_base(inner_join_side->op) && 
!is_simple_project(inner_join_side->op)) {
-               // Nothing to do here.
-               return sel;
-       }
-
-       list* inner_join_column_references = inner_join_side->exps;
+
        list* select_predicates = exps_copy(v->sql, sel->exps);
 
        for(node* n = select_predicates->h; n; n=n->next) {
                sql_exp* e = n->data;
-               replace_column_references_with_nulls_2(v->sql, 
inner_join_column_references, e);
+               replace_column_references_with_nulls_2(v->sql, inner_join_side, 
e);
 
                if (exp_is_false(e)) {
                        join->op = new_type;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to