Update of /cvsroot/monetdb/sql/src/server
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv21897/src/server
Modified Files:
rel_bin.mx
Log Message:
use uselect( semijoin(l, uselect(r))) instead of
semijoin(uselect(l), uselect(r))
U rel_bin.mx
Index: rel_bin.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_bin.mx,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -d -r1.39 -r1.40
--- rel_bin.mx 9 Apr 2008 09:56:23 -0000 1.39
+++ rel_bin.mx 24 Apr 2008 20:42:27 -0000 1.40
@@ -109,7 +109,7 @@
}
static stmt *
-exp_bin(mvc *sql, sql_exp *e, stmt *left, stmt *right, group *grp)
+exp_bin(mvc *sql, sql_exp *e, stmt *left, stmt *right, group *grp, stmt *sel)
{
stmt *s = NULL;
@@ -130,7 +130,7 @@
}
} break;
case e_convert: {
- stmt *l = exp_bin(sql, e->l, left, right, grp);
+ stmt *l = exp_bin(sql, e->l, left, right, grp, sel);
list *tps = e->r;
sql_subtype *from = tps->h->data;
sql_subtype *to = tps->h->next->data;
@@ -147,7 +147,7 @@
for (en = exps->h; en; en = en->next) {
stmt *es;
- es = exp_bin(sql, en->data, left, right, grp);
+ es = exp_bin(sql, en->data, left, right, grp,
sel);
if (!es) {
list_destroy(l);
return NULL;
@@ -169,7 +169,7 @@
for (en = exps->h; en; en = en->next) {
stmt *es;
- es = exp_bin(sql, en->data, left,
right, NULL);
+ es = exp_bin(sql, en->data, left,
right, NULL, sel);
if (!es) {
list_destroy(l);
return NULL;
@@ -182,7 +182,7 @@
orderby = stmt_order(stmt_dup(g->grp), 1);
for (en = obe->h; en; en = en->next) {
sql_exp *orderbycole = en->data;
- stmt *orderbycols = exp_bin(sql, orderbycole,
left, right, NULL);
+ stmt *orderbycols = exp_bin(sql, orderbycole,
left, right, NULL, sel);
if (!orderbycols) {
list_destroy(l);
@@ -215,10 +215,11 @@
sql_subaggr *a = e->f;
group *g = grp;
+ assert(sel == NULL);
if (attr) {
- as = exp_bin(sql, attr->h->data, left, right, NULL);
+ as = exp_bin(sql, attr->h->data, left, right, NULL,
sel);
if (list_length(attr) == 2)
- as2 = exp_bin(sql, attr->h->next->data, left,
right, NULL);
+ as2 = exp_bin(sql, attr->h->next->data, left,
right, NULL, sel);
} else {
/* count(*) may need the default group (relation) and
and/or an attribute to count */
@@ -275,10 +276,12 @@
print_stmtlist(left);
print_stmtlist(right);
}
+ if (sel)
+ s = stmt_semijoin(s, stmt_dup(sel));
} break;
case e_cmp: {
stmt *l = NULL, *r = NULL, *r2 = NULL;
- int swapped = 0, sel = 0;
+ int swapped = 0, is_select = 0;
sql_exp *re = e->r, *re2 = e->f;
prop *p;
@@ -304,31 +307,39 @@
} else {
r = bin_find_column(right, er->l,
ri->base.name);
}
- if (swapped)
+ /* small performance improvement, ie use idx directly */
+ if (l->type == st_alias &&
+ l->op1.stval->type == st_idxbat &&
+ r->type == st_alias &&
+ r->op1.stval->type == st_mirror) {
+ stmt_destroy(r);
+ s = l;
+ } else if (swapped)
s = stmt_join(r, stmt_reverse(l), cmp_equal);
else
s = stmt_join(l, stmt_reverse(r), cmp_equal);
sql->opt_stats[0]++;
+ assert(sel==NULL);
break;
}
if (!l) {
- l = exp_bin(sql, e->l, left, NULL, grp);
+ l = exp_bin(sql, e->l, left, NULL, grp, sel);
swapped = 0;
}
if (!l && right) {
- l = exp_bin(sql, e->l, right, NULL, grp);
+ l = exp_bin(sql, e->l, right, NULL, grp, sel);
swapped = 1;
}
if (swapped || !right)
- r = exp_bin(sql, e->r, left, NULL, grp);
+ r = exp_bin(sql, e->r, left, NULL, grp, sel);
else
- r = exp_bin(sql, e->r, right, NULL, grp);
+ r = exp_bin(sql, e->r, right, NULL, grp, sel);
if (!r && !swapped) {
- r = exp_bin(sql, e->r, left, NULL, grp);
- sel = 1;
+ r = exp_bin(sql, e->r, left, NULL, grp, sel);
+ is_select = 1;
}
if (re2)
- r2 = exp_bin(sql, e->f, left, right, grp);
+ r2 = exp_bin(sql, e->f, left, right, grp, sel);
if (!l || !r || (re2 && !r2)) {
assert(0);
if (l) stmt_destroy(l);
@@ -350,7 +361,7 @@
}
return stmt_likeselect(l, r, r2, (comp_type)e->flag);
}
- if (left && right && re->card > CARD_ATOM && !sel) {
+ if (left && right && re->card > CARD_ATOM && !is_select) {
if (l->nrcols == 0)
l =
stmt_const(bin_first_column(swapped?right:left), l);
if (r->nrcols == 0)
@@ -462,7 +473,7 @@
stmt *sub = NULL;
node *en;
- sub = exp_bin(sql, rel->l, NULL, NULL, NULL); /* table function */
+ sub = exp_bin(sql, rel->l, NULL, NULL, NULL, NULL); /* table function */
if (!sub) {
assert(0);
return NULL;
@@ -470,7 +481,7 @@
l = create_stmt_list();
for( en = rel->exps->h; en; en = en->next ) {
sql_exp *exp = en->data;
- stmt *s = exp_bin(sql, exp, sub, NULL, NULL);
+ stmt *s = exp_bin(sql, exp, sub, NULL, NULL, NULL);
char *rnme = rel->name;
if (!s) {
@@ -535,7 +546,7 @@
}
if (rel->exps) {
for( en = rel->exps->h; en; en = en->next ) {
- stmt *s = exp_bin(sql, en->data, left, right, NULL);
+ stmt *s = exp_bin(sql, en->data, left, right, NULL,
NULL);
if (!s) {
assert(0);
@@ -677,7 +688,7 @@
}
if (rel->exps) {
for( en = rel->exps->h; en; en = en->next ) {
- stmt *s = exp_bin(sql, en->data, left, right, NULL);
+ stmt *s = exp_bin(sql, en->data, left, right, NULL,
NULL);
if (!s) {
assert(0);
@@ -1070,7 +1081,7 @@
l = create_stmt_list();
for( en = rel->exps->h; en; en = en->next ) {
sql_exp *exp = en->data;
- stmt *s = exp_bin(sql, exp, sub, NULL, NULL);
+ stmt *s = exp_bin(sql, exp, sub, NULL, NULL, NULL);
if (!s) {
assert(0);
@@ -1095,7 +1106,7 @@
for (en = oexps->h; en; en = en->next) {
sql_exp *orderbycole = en->data;
- stmt *orderbycols = exp_bin(sql, orderbycole, sub,
psub, NULL);
+ stmt *orderbycols = exp_bin(sql, orderbycole, sub,
psub, NULL, NULL);
if (!orderbycols) {
assert(0);
@@ -1146,7 +1157,7 @@
predicate = rel2bin_predicate();
}
for( en = rel->exps->h; en; en = en->next ) {
- stmt *s = exp_bin(sql, en->data, sub, NULL, NULL);
+ stmt *s = exp_bin(sql, en->data, sub, NULL, NULL, sel);
if (!s) {
assert(0);
@@ -1159,9 +1170,9 @@
if (!predicate)
predicate = rel2bin_predicate();
predicate = stmt_uselect(predicate, s, cmp_equal);
- } else if (sel) {
- sel = stmt_semijoin(sel, s);
} else {
+ if (sel)
+ stmt_destroy(sel);
sel = s;
}
}
@@ -1215,7 +1226,7 @@
for( en = exps->h; en; en = en->next ) {
sql_exp *e = en->data;
- stmt *gbcol = exp_bin(sql, e, sub, NULL, NULL);
+ stmt *gbcol = exp_bin(sql, e, sub, NULL, NULL, NULL);
if (!gbcol) {
assert(0);
@@ -1234,13 +1245,13 @@
for( n = aggrs->h; n; n = n->next ) {
sql_exp *aggrexp = n->data;
- stmt *aggrstmt = exp_bin(sql, aggrexp, sub, NULL, groupby);
+ stmt *aggrstmt = exp_bin(sql, aggrexp, sub, NULL, groupby,
NULL);
/* maybe the aggr uses intermediate results of this group by,
therefor we pass the group by columns too
*/
if (!aggrstmt)
- aggrstmt = exp_bin(sql, aggrexp, sub, cursub, groupby);
+ aggrstmt = exp_bin(sql, aggrexp, sub, cursub, groupby,
NULL);
if (!aggrstmt) {
assert(0);
stmt_destroy(cursub);
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins