Update of /cvsroot/monetdb/sql/src/server
In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv32487/src/server

Modified Files:
        rel_bin.mx rel_optimizer.mx rel_select.mx rel_exp.mx 
Log Message:
cleanup nil semantics and has nil code

always output projection (also with out relation)


U rel_exp.mx
Index: rel_exp.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_exp.mx,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -d -r1.36 -r1.37
--- rel_exp.mx  13 Sep 2009 11:24:03 -0000      1.36
+++ rel_exp.mx  14 Sep 2009 18:20:28 -0000      1.37
@@ -82,6 +82,7 @@
 extern int exp_is_join(sql_exp *e);
 extern int exp_is_eqjoin(sql_exp *e);
 extern int exp_is_correlation(sql_exp *e, sql_rel *r );
+extern int exp_is_join_exp(sql_exp *e);
 extern int exp_is_atom(sql_exp *e);
 
 extern sql_exp *exps_bind_column( list *exps, char *cname, int *ambiguous);
@@ -644,10 +645,37 @@
        return 0;
 }
 
+static int
+exps_are_joins( list *l )
+{
+       node *n;
+
+       for (n = l->h; n; n = n->next) {
+               sql_exp *e = n->data;
+
+               if (exp_is_join_exp(e))
+                       return -1;
+       }
+       return 0;
+}
+
+int
+exp_is_join_exp(sql_exp *e)
+{
+       sql_exp *l = e->l;
+       sql_exp *r = e->r;
+       if (e->type == e_cmp && e->flag != cmp_or && l && r && r->card >= 
CARD_AGGR)
+               return 0;
+       if (e->type == e_cmp && e->flag == cmp_or && e->card >= CARD_AGGR)
+               if (exps_are_joins(e->l) == 0 && exps_are_joins(e->r) == 0)
+                       return 0;
+       return -1;
+}
+
 int
 exp_is_join(sql_exp *e)
 {
-       if (e->type == e_cmp && e->l && e->r)
+       if (e->type == e_cmp && e->flag != cmp_or && e->l && e->r && e->card >= 
CARD_AGGR)
                return 0;
        return -1;
 }
@@ -740,7 +768,7 @@
 int 
 exp_is_correlation(sql_exp *e, sql_rel *r )
 {
-       if (e->type == e_cmp) {
+       if (e->type == e_cmp && e->flag != cmp_or) {
                sql_exp *le = rel_find_exp(r->l, e->l);
                sql_exp *re = rel_find_exp(r->r, e->r);
 

U rel_select.mx
Index: rel_select.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_select.mx,v
retrieving revision 1.156
retrieving revision 1.157
diff -u -d -r1.156 -r1.157
--- rel_select.mx       23 Aug 2009 06:17:02 -0000      1.156
+++ rel_select.mx       14 Sep 2009 18:20:25 -0000      1.157
@@ -4154,7 +4154,7 @@
 }
 
 static sql_rel *
-join_on_column_name(mvc *sql, sql_rel *rel, sql_rel *t1, sql_rel *t2, int op)
+join_on_column_name(mvc *sql, sql_rel *rel, sql_rel *t1, sql_rel *t2, int op, 
int l_nil, int r_nil)
 {
        int nr = ++sql->label, found = 0, full = (op != op_join);
        char name[16], *nme;
@@ -4184,6 +4184,8 @@
                        append(outexps, exp_dup(le));
                        list_remove_data(r_exps, re);
                } else {
+                       if (l_nil)
+                               set_has_nil(le);
                        append(outexps, exp_dup(le));
                }
        }
@@ -4194,7 +4196,12 @@
                rel_destroy(rel);
                return NULL;
        }
-       list_merge(outexps, r_exps, (fdup)&exp_dup);
+       for (n = r_exps->h; n; n = n->next) {
+               sql_exp *re = n->data;
+               if (r_nil)
+                       set_has_nil(re);
+               append(outexps, exp_dup(re));
+       }
        list_destroy(r_exps);
        rel = rel_project(rel, outexps);
        set_processed(rel);
@@ -4690,6 +4697,7 @@
 {
        operator_type op = op_join;
        sql_rel *t1, *t2, *inner;
+       int l_nil = 0, r_nil = 0;
 
        t1 = table_ref(sql, rel, tab1);
        t2 = table_ref(sql, rel, tab2);
@@ -4708,10 +4716,14 @@
        case jt_inner: op = op_join;
                break;
        case jt_left: op = op_left;
+               r_nil = 1;
                break;
        case jt_right: op = op_right;
+               l_nil = 1;
                break;
        case jt_full: op = op_full;
+               l_nil = 1;
+               r_nil = 1;
                break;
        case jt_union:
                /* fool compiler */
@@ -4728,6 +4740,31 @@
 
        if (js && js->token != SQL_USING) {     /* On sql_logical_exp */
                rel = rel_logical_exp(sql, rel, js, sql_where);
+
+               if (!rel)
+                       return rel;
+               if (l_nil || r_nil) { /* add projection for correct NOT NULL */
+                       list *outexps = new_exp_list(), *exps;
+                       node *m;
+
+                       exps = rel_projections(sql, t1, rel_get_name(t1), 1, 1);
+                       for (m = exps->h; m; m = m->next) {
+                               sql_exp *ls = exp_dup(m->data);
+                               if (l_nil)
+                                       set_has_nil(ls);
+                               append(outexps, ls);
+                       }
+                       list_destroy(exps);
+                       exps = rel_projections(sql, t2, rel_get_name(t2), 1, 1);
+                       for (m = exps->h; m; m = m->next) {
+                               sql_exp *rs = exp_dup(m->data);
+                               if (r_nil)
+                                       set_has_nil(rs);
+                               append(outexps, rs);
+                       }
+                       list_destroy(exps);
+                       rel = rel_project(rel, outexps);
+               }
        } else if (js) {        /* using */
                char rname[16], *rnme;
                dnode *n = js->data.lval->h;
@@ -4768,8 +4805,12 @@
                                        break;
                                }
                        }
-                       if (!fnd)
-                               append(outexps, exp_dup(m->data));
+                       if (!fnd) {
+                               sql_exp *ls = exp_dup(m->data);
+                               if (l_nil)
+                                       set_has_nil(ls);
+                               append(outexps, ls);
+                       }
                }
                list_destroy(exps);
                exps = rel_projections(sql, t2, NULL, 1, 1);
@@ -4783,13 +4824,17 @@
                                        break;
                                }
                        }
-                       if (!fnd)
-                               append(outexps, exp_dup(m->data));
+                       if (!fnd) {
+                               sql_exp *rs = exp_dup(m->data);
+                               if (r_nil)
+                                       set_has_nil(rs);
+                               append(outexps, rs);
+                       }
                }
                list_destroy(exps);
                rel = rel_project(rel, outexps);
        } else {                /* ! js -> natural join */
-               rel = join_on_column_name(sql, rel, t1, t2, op);
+               rel = join_on_column_name(sql, rel, t1, t2, op, l_nil, r_nil);
        }
        if (!rel)
                return NULL;

U rel_optimizer.mx
Index: rel_optimizer.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_optimizer.mx,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -d -r1.70 -r1.71
--- rel_optimizer.mx    13 Sep 2009 11:23:24 -0000      1.70
+++ rel_optimizer.mx    14 Sep 2009 18:20:25 -0000      1.71
@@ -1664,6 +1664,27 @@
            r && r->op == op_project && !(rel_is_ref(r))) 
                return rel_merge_projects(changes, sql, rel);
 
+       /* merge select and cross product ? */
+       if (rel->op == op_select && r && r->op == op_join && 
list_empty(r->exps) && !(rel_is_ref(r))) {
+               list *exps = rel->exps;
+
+               if (!r->exps)
+                       r->exps = new_exp_list(); 
+               rel->exps = new_exp_list(); 
+               for (n = exps->h; n; n = n->next) { 
+                       sql_exp *e = exp_dup(n->data);
+
+                       if (exp_is_join_exp(e) == 0) {
+                               append(r->exps, e);
+                               *changes += 1;
+                       } else {
+                               append(rel->exps, e);
+                       }
+               }
+               list_destroy(exps);
+               return rel;
+       }
+
        /* push select through join */
        if (rel->op == op_select && r && is_join(r->op) && !(rel_is_ref(r))) {
                sql_rel *jl = r->l;
@@ -2029,7 +2050,7 @@
                        if (!cnt) {
                                list *l = avg->l;
                                sql_subaggr *cf = 
sql_bind_aggr(sql->session->schema, "count", exp_subtype(l->h->data));
-                               sql_exp *e = exp_aggr(list_dup(avg->l, 
(fdup)&exp_dup), cf, need_distinct(avg), has_no_nil(avg), avg->card, 
has_nil(avg));
+                               sql_exp *e = exp_aggr(list_dup(avg->l, 
(fdup)&exp_dup), cf, need_distinct(avg), need_no_nil(avg), avg->card, 
has_nil(avg));
 
                                exp_label(e, ++sql->label);
                                append(nexps, e);
@@ -2038,7 +2059,7 @@
                        if (!sum) {
                                list *l = avg->l;
                                sql_subaggr *sf = 
sql_bind_aggr(sql->session->schema, "sum", exp_subtype(l->h->data));
-                               sql_exp *e = exp_aggr(list_dup(avg->l, 
(fdup)&exp_dup), sf, need_distinct(avg), has_no_nil(avg), avg->card, 
has_nil(avg));
+                               sql_exp *e = exp_aggr(list_dup(avg->l, 
(fdup)&exp_dup), sf, need_distinct(avg), need_no_nil(avg), avg->card, 
has_nil(avg));
 
                                exp_label(e, ++sql->label);
                                append(nexps, e);

U rel_bin.mx
Index: rel_bin.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_bin.mx,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -d -r1.91 -r1.92
--- rel_bin.mx  4 Sep 2009 11:52:43 -0000       1.91
+++ rel_bin.mx  14 Sep 2009 18:20:23 -0000      1.92
@@ -340,6 +340,7 @@
                        s = stmt_Nop(stmt_list(l), sql_dup_func(e->f)); 
        }       break;
        case e_aggr: {
+               sql_exp *at = NULL;
                list *attr = e->l; 
                stmt *as = NULL;
                stmt *as2 = NULL;
@@ -348,7 +349,8 @@
 
                assert(sel == NULL);
                if (attr) { 
-                       as = exp_bin(sql, attr->h->data, left, right, NULL, 
sel);
+                       at = attr->h->data;
+                       as = exp_bin(sql, at, left, right, NULL, sel);
                        if (list_length(attr) == 2)
                                as2 = exp_bin(sql, attr->h->next->data, left, 
right, NULL, sel);
                        /* insert single value into a column */
@@ -377,8 +379,8 @@
                 *
                 * so here we need to ignore NULLs
                 */
-               if (has_no_nil(e) && attr) {
-                       sql_subtype *t = exp_subtype(attr->h->data);
+               if (need_no_nil(e) && at && has_nil(at) && attr) {
+                       sql_subtype *t = exp_subtype(at);
                        stmt *n = stmt_atom(atom_general(t, NULL, 0));
                        as = stmt_select2(as, n, stmt_dup(n), 0);
                }


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins

Reply via email to