Changeset: 4dfff2ed9d76 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4dfff2ed9d76
Modified Files:
        sql/server/rel_distribute.c
        sql/server/rel_dump.c
Branch: default
Log Message:

as last resort fallback to local (first) replica table (19 out of 22 now work 
(2 crash/1 mal problem)


diffs (89 lines):

diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c
--- a/sql/server/rel_distribute.c
+++ b/sql/server/rel_distribute.c
@@ -29,6 +29,23 @@
 #include "rel_updates.h"
 #include "sql_env.h"
 
+
+static sql_rel *
+rewrite_replica( mvc *sql, sql_rel *rel, sql_table *t, sql_table *p) 
+{
+       node *n, *m;
+       sql_rel *r = rel_basetable(sql, p, t->base.name);
+
+       for (n = rel->exps->h, m = r->exps->h; n && m; n = n->next, m = 
m->next) {
+               sql_exp *e = n->data;
+               sql_exp *ne = m->data;
+
+               exp_setname(sql->sa, ne, e->rname, e->name);
+       }
+       rel_destroy(rel);
+       return r;
+}
+
 static sql_rel *
 replica(mvc *sql, sql_rel *rel, char *uri) 
 {
@@ -48,22 +65,19 @@ replica(mvc *sql, sql_rel *rel, char *ur
                if (isReplicaTable(t)) {
                        node *n;
 
-                       /* replace by the replica which matches the uri */
-                       for (n = t->tables.set->h; n; n = n->next) {
-                               sql_table *p = n->data;
-
-                               if (isRemote(p) && strcmp(uri, p->query) == 0){
-                                       node *n, *m;
-                                       sql_rel *r = rel_basetable(sql, p, 
t->base.name);
-                                       for (n = rel->exps->h, m = r->exps->h; 
n && m; n = n->next, m = m->next) {
-                                               sql_exp *e = n->data;
-                                               sql_exp *ne = m->data;
-
-                                               exp_setname(sql->sa, ne, 
e->rname, e->name);
+                       if (uri) {
+                               /* replace by the replica which matches the uri 
*/
+                               for (n = t->tables.set->h; n; n = n->next) {
+                                       sql_table *p = n->data;
+       
+                                       if (isRemote(p) && strcmp(uri, 
p->query) == 0) {
+                                               rel = rewrite_replica(sql, rel, 
t, p);
+                                               break;
                                        }
-                                       rel_destroy(rel);
-                                       rel = r;
                                }
+                       } else { /* no match, use first */
+                               sql_table *p = t->tables.set->h->data;
+                               rel = rewrite_replica(sql, rel, t, p);
                        }
                }
        }
@@ -237,5 +251,6 @@ sql_rel *
 rel_distribute(mvc *sql, sql_rel *rel) 
 {
        rel = distribute(sql, rel);
+       rel = replica(sql, rel, NULL);
        return rel_remote_func(sql, rel);
 }
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -305,11 +305,15 @@ rel_print_(mvc *sql, stream  *fout, sql_
                print_indent(sql, fout, depth);
                if (t->s)
                        mnstr_printf(fout, "%s(%s.%s)", 
-                               isStream(t)?"stream":"table",
+                               isStream(t)?"stream":
+                               isRemote(t)?"REMOTE":
+                               isReplicaTable(t)?"REPLICA":"table",
                                t->s->base.name, t->base.name);
                else
                        mnstr_printf(fout, "%s(%s)", 
-                               isStream(t)?"stream":"table",
+                               isStream(t)?"stream":
+                               isRemote(t)?"REMOTE":
+                               isReplicaTable(t)?"REPLICA":"table",
                                t->base.name);
                if (rel->exps) 
                        exps_print(sql, fout, rel->exps, depth, 1, 0);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to