Changeset: 948aeaacc568 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=948aeaacc568
Modified Files:
sql/server/rel_optimizer.c
sql/server/rel_select.c
sql/server/rel_select.h
sql/server/sql_mvc.c
sql/server/sql_mvc.h
Branch: int128
Log Message:
Merge with Jan2014 branch.
diffs (216 lines):
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -3098,9 +3098,9 @@ rel_push_select_down_join(int *changes,
sql_exp *re = e->r;
if (re->card >= CARD_AGGR) {
- rel->l = rel_push_join(sql->sa, r,
e->l, re, NULL, e);
+ rel->l = rel_push_join(sql, r, e->l,
re, NULL, e);
} else {
- rel->l = rel_push_select(sql->sa, r,
e->l, e);
+ rel->l = rel_push_select(sql, r, e->l,
e);
}
/* only pushed down selects are counted */
if (r == rel->l) {
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
@@ -1006,16 +1006,16 @@ static char * rel_get_name( sql_rel *rel
select expression.
*/
sql_rel *
-rel_push_select(sql_allocator *sa, sql_rel *rel, sql_exp *ls, sql_exp *e)
+rel_push_select(mvc *sql, sql_rel *rel, sql_exp *ls, sql_exp *e)
{
- list *l = rel_bind_path(sa, rel, ls);
+ list *l = rel_bind_path(sql->sa, rel, ls);
node *n;
sql_rel *lrel = NULL, *p = NULL;
- if (!l) {
+ if (!l || !sql->pushdown) {
/* expression has no clear parent relation, so filter current
with it */
- return rel_select(sa, rel, e);
+ return rel_select(sql->sa, rel, e);
}
for (n = l->h; n; n = n->next ) {
@@ -1039,9 +1039,9 @@ rel_push_select(sql_allocator *sa, sql_r
if (!lrel)
return NULL;
if (p && p->op == op_select && !rel_is_ref(p)) { /* refine old select */
- rel_select_add_exp(sa, p, e);
+ rel_select_add_exp(sql->sa, p, e);
} else {
- sql_rel *n = rel_select(sa, lrel, e);
+ sql_rel *n = rel_select(sql->sa, lrel, e);
if (p && p != lrel) {
assert(p->op == op_join || p->op == op_left ||
is_semi(p->op));
@@ -1067,19 +1067,22 @@ rel_push_select(sql_allocator *sa, sql_r
join expression.
*/
sql_rel *
-rel_push_join(sql_allocator *sa, sql_rel *rel, sql_exp *ls, sql_exp *rs,
sql_exp *rs2, sql_exp *e)
+rel_push_join(mvc *sql, sql_rel *rel, sql_exp *ls, sql_exp *rs, sql_exp *rs2,
sql_exp *e)
{
- list *l = rel_bind_path(sa, rel, ls);
- list *r = rel_bind_path(sa, rel, rs);
+ list *l = rel_bind_path(sql->sa, rel, ls);
+ list *r = rel_bind_path(sql->sa, rel, rs);
list *r2 = NULL;
node *ln, *rn;
sql_rel *lrel = NULL, *rrel = NULL, *rrel2 = NULL, *p = NULL;
if (rs2)
- r2 = rel_bind_path(sa, rel, rs2);
+ r2 = rel_bind_path(sql->sa, rel, rs2);
if (!l || !r || (rs2 && !r2))
return NULL;
+ if (!sql->pushdown)
+ return rel_push_select(sql, rel, ls, e);
+
p = rel;
if (r2) {
node *rn2;
@@ -1135,11 +1138,11 @@ rel_push_join(sql_allocator *sa, sql_rel
/* filter on columns of this relation */
if ((lrel == rrel && (!r2 || lrel == rrel2) && lrel->op != op_join) ||
rel_is_ref(p)) {
if (lrel->op == op_select && !rel_is_ref(lrel)) {
- rel_select_add_exp(sa, lrel, e);
+ rel_select_add_exp(sql->sa, lrel, e);
} else if (p && p->op == op_select && !rel_is_ref(p)) {
- rel_select_add_exp(sa, p, e);
+ rel_select_add_exp(sql->sa, p, e);
} else {
- sql_rel *n = rel_select(sa, lrel, e);
+ sql_rel *n = rel_select(sql->sa, lrel, e);
if (p && p != lrel) {
if (p->l == lrel)
@@ -1153,7 +1156,7 @@ rel_push_join(sql_allocator *sa, sql_rel
return rel;
}
- rel_join_add_exp( sa, p, e);
+ rel_join_add_exp( sql->sa, p, e);
return rel;
}
@@ -2218,14 +2221,14 @@ rel_filter_exp_(mvc *sql, sql_rel *rel,
return rel;
}
/* push select into the given relation */
- return rel_push_select(sql->sa, rel, L, e);
+ return rel_push_select(sql, rel, L, e);
} else { /* join */
if (is_semi(rel->op) || is_outerjoin(rel->op)) {
rel_join_add_exp(sql->sa, rel, e);
return rel;
}
/* push join into the given relation */
- return rel_push_join(sql->sa, rel, L, R, rs2, e);
+ return rel_push_join(sql, rel, L, R, rs2, e);
}
}
@@ -2284,22 +2287,22 @@ rel_compare_exp_(mvc *sql, sql_rel *rel,
return rel;
}
if (is_left(rel->op) && rel_find_exp(rel->r, ls)) {
- rel->r = rel_push_select(sql->sa, rel->r, L, e);
+ rel->r = rel_push_select(sql, rel->r, L, e);
return rel;
} else if (is_right(rel->op) && rel_find_exp(rel->l,
ls)) {
- rel->l = rel_push_select(sql->sa, rel->l, L, e);
+ rel->l = rel_push_select(sql, rel->l, L, e);
return rel;
}
}
/* push select into the given relation */
- return rel_push_select(sql->sa, rel, L, e);
+ return rel_push_select(sql, rel, L, e);
} else { /* join */
if (is_semi(rel->op) || is_outerjoin(rel->op)) {
rel_join_add_exp(sql->sa, rel, e);
return rel;
}
/* push join into the given relation */
- return rel_push_join(sql->sa, rel, L, R, rs2, e);
+ return rel_push_join(sql, rel, L, R, rs2, e);
}
}
@@ -2850,15 +2853,21 @@ rel_logical_exp(mvc *sql, sql_rel *rel,
rr = rel_dup(lr);
if (is_outerjoin(rel->op)) {
+ int pushdown = sql->pushdown;
+
exps = rel->exps;
-
- lr -> exps = NULL;
+ sql->pushdown = 0;
+
+ lr = rel_select_copy(sql->sa, lr, sa_list(sql->sa));
lr = rel_logical_exp(sql, lr, lo, f);
lexps = lr?lr->exps:NULL;
-
- rr -> exps = NULL;
+ lr = lr->l;
+
+ rr = rel_select_copy(sql->sa, rr, sa_list(sql->sa));
rr = rel_logical_exp(sql, rr, ro, f);
rexps = rr?rr->exps:NULL;
+ rr = rr->l;
+ sql->pushdown = pushdown;
} else {
lr = rel_logical_exp(sql, lr, lo, f);
rr = rel_logical_exp(sql, rr, ro, f);
diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h
--- a/sql/server/rel_select.h
+++ b/sql/server/rel_select.h
@@ -58,8 +58,8 @@ extern sql_exp * rel_value_exp2(mvc *sql
extern sql_rel *rel_crossproduct(sql_allocator *sa, sql_rel *l, sql_rel *r,
operator_type join);
extern void rel_join_add_exp(sql_allocator *sa, sql_rel *rel, sql_exp *e);
-extern sql_rel *rel_push_select(sql_allocator *sa, sql_rel *rel, sql_exp *ls,
sql_exp *e);
-extern sql_rel *rel_push_join(sql_allocator *sa, sql_rel *rel, sql_exp *ls,
sql_exp *rs, sql_exp *rs2, sql_exp *e);
+extern sql_rel *rel_push_select(mvc *sql, sql_rel *rel, sql_exp *ls, sql_exp
*e);
+extern sql_rel *rel_push_join(mvc *sql, sql_rel *rel, sql_exp *ls, sql_exp
*rs, sql_exp *rs2, sql_exp *e);
/* TODO rename to exp_check_type + move to rel_exp.mx */
extern sql_exp *rel_check_type(mvc *sql, sql_subtype *t, sql_exp *exp, int
tpe);
extern int rel_convert_types(mvc *sql, sql_exp **L, sql_exp **R, int
scale_fixing, int tpe);
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -443,6 +443,7 @@ mvc_create(int clientid, backend_stack s
store_unlock();
m->type = Q_PARSE;
+ m->pushdown = 1;
m->result_id = 0;
m->results = NULL;
@@ -507,6 +508,7 @@ mvc_reset(mvc *m, bstream *rs, stream *w
m->label = 0;
m->cascade_action = NULL;
m->type = Q_PARSE;
+ m->pushdown = 1;
for(i=0;i<MAXSTATS;i++)
m->opt_stats[i] = 0;
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -116,6 +116,7 @@ typedef struct mvc {
sql_session *session;
int type; /* query type */
+ int pushdown; /* AND or OR query handling */
int label; /* numbers for relational projection labels */
list *cascade_action; /* protection against recursive cascade actions
*/
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list