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]