Update of /cvsroot/monetdb/sql/src/server
In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv15253/src/server
Modified Files:
rel_optimizer.mx rel_select.mx
Log Message:
we now see in as a list of or expressions (doesn't help q19 jet)
for q19 and alike we still need (TODO's)
to generate semijoin's for a list of or's on the same bat
to lift shared expressions from a list of or's
U rel_select.mx
Index: rel_select.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_select.mx,v
retrieving revision 1.134
retrieving revision 1.135
diff -u -d -r1.134 -r1.135
--- rel_select.mx 14 Mar 2009 09:52:50 -0000 1.134
+++ rel_select.mx 14 Mar 2009 14:43:01 -0000 1.135
@@ -2111,7 +2111,8 @@
dnode *n = dl->h->next;
sql_exp *l = rel_value_exp(sql, rel, lo, f, ek), *r = NULL;
sql_rel *left = NULL, *right = NULL, *p = NULL;
- int needproj = 0;
+ int needproj = 0, vals_only = 1;
+ list *vals = NULL;
if (!l)
return NULL;
@@ -2129,6 +2130,7 @@
if (n->type == type_list) {
sql_subtype *st = exp_subtype(l);
+ vals = new_exp_list();
n = n->data.lval->h;
for (; n; n = n->next) {
symbol *sval = n->data.sym;
@@ -2140,9 +2142,12 @@
exp_destroy(r);
exp_destroy(l);
rel_destroy(right);
+ list_destroy(vals);
return NULL;
}
+ list_append(vals, exp_dup(r));
if (z) {
+ vals_only = 0;
rl = z;
} else {
rl = rel_project_exp(r);
@@ -2161,14 +2166,33 @@
return sql_error(sql, 02, "IN: missing inner query");
}
if (right) {
- sql_exp *e;
+ sql_exp *e = NULL;
+
+ if (vals_only) {
+ node *n;
- if (right->card == CARD_ATOM) {
- if (sc->token == SQL_NOT_IN)
- e = rel_binop_(sql, l, r, NULL, "!=",
0);
- else
- e = rel_binop_(sql, l, r, NULL, "=", 0);
+ rel_destroy(right);
+ for(n=vals->h; n; n = n->next) {
+ sql_exp *r = exp_dup(n->data), *ne;
+
+ l = exp_dup(l);
+ if (sc->token == SQL_NOT_IN)
+ ne = rel_binop_(sql, l, r,
NULL, "<>", 0);
+ else
+ ne = rel_binop_(sql, l, r,
NULL, "=", 0);
+ if (!e) {
+ e = ne;
+ } else if (sc->token == SQL_NOT_IN) {
+ e = rel_binop_(sql, e, ne,
NULL, "and", 0);
+ } else {
+ e = rel_binop_(sql, e, ne,
NULL, "or", 0);
+ }
+ }
+ exp_destroy(l);
+ list_destroy(vals);
return e;
+ } else if (vals) {
+ list_destroy(vals);
}
r = rel_lastexp(sql, right);
if (rel_convert_types(sql, &l, &r, 1, type_equal) < 0) {
@@ -2191,7 +2215,7 @@
*rel = left;
}
if (sc->token == SQL_NOT_IN)
- e = rel_binop_(sql, l, r, NULL, "!=", 0);
+ e = rel_binop_(sql, l, r, NULL, "<>", 0);
else
e = rel_binop_(sql, l, r, NULL, "=", 0);
return e;
@@ -2430,7 +2454,8 @@
dnode *n = dl->h->next;
sql_rel *left = NULL, *right = NULL, *outer = rel;
sql_exp *l = rel_value_exp(sql, &left, lo, f, ek), *e, *r =
NULL;
- int correlated = 0;
+ list *vals = NULL;
+ int correlated = 0, vals_only = 1;
int l_is_value = 1;
if (!l) {
@@ -2447,8 +2472,10 @@
return NULL;
ek.card = card_set;
+
/* first remove the NULLs */
- if (sc->token == SQL_NOT_IN && l->card != CARD_ATOM &&
has_nil(l)) {
+ if (sc->token == SQL_NOT_IN &&
+ l->card != CARD_ATOM && has_nil(l)) {
e = rel_unop_(sql, exp_dup(l), NULL, "isnull", 0);
e = exp_compare( e, exp_atom_bool(0), cmp_equal);
if (!is_select(rel->op))
@@ -2456,12 +2483,12 @@
else
rel_select_add_exp(rel, e);
}
- /* list of values or subqueries */
- /* single element could be a 'select' */
+ /* list of values or subqueries */
if (n->type == type_list) {
sql_subtype *st = exp_subtype(l);
+ vals = new_exp_list();
n = n->data.lval->h;
for (; n; n = n->next) {
symbol *sval = n->data.sym;
@@ -2482,16 +2509,17 @@
correlated = 1;
}
if (!r || !(r=rel_check_type(sql, st, r,
type_equal))) {
- if (r)
- exp_destroy(r);
+ exp_destroy(r);
exp_destroy(l);
- if (right)
- rel_destroy(right);
+ rel_destroy(right);
+ list_destroy(vals);
return NULL;
}
if (z) {
+ vals_only = 0;
rl = z;
} else {
+ list_append(vals, exp_dup(r));
rl = rel_project_exp(exp_label(r,
++sql->label));
}
if (right) {
@@ -2509,22 +2537,51 @@
} else {
return sql_error(sql, 02, "IN: missing inner query");
}
+
if (right) {
- if (right->card == CARD_ATOM && !correlated) {
- if (rel_convert_types(sql, &l, &r, 1,
type_equal) < 0) {
- exp_destroy(l);
- exp_destroy(r);
- return NULL;
+ if (vals_only && !correlated) {
+ sql_exp *e = NULL;
+ node *n;
+
+ rel_destroy(right);
+ for(n=vals->h; n; n = n->next) {
+ sql_exp *r = exp_dup(n->data), *ne;
+
+ if (rel_convert_types(sql, &l, &r, 1,
type_equal) < 0) {
+ exp_destroy(l);
+ exp_destroy(r);
+ list_destroy(vals);
+ return NULL;
+ }
+ l = exp_dup(l);
+ if (sc->token == SQL_NOT_IN) {
+ ne = exp_compare( l, r,
cmp_notequal);
+ if (!is_select(rel->op))
+ rel = rel_select(rel,
ne);
+ else
+ rel_select_add_exp(rel,
ne);
+ } else {
+ ne = exp_compare( l, r,
cmp_equal);
+ if (!e)
+ e = ne;
+ else
+ e = exp_or(
+
append(new_exp_list(),e),
+
append(new_exp_list(),ne)
+ );
+ }
}
- if (sc->token == SQL_NOT_IN)
- e = exp_compare( l, r, cmp_notequal);
- else
- e = exp_compare( l, r, cmp_equal);
- if (!is_select(rel->op))
- rel = rel_select(rel, e);
- else
- rel_select_add_exp(rel, e);
+ if (e && sc->token == SQL_IN) {
+ if (!is_select(rel->op))
+ rel = rel_select(rel, e);
+ else
+ rel_select_add_exp(rel, e);
+ }
+ exp_destroy(l);
+ list_destroy(vals);
return rel;
+ } else if (vals) {
+ list_destroy(vals);
}
r = rel_lastexp(sql, right);
rel_setsubquery(right);
U rel_optimizer.mx
Index: rel_optimizer.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_optimizer.mx,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -d -r1.54 -r1.55
--- rel_optimizer.mx 14 Mar 2009 09:52:50 -0000 1.54
+++ rel_optimizer.mx 14 Mar 2009 14:43:01 -0000 1.55
@@ -1125,7 +1125,7 @@
return rel;
}
-sql_rel *
+static sql_rel *
rel_merge_projects(int *changes, mvc *sql, sql_rel *rel)
{
list *exps = rel->exps;
@@ -1330,45 +1330,6 @@
return rel;
}
-static sql_rel *
-rel_dereference(int *changes, mvc *sql, sql_rel *rel)
-{
- sql_rel *l = rel->l;
- sql_rel *r = rel->r;
-
- (void)sql;
- if (rel->op == op_union &&
- rel_find_ref(l) && rel_find_ref(l) == rel_find_ref(r)) {
- sql_rel *ll = l->l;
- sql_rel *rl = r->l;
-
- while (ll && !rel_is_ref(ll) &&
- (is_project(ll->op) || is_select(ll->op) ||
is_join(ll->op))) {
- l = ll;
- ll = ll->l;
- }
-
- if (rel_is_ref(ll)) {
- rel_destroy(ll); /* decrease ref */
- l->l = rel_copy(ll);
- *changes = 1;
- }
-
- while (rl && !rel_is_ref(rl) &&
- (is_project(rl->op) || is_select(rl->op) ||
is_join(rl->op))) {
- r = rl;
- rl = rl->l;
- }
-
- if (rel_is_ref(rl)) {
- rel_destroy(rl); /* decrease ref */
- r->l = rel_copy(rl);
- *changes = 1;
- }
- }
- return rel;
-}
-
/*
* Push select down, pushes the selects through (simple) projections. Also
* it cleans up the projections which become useless.
@@ -1442,12 +1403,12 @@
sql_exp *e = n->data, *ne = NULL;
int done = 0;
- ne = exp_push_down(sql, e, r, jl);
+ ne = exp_push_down(sql, e, jl, jl);
if (ne && ne != e) {
done = 1;
rel_select_add_exp(jl, ne);
} else {
- ne = exp_push_down(sql, e, r, jr);
+ ne = exp_push_down(sql, e, jr, jr);
if (ne && ne != e) {
done = 1;
rel_select_add_exp(jr, ne);
@@ -1623,7 +1584,7 @@
* When the join is on the group by columns, we can push the joins left
* under the group by.
*/
-sql_rel *
+static sql_rel *
rel_push_join_down(int *changes, mvc *sql, sql_rel *rel)
{
list *exps = NULL;
@@ -1871,7 +1832,7 @@
/* Pushing projects up the tree. Done very early in the optimizer.
* Makes later steps easier.
*/
-sql_rel *
+static sql_rel *
rel_push_project_up(int *changes, mvc *sql, sql_rel *rel)
{
/* project/project cleanup is done later */
@@ -2708,10 +2669,6 @@
if (gp.cnt[op_union])
rel = rewrite(sql, rel, &rel_merge_union);
- /* copy remaining refenences in unions */
- if (gp.cnt[op_union])
- rel = rewrite(sql, rel, &rel_dereference);
-
/* Remove unused expressions */
if (gp.cnt[op_project])
rel = rel_dce(sql, rel);
------------------------------------------------------------------------------
Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
easily build your RIAs with Flex Builder, the Eclipse(TM)based development
software that enables intelligent coding and step-through debugging.
Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins