Changeset: afb50f02a146 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=afb50f02a146
Modified Files:
        sql/server/rel_optimizer.c
        sql/test/BugTracker-2012/Tests/All
Branch: Oct2012
Log Message:

only use hash index when joining over 2 tables


diffs (91 lines):

diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -173,6 +173,7 @@ exp_find_column_( sql_rel *rel, sql_exp 
        return NULL;
 }
 
+/* find column for the select/join expression */
 static sql_column *
 sjexp_col(sql_exp *e, sql_rel *r) 
 {
@@ -728,7 +729,7 @@ order_joins(mvc *sql, list *rels, list *
                /* complex expressions may touch multiple base tables 
                 * Should be pushed up to extra selection.
                 * */
-               if (cje->type != e_cmp || !is_complex_exp(cje->flag) /*||
+               if (cje->type != e_cmp || !is_complex_exp(cje->flag) || 
!find_prop(cje->p, PROP_HASHCOL) /*||
                   (cje->type == e_cmp && cje->f == NULL)*/) {
                        l = find_one_rel(rels, cje->l);
                        r = find_one_rel(rels, cje->r);
@@ -4679,6 +4680,7 @@ find_index(sql_allocator *sa, sql_rel *r
        /* Depending on the index type we should (in the rel_bin) generate
           more code, ie for spatial index add post filter etc, for hash
           compute hash value and use index */
+
        if (sub->exps && rel->exps) 
        for(n = sub->exps->h; n; n = n->next) {
                prop *p;
@@ -4699,6 +4701,8 @@ find_index(sql_allocator *sa, sql_rel *r
                        /* now we obtain the columns, move into 
sql_column_kc_cmp! */
                        cols = list_map(exps, sub, (fmap) &sjexp_col);
 
+                       /* TODO check that at most 2 relations are involved */
+
                        /* Match the index columns with the expression columns. 
                           TODO, Allow partial matches ! */
                        if (list_match(cols, i->columns, cmp) == 0) {
@@ -4747,20 +4751,34 @@ rel_use_index(int *changes, mvc *sql, sq
                if (i) {
                        prop *p;
                        node *n;
+                       int single_table = 1;
+                       sql_exp *re = NULL;
        
-                       /* add PROP_HASHCOL to all column exps */
-                       for( n = exps->h; n; n = n->next) { 
+                       for( n = exps->h; n && single_table; n = n->next) { 
                                sql_exp *e = n->data;
-
-                               /* swapped ? */
+                               sql_exp *nre = e->r;
+
                                if (is_join(rel->op) && 
-                                        ((left && !rel_find_exp(rel->l, e->l)) 
||
-                                        (!left && !rel_find_exp(rel->r, 
e->l)))) 
-                                       n->data = e = exp_compare(sql->sa, 
e->r, e->l, cmp_equal);
-                               p = find_prop(e->p, PROP_HASHCOL);
-                               if (!p)
-                                       e->p = p = prop_create(sql->sa, 
PROP_HASHCOL, e->p);
-                               p->value = i;
+                                       ((left && !rel_find_exp(rel->l, e->l)) 
||
+                                       (!left && !rel_find_exp(rel->r, 
e->l)))) 
+                                       nre = e->l;
+                               single_table = (re && !exps_match_col_exps(nre, 
re));
+                               re = nre;
+                       }
+                       if (single_table) { /* add PROP_HASHCOL to all column 
exps */
+                               for( n = exps->h; n; n = n->next) { 
+                                       sql_exp *e = n->data;
+
+                                       /* swapped ? */
+                                       if (is_join(rel->op) && 
+                                               ((left && !rel_find_exp(rel->l, 
e->l)) ||
+                                               (!left && !rel_find_exp(rel->r, 
e->l)))) 
+                                               n->data = e = 
exp_compare(sql->sa, e->r, e->l, cmp_equal);
+                                       p = find_prop(e->p, PROP_HASHCOL);
+                                       if (!p)
+                                               e->p = p = prop_create(sql->sa, 
PROP_HASHCOL, e->p);
+                                       p->value = i;
+                               }
                        }
                        /* add the remaining exps to the new exp list */
                        if (list_length(rel->exps) > list_length(exps)) {
diff --git a/sql/test/BugTracker-2012/Tests/All 
b/sql/test/BugTracker-2012/Tests/All
--- a/sql/test/BugTracker-2012/Tests/All
+++ b/sql/test/BugTracker-2012/Tests/All
@@ -56,3 +56,4 @@ timestamp-diff.Bug-3190
 string-insert-default-null-crash.Bug-3168
 case_evaluated_too_early.Bug-3186
 recursive_optimizer.Bug-3191
+join_over_multitable_using_index.Bug-3181
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to