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]