Update of /cvsroot/monetdb/sql/src/backends/monet5
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv9668/src/backends/monet5
Modified Files:
sql_gencode.mx
Log Message:
handle range joins efficiently in the algebra version
U sql_gencode.mx
Index: sql_gencode.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/sql_gencode.mx,v
retrieving revision 1.273
retrieving revision 1.274
diff -u -d -r1.273 -r1.274
--- sql_gencode.mx 1 Apr 2008 17:04:54 -0000 1.273
+++ sql_gencode.mx 9 Apr 2008 09:56:22 -0000 1.274
@@ -224,6 +224,46 @@
return op;
}
+int
+range_join_convertable(stmt *s, stmt **base, stmt **L, stmt **H)
+{
+ int ls = 0, hs = 0;
+ stmt *l = NULL, *h = NULL;
+ stmt *bl = s->op2.stval, *bh = s->op3.stval;
+
+ if (s->op2.stval->type == st_binop) {
+ bl = s->op2.stval->op1.stval;
+ l = s->op2.stval->op2.stval;
+ } else if (s->op2.stval->type == st_Nop &&
+ list_length(s->op2.stval->op1.stval->op1.lval) == 2) {
+ bl = s->op2.stval->op1.stval->op1.lval->h->data;
+ l = s->op2.stval->op1.stval->op1.lval->h->next->data;
+ }
+ if (s->op3.stval->type == st_binop) {
+ bh = s->op3.stval->op1.stval;
+ h = s->op3.stval->op2.stval;
+ }
+ else if (s->op3.stval->type == st_Nop &&
+ list_length(s->op3.stval->op1.stval->op1.lval) == 2) {
+ bh = s->op3.stval->op1.stval->op1.lval->h->data;
+ h = s->op3.stval->op1.stval->op1.lval->h->next->data;
+ }
+
+ if ((ls = (l &&
+ strcmp(s->op2.stval->op4.funcval->func->base.name, "sql_sub")==0 &&
+ l->nrcols == 0) ||
+
+ (hs = (h &&
+ strcmp(s->op3.stval->op4.funcval->func->base.name, "sql_add")==0 &&
+ h->nrcols == 0))) && (ls || hs) && bl == bh) {
+ *base = bl;
+ *L = l;
+ *H = h;
+ return 1;
+ }
+ return 0;
+}
+
void
dump_1(backend *sql, MalBlkPtr mb, stmt *s, char *mod, char *name)
{
@@ -783,7 +823,8 @@
case st_select2:
case st_join2:{
int l = _dumpstmt(sql, mb, s->op1.stval);
- int r1, r2, ls = 0, hs = 0;
+ stmt *base, *low = NULL, *high = NULL;
+ int r1, r2;
int rs = 0;
char *cmd =
@@ -796,28 +837,20 @@
/* ie check if we substract/add a constant, to the
same column */
if (s->type == st_join2 &&
- ((ls = (s->op2.stval->type == st_binop &&
- strcmp(s->op2.stval->op4.funcval->func->base.name,
"sql_sub")==0 &&
- s->op2.stval->op2.stval->nrcols == 0)) ||
- (hs = (s->op3.stval->type == st_binop &&
- strcmp(s->op3.stval->op4.funcval->func->base.name,
"sql_add")==0 &&
- s->op3.stval->op2.stval->nrcols == 0))) &&
- ((ls && hs && s->op2.stval->op1.stval ==
s->op3.stval->op1.stval) ||
- (ls && !hs && s->op2.stval->op1.stval ==
s->op3.stval) ||
- (!ls && hs && s->op2.stval ==
s->op3.stval->op1.stval)) ) {
- stmt *r =
(!ls)?s->op2.stval:s->op2.stval->op1.stval;
- rs = _dumpstmt(sql, mb, r);
+ range_join_convertable(s, &base, &low, &high)) {
+ int tt = tail_type(base)->type->localtype;
+ rs = _dumpstmt(sql, mb, base);
q = newStmt2(mb, batRef, reverseRef);
q = pushArgument(mb, q, rs);
rs = getDestVar(q);
- if (ls)
- r1 = _dumpstmt(sql, mb,
s->op2.stval->op2.stval);
+ if (low)
+ r1 = _dumpstmt(sql, mb, low);
else
- r1 = argumentZero(mb,
tail_type(r)->type->localtype);
- if (hs)
- r2 = _dumpstmt(sql, mb,
s->op3.stval->op2.stval);
+ r1 = argumentZero(mb, tt);
+ if (high)
+ r2 = _dumpstmt(sql, mb, high);
else
- r2 = argumentZero(mb,
tail_type(r)->type->localtype);
+ r2 = argumentZero(mb, tt);
cmd = bandjoinRef;
}
-------------------------------------------------------------------------
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