Changeset: e0336b070c70 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e0336b070c70
Modified Files:
        sql/backends/monet5/rel_physical.c
        sql/server/rel_optimize_join.c
        sql/server/rel_optimizer_private.h
        sql/server/rel_rel.c
Branch: default
Log Message:

fixed detection of fk joins


diffs (82 lines):

diff --git a/sql/backends/monet5/rel_physical.c 
b/sql/backends/monet5/rel_physical.c
--- a/sql/backends/monet5/rel_physical.c
+++ b/sql/backends/monet5/rel_physical.c
@@ -553,6 +553,8 @@ rel_probehash(visitor *v, sql_rel *rel, 
 {
        /* todo inplace for hash sharing */
        sql_rel *r = rel_create(v->sql->sa);
+       r->lunique = rel->lunique;
+       r->runique = rel->runique;
        if (0 && rel_is_ref(rel)) {
                sql_rel *l = r;
                *l = *rel;
@@ -588,6 +590,8 @@ rel_buildhash(visitor *v, sql_rel *rel, 
        }
        /* Inplace for hash sharing */
        sql_rel *r = rel_create(v->sql->sa);
+       r->lunique = rel->lunique;
+       r->runique = rel->runique;
        if (0 && rel_is_ref(rel)) {
                sql_rel *l = r;
                *l = *rel;
diff --git a/sql/server/rel_optimize_join.c b/sql/server/rel_optimize_join.c
--- a/sql/server/rel_optimize_join.c
+++ b/sql/server/rel_optimize_join.c
@@ -1899,6 +1899,9 @@ find_fk( mvc *sql, list *rels, list *exp
 static sql_rel *
 rel_join_use_fk(visitor *v, sql_rel *rel)
 {
+       /* Don't look at the same relation twice */
+       if (are_fkeys_found(rel->used))
+               return rel;
        if ((is_semi(rel->op)) && !list_empty(rel->exps)) {
                list *exps = rel->exps;
                list *rels = sa_list(v->sql->sa);
@@ -1929,12 +1932,10 @@ rel_join_use_fk(visitor *v, sql_rel *rel
                list *rels = sa_list(ta);
                get_relations(v, rel, rels);
                /* mark done */
-               if (v->opt > 0)
-                       for (node *rn = rels->h; rn; rn = rn->next) {
-                               sql_rel *r = rn->data;
-                               r->opt = v->opt;
-                       }
-
+               for (node *rn = rels->h; rn; rn = rn->next) {
+                       sql_rel *r = rn->data;
+                       r->used |= fkeys_found;
+               }
 
                if (list_length(rels) > 1) {
                        find_fk( v->sql, rels, exps);
diff --git a/sql/server/rel_optimizer_private.h 
b/sql/server/rel_optimizer_private.h
--- a/sql/server/rel_optimizer_private.h
+++ b/sql/server/rel_optimizer_private.h
@@ -47,6 +47,7 @@ typedef struct sql_optimizer {
 #define rewrite_gt_zero_used      (1 << 5)
 #define unnest_used                              (1 << 6)
 #define rewrite_physical_used     (1 << 7)
+#define fkeys_found                          (1 << 8)
 
 #define is_rewrite_fix_count_used(X)    ((X & rewrite_fix_count_used) == 
rewrite_fix_count_used)
 #define is_rewrite_values_used(X)       ((X & rewrite_values_used) == 
rewrite_values_used)
@@ -56,6 +57,7 @@ typedef struct sql_optimizer {
 #define is_rewrite_gt_zero_used(X)      ((X & rewrite_gt_zero_used) == 
rewrite_gt_zero_used)
 #define is_unnest_used(X)                          ((X & unnest_used) == 
unnest_used)
 #define is_physical_done(X)                            ((X & 
rewrite_physical_used) == rewrite_physical_used)
+#define are_fkeys_found(X)                             ((X & fkeys_found) == 
fkeys_found)
 
 /* At the moment the following optimizers 'packs' can be disabled,
    later we could disable individual optimizers from the 'pack' */
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -1214,6 +1214,8 @@ rel_project(allocator *sa, sql_rel *l, l
        rel->exps = e;
        rel->card = exps_card(e);
        if (l) {
+               rel->lunique = l->lunique;
+               rel->runique = l->runique;
                rel->card = l->card;
                if (e)
                        rel->nrcols = list_length(e);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to