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

Reply via email to