Update of /cvsroot/monetdb/sql/src/server
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv11808/src/server
Modified Files:
bin_optimizer.mx sql_optimize.mx sql_rel2bin.mx
sql_statement.mx
Log Message:
fixes use of txtsim functions
added more optimized versions of cast of mtime types (from string)
added more optimized verion of str to string convert
added use (first steps) of rangejoin
approved tests which changed by this (rangejoin addition)
Index: sql_rel2bin.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_rel2bin.mx,v
retrieving revision 1.110
retrieving revision 1.111
diff -u -d -r1.110 -r1.111
--- sql_rel2bin.mx 6 Dec 2007 10:17:29 -0000 1.110
+++ sql_rel2bin.mx 21 Dec 2007 17:02:25 -0000 1.111
@@ -32,6 +32,8 @@
extern stmt *rel2bin(mvc *c, stmt *s);
extern sql_column * basecolumn(stmt *st);
+extern stmt *head_column(stmt *st);
+extern stmt *tail_column(stmt *st);
#endif /* _SQL_REL2BIN_H */
@@ -43,9 +45,8 @@
#include "sql_env.h"
#include <stdio.h>
-static stmt *head_column(stmt *st);
-static stmt *
+stmt *
tail_column(stmt *st)
{
switch (st->type) {
@@ -55,6 +56,8 @@
case st_reorder:
return tail_column(st->op2.stval);
+ case st_join2:
+ return tail_column(st->op2.stval);
case st_reljoin:
return tail_column(st->op2.lval->h->data);
@@ -125,7 +128,7 @@
}
}
-static stmt *
+stmt *
head_column(stmt *st)
{
switch (st->type) {
@@ -143,6 +146,7 @@
case st_limit:
case st_join:
+ case st_join2:
case st_outerjoin:
case st_diff:
case st_intersect:
@@ -925,6 +929,7 @@
}
case st_limit:
case st_join:
+ case st_join2:
case st_reverse:
case st_select:
Index: bin_optimizer.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/bin_optimizer.mx,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- bin_optimizer.mx 27 Nov 2007 15:56:11 -0000 1.6
+++ bin_optimizer.mx 21 Dec 2007 17:02:25 -0000 1.7
@@ -206,6 +206,7 @@
case st_semijoin:
case st_limit:
case st_reljoin:
+ case st_join2:
return 1;
case st_join:
@@ -392,7 +393,8 @@
return ns;
}
- case st_join:{
+ case st_join:
+ case st_join2:{
if (s->op1.stval) {
stmt *os = s->op1.stval;
@@ -410,12 +412,20 @@
stmt_destroy(os);
s->op2.stval = ns;
}
+ if (s->op3.stval) {
+ stmt *os = s->op3.stval;
+ stmt *ns = bin_optimizer(c, os);
+
+ assert(ns != s);
+ stmt_destroy(os);
+ s->op3.stval = ns;
+ }
/* remove expensive double kdiffs
* if join on oids from the same table then
* right kdiff is not needed
*/
- if (s->flag == cmp_equal &&
+ if (s->type == st_join && s->flag == cmp_equal &&
s->op1.stval->t == s->op2.stval->h &&
s->op2.stval->type == st_diff){
stmt *old = s->op2.stval;
Index: sql_statement.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_statement.mx,v
retrieving revision 1.154
retrieving revision 1.155
diff -u -d -r1.154 -r1.155
--- sql_statement.mx 13 Dec 2007 16:08:18 -0000 1.154
+++ sql_statement.mx 21 Dec 2007 17:02:26 -0000 1.155
@@ -85,6 +85,7 @@
st_reljoin,
st_join,
+ st_join2,
st_outerjoin,
st_diff,
st_intersect,
@@ -249,6 +250,7 @@
extern stmt *stmt_reljoin1(list *joins);
extern stmt *stmt_reljoin2(list *l1, list *l2);
extern stmt *stmt_join(stmt *op1, stmt *op2, comp_type cmptype);
+extern stmt *stmt_join2(stmt *l, stmt *ra, stmt *rb, int cmp);
extern stmt *stmt_outerjoin(stmt *op1, stmt *op2, comp_type cmptype);
extern stmt *stmt_diff(stmt *op1, stmt *op2);
@@ -376,6 +378,7 @@
ST(reljoin);
ST(join);
+ ST(join2);
ST(outerjoin);
ST(diff);
ST(intersect);
@@ -637,6 +640,7 @@
case st_intersect:
case st_union:
case st_join:
+ case st_join2:
case st_outerjoin:
case st_derive:
case st_unique:
@@ -862,6 +866,7 @@
case st_intersect:
case st_union:
case st_join:
+ case st_join2:
case st_outerjoin:
case st_derive:
case st_unique:
@@ -1728,6 +1733,22 @@
}
stmt *
+stmt_join2(stmt *l, stmt *ra, stmt *rb, int cmp)
+{
+ stmt *s = stmt_create(st_join2);
+
+ s->op1.stval = l;
+ s->op2.stval = ra;
+ s->op3.stval = rb;
+ s->flag = cmp;
+ s->nrcols = 2;
+ s->h = stmt_dup(l->h);
+ s->t = stmt_dup(ra->h);
+ return s;
+}
+
+
+stmt *
stmt_outerjoin(stmt *op1, stmt *op2, comp_type cmptype)
{
stmt *s = stmt_create(st_outerjoin);
@@ -2161,6 +2182,10 @@
case st_join:
case st_outerjoin:
return tail_type(st->op2.stval);
+ case st_join2:
+ /* The tail type of a join2 is the head of the second operant!,
+ ie should be 'oid' */
+ return head_type(st->op2.stval);
case st_reljoin:
/* The tail type of a reljoin is the head of the second list!,
ie should be 'oid' */
@@ -2250,6 +2275,7 @@
case st_alias:
case st_diff:
case st_join:
+ case st_join2:
case st_outerjoin:
case st_semijoin:
case st_mirror:
@@ -2373,6 +2399,7 @@
return column_name(st->op1.stval);
case st_const:
case st_join:
+ case st_join2:
case st_outerjoin:
case st_derive:
case st_rs_column:
@@ -2450,6 +2477,7 @@
return table_name(st->op1.stval);
case st_const:
case st_join:
+ case st_join2:
case st_outerjoin:
case st_derive:
return table_name(st->op2.stval);
@@ -2506,6 +2534,7 @@
return schema_name(st->op1.stval);
case st_const:
case st_join:
+ case st_join2:
case st_outerjoin:
case st_derive:
return schema_name(st->op2.stval);
@@ -2759,7 +2788,7 @@
case st_aggr:
case st_op: case st_unop: case st_binop: case st_Nop:
case st_diff: case st_intersect: case st_union:
- case st_join: case st_outerjoin:
+ case st_join: case st_join2: case st_outerjoin:
case st_derive:
case st_unique:
case st_alias:
@@ -2927,6 +2956,8 @@
case st_outerjoin:
case st_join:
dump2(s, "join", nr); break;
+ case st_join2:
+ dump3(s, "join", nr); break;
case st_intersect: dump2(s, "intersect", nr); break;
case st_group: dump1(s, "group", nr); break;
case st_group_ext: dump1(s, "extent", nr); break;
Index: sql_optimize.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_optimize.mx,v
retrieving revision 1.83
retrieving revision 1.84
diff -u -d -r1.83 -r1.84
--- sql_optimize.mx 6 Dec 2007 10:17:28 -0000 1.83
+++ sql_optimize.mx 21 Dec 2007 17:02:25 -0000 1.84
@@ -37,6 +37,7 @@
#include "sql_env.h"
#include <stdio.h>
#include "rel_semantic.h"
+#include "sql_rel2bin.h"
#define create_stmt_list() list_create((fdestroy)&stmt_destroy)
@@ -116,6 +117,21 @@
}
static int
+cmp_matching_column( stmt *l, stmt *r)
+{
+ sql_column *lbc = basecolumn(l->op1.stval);
+ sql_column *rbc = basecolumn(r->op1.stval);
+
+ if (lbc && rbc && lbc == rbc)
+ return 0;
+ lbc = basecolumn(tail_column(l->op2.stval));
+ rbc = basecolumn(tail_column(r->op2.stval));
+ if (lbc && rbc && lbc == rbc)
+ return 0;
+ return -1;
+}
+
+static int
select_count(stmt *s)
{
switch (s->type) {
@@ -144,6 +160,9 @@
if (s->flag != cmp_equal)
return -1;
return select_count(s->op1.stval) + select_count(s->op2.stval);
+ case st_join2:
+ return select_count(s->op1.stval) +
+ select_count(s->op2.stval) + select_count(s->op3.stval);
case st_reverse:
case st_mirror:
return select_count(s->op1.stval);
@@ -237,7 +256,6 @@
return -1;
}
-
static int
data_cmp(void *d, void *k)
{
@@ -246,7 +264,7 @@
return -1;
}
-#define TYPE_JOIN(type) (type == st_join || type == st_reljoin)
+#define TYPE_JOIN(type) (type == st_join || type == st_join2 || type ==
st_reljoin)
static stmt *
stmt_intersect(stmt *op1, stmt *op2)
@@ -339,6 +357,10 @@
res = stmt_join(stmt_push_down_head(stmt_dup(join->op1.stval),
select), stmt_dup(join->op2.stval), (comp_type) join->flag);
stmt_destroy(join);
return res;
+ } else if (join->type == st_join2) {
+ res = stmt_join2(stmt_push_down_head(stmt_dup(join->op1.stval),
select), stmt_dup(join->op2.stval), stmt_dup(join->op3.stval), join->flag);
+ stmt_destroy(join);
+ return res;
} else if (join->type == st_intersect) {
res =
stmt_intersect(stmt_push_down_head(stmt_dup(join->op1.stval), select),
stmt_push_down_head(stmt_dup(join->op2.stval), stmt_dup(select))
);
@@ -422,6 +444,10 @@
res = stmt_join(stmt_dup(join->op1.stval),
stmt_push_down_tail(stmt_dup(join->op2.stval), select), (comp_type) join->flag);
stmt_destroy(join);
return res;
+ } else if (join->type == st_join2) {
+ res = stmt_join2(stmt_dup(join->op1.stval),
stmt_push_down_tail(stmt_dup(join->op2.stval), select),
stmt_push_down_tail(stmt_dup(join->op3.stval), select), join->flag);
+ stmt_destroy(join);
+ return res;
} else if (join->type == st_intersect) {
select = stmt_dup(select);
res =
stmt_intersect(stmt_push_down_tail(stmt_dup(join->op1.stval), select),
stmt_push_down_tail(stmt_dup(join->op2.stval), select)
@@ -634,6 +660,13 @@
stmt_destroy(j);
return res;
+ } else if (j->type == st_join2) {
+ stmt *res = stmt_select2(stmt_dup(j->op1.stval),
+ stmt_dup(j->op2.stval),
+ stmt_dup(j->op3.stval),
+ j->flag);
+ stmt_destroy(j);
+ return res;
} else if (j->type == st_reverse) {
stmt *res = stmt_join2select(stmt_dup(j->op1.stval));
@@ -889,7 +922,7 @@
for (n = djoins->h; n; n = n->next) {
list *ejoins = list_select(joins, n->data, (fcmp)
&stmt_cmp_head_tail, (fdup) &stmt_dup);
stmt *join = ejoins->h->data;
- list *eqjoins = NULL, *nqjoins = NULL;
+ list *eqjoins = NULL, *nqjoins = NULL, *rjoins = NULL;
stmt *reljoin = NULL, *jdx = NULL;
node *hsel = NULL, *tsel = NULL;
node * jn;
@@ -903,12 +936,14 @@
stmt *jt = stmt_reverse(stmt_dup(j->op1.stval));
jn->data = stmt_join(jh, jt,
swap_compare((comp_type)j->flag));
stmt_destroy(j);
- } else if (STMT_BAT(j->op1.stval->type) &&
+ } else if (j->type == st_reljoin &&
+ STMT_BAT(j->op1.stval->type) &&
STMT_BAT(j->op2.stval->op1.stval->type) &&
- j->t == join->h &&
- j->type == st_reljoin) {
+ j->t == join->h) {
list *l1 = list_dup(j->op1.lval,
(fdup)&stmt_dup);
list *l2 = list_dup(j->op2.lval,
(fdup)&stmt_dup);
+ /* change order reljoin ? */
+ assert(0);
jn->data = stmt_reljoin2(l2,l1);
stmt_destroy(j);
}
@@ -1022,6 +1057,66 @@
}
list_destroy(eqjoins);
+ /* look for range join candidates (ie collect theta joins) */
+ rjoins = create_stmt_list();
+ while (list_length(nqjoins) > 1) {
+ node *n = nqjoins->h;
+ stmt *o1 = stmt_dup(n->data);
+
+ list_remove_node(nqjoins, n);
+ n = list_find(nqjoins, o1, (fcmp)&cmp_matching_column);
+ if (n) {
+ stmt *s, *o2 = stmt_dup(n->data);
+ sql_column *o1bc = basecolumn(o1->op1.stval);
+ sql_column *o2bc = basecolumn(o2->op1.stval);
+ int cmp = 0;
+
+ list_remove_node(nqjoins, n);
+ if (o1->flag > o2->flag){
+ s = o1;
+ o1 = o2;
+ o2 = s;
+ }
+ if (o1->flag == cmp_gt && o2->flag == cmp_lt)
+ cmp = 0;
+ else if (o1->flag == cmp_gt && o2->flag ==
cmp_lte)
+ cmp = 1;
+ else if (o1->flag == cmp_gte && o2->flag ==
cmp_lt)
+ cmp = 2;
+ else if (o1->flag == cmp_gte && o2->flag ==
cmp_lte)
+ cmp = 3;
+ else
+ assert(0);
+
+ if (o1bc && o2bc && o1bc == o2bc) {
+ s = stmt_join2(
+ stmt_dup(o1->op1.stval),
+
stmt_reverse(stmt_dup(o1->op2.stval)),
+
stmt_reverse(stmt_dup(o2->op2.stval)),
+ cmp);
+ } else {
+ s = stmt_join2(
+
stmt_reverse(stmt_dup(o1->op2.stval)),
+ /* we need to swap order too */
+ stmt_dup(o2->op1.stval),
+ stmt_dup(o1->op1.stval),
+ 3-cmp);
+ }
+ stmt_destroy(o1);
+ stmt_destroy(o2);
+ o1 = s;
+ }
+ list_append(rjoins, o1);
+ }
+ if (list_length(rjoins)) {
+ if (list_length(nqjoins) == 1)
+ list_append(rjoins, stmt_dup(nqjoins->h->data));
+ list_destroy(nqjoins);
+ nqjoins = rjoins;
+ } else {
+ list_destroy(rjoins);
+ }
+
/* re-add fk join index and multi-att equi-join to the
collection */
if (jdx)
list_append(nqjoins, jdx);
@@ -1445,6 +1540,7 @@
case st_union:
case st_outerjoin:
case st_join:
+ case st_join2:
case st_mirror:
case st_reverse:
case st_const:
-------------------------------------------------------------------------
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