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