Update of /cvsroot/monetdb/sql/src/backends/monet4
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv1716/monet4
Modified Files:
sql_gencode.mx
Log Message:
added small optimization: use bandjoin if rangejoin(x,c1,c2) ==
c1 == c-a1 and c2 == c+a2 and a1 and a2 are constants
Index: sql_gencode.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet4/sql_gencode.mx,v
retrieving revision 1.164
retrieving revision 1.165
diff -u -d -r1.164 -r1.165
--- sql_gencode.mx 3 Jan 2008 09:41:17 -0000 1.164
+++ sql_gencode.mx 6 Jan 2008 13:41:55 -0000 1.165
@@ -598,11 +598,9 @@
case st_select2:
case st_uselect2:
case st_join2:{
- int l = backend_dumpstmt_(s->op1.stval, nr, sql);
- int r1 = backend_dumpstmt_(s->op2.stval, nr, sql);
- int r2 = backend_dumpstmt_(s->op3.stval, nr, sql);
+ int l, r1, r2, ls = 0, hs = 0, rs = 0;
char *bits = NULL;
- char *cmd;
+ char *cmd, *tpe = NULL;
if (s->type == st_select2)
cmd = "select";
@@ -610,6 +608,36 @@
cmd = "uselect";
else
cmd = "join";
+
+ buf = NEW_ARRAY(char, BUFSIZ + 1);
+ /* if st_join2 try to convert to bandjoin */
+ /* 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;
+ tpe = tail_type(r)->type->base.name;
+ rs = backend_dumpstmt_(r, nr, sql);
+ len = snprintf(buf, BUFSIZ, "var rs%d :=
s%d.reverse();\n", rs, rs);
+
+ if (ls)
+ r1 =
backend_dumpstmt_(s->op2.stval->op2.stval, nr, sql);
+ else
+ r1 = 0;
+ if (hs)
+ r2 =
backend_dumpstmt_(s->op3.stval->op2.stval, nr, sql);
+ else
+ r2 = 0;
+ cmd = "bandjoin";
+ }
switch (s->flag) {
case 0:
bits = ", FALSE, FALSE";
@@ -624,14 +652,32 @@
bits = ", TRUE, TRUE";
break;
}
- buf = NEW_ARRAY(char, BUFSIZ + 1);
+ l = backend_dumpstmt_(s->op1.stval, nr, sql);
+ if (!rs) {
+ r1 = backend_dumpstmt_(s->op2.stval, nr, sql);
+ r2 = backend_dumpstmt_(s->op3.stval, nr, sql);
+ len += snprintf(buf+len, BUFSIZ-len, "var s%d
:= s%d.%s(s%d, s%d%s);\n", -s->nr, l, cmd, r1, r2, bits);
+ } else {
+ char r1buf[64];
+ char r2buf[64];
- len = snprintf(buf, BUFSIZ, "var s%d := s%d.%s(s%d,
s%d%s);\n", -s->nr, l, cmd, r1, r2, bits);
+ if (r1)
+ snprintf(r1buf, 64, "s%d", r1);
+ else
+ snprintf(r1buf, 64, "%s(0)", tpe);
+ if (r2)
+ snprintf(r2buf, 64, "s%d", r2);
+ else
+ snprintf(r2buf, 64, "%s(0)", tpe);
+ len += snprintf(buf+len, BUFSIZ-len, "var s%d
:= s%d.%s(rs%d, %s, %s%s);\n", -s->nr, l, cmd, rs, r1buf, r2buf, bits);
+ }
dump(sql, buf, len, -s->nr);
_DELETE(buf);
backend_dump_nil(sql, s->op1.stval);
- backend_dump_nil(sql, s->op2.stval);
- backend_dump_nil(sql, s->op3.stval);
+ if (rs && r1)
+ backend_dump_nil(sql, s->op2.stval);
+ if (rs && r1)
+ backend_dump_nil(sql, s->op3.stval);
break;
}
case st_semijoin:
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins