Changeset: 596d312170a0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/596d312170a0
Modified Files:
sql/server/rel_distribute.c
Branch: default
Log Message:
Using iterator to rewrite remote and replica tables, later more optimizations
can be done here
diffs (truncated from 647 to 300 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
@@ -24,14 +24,11 @@ has_remote_or_replica( sql_rel *rel )
case op_basetable: {
sql_table *t = rel->l;
- if (t && (isReplicaTable(t) || isRemote(t)))
- return 1;
- break;
+ return t && (isReplicaTable(t) || isRemote(t));
}
case op_table:
if (IS_TABLE_PROD_FUNC(rel->flag) || rel->flag ==
TABLE_FROM_RELATION)
- if (has_remote_or_replica( rel->l ))
- return 1;
+ return has_remote_or_replica( rel->l );
break;
case op_join:
case op_left:
@@ -45,35 +42,23 @@ has_remote_or_replica( sql_rel *rel )
case op_inter:
case op_except:
case op_merge:
- if (has_remote_or_replica( rel->l ) ||
- has_remote_or_replica( rel->r ))
- return 1;
- break;
+
+ case op_insert:
+ case op_update:
+ case op_delete:
+ return has_remote_or_replica( rel->l ) ||
has_remote_or_replica( rel->r );
case op_project:
case op_select:
case op_groupby:
case op_topn:
case op_sample:
case op_truncate:
- if (has_remote_or_replica( rel->l ))
- return 1;
- break;
+ return has_remote_or_replica( rel->l );
case op_ddl:
- if (rel->flag == ddl_output || rel->flag == ddl_create_seq ||
rel->flag == ddl_alter_seq /*|| rel->flag == ddl_alter_table || rel->flag ==
ddl_create_table || rel->flag == ddl_create_view*/) {
- if (has_remote_or_replica( rel->l ))
- return 1;
- } else if (rel->flag == ddl_list || rel->flag == ddl_exception)
{
- if (has_remote_or_replica( rel->l ) ||
- has_remote_or_replica( rel->r ))
- return 1;
- }
- break;
- case op_insert:
- case op_update:
- case op_delete:
- if (has_remote_or_replica( rel->l ) ||
- has_remote_or_replica( rel->r ))
- return 1;
+ if (rel->flag == ddl_output || rel->flag == ddl_create_seq ||
rel->flag == ddl_alter_seq /*|| rel->flag == ddl_alter_table || rel->flag ==
ddl_create_table || rel->flag == ddl_create_view*/)
+ return has_remote_or_replica( rel->l );
+ if (rel->flag == ddl_list || rel->flag == ddl_exception)
+ return has_remote_or_replica( rel->l ) ||
has_remote_or_replica( rel->r );
break;
}
return 0;
@@ -112,91 +97,20 @@ rewrite_replica( mvc *sql, sql_rel *rel,
/* set_remote() */
if (remote_prop && p && isRemote(p)) {
char *local_name = sa_strconcat(sql->sa, sa_strconcat(sql->sa,
p->s->base.name, "."), p->base.name);
- if (!local_name) {
- return NULL;
- }
prop *p = r->p = prop_create(sql->sa, PROP_REMOTE, r->p);
- if (!p) {
- return NULL;
- }
-
p->value = local_name;
}
return r;
}
-static list * exps_replica(mvc *sql, list *exps, char *uri) ;
-static sql_rel * replica(mvc *sql, sql_rel *rel, char *uri);
-
-static sql_exp *
-exp_replica(mvc *sql, sql_exp *e, char *uri)
+static sql_rel *
+replica(visitor *v, sql_rel *rel)
{
- switch(e->type) {
- case e_column:
- break;
- case e_atom:
- if (e->f)
- e->f = exps_replica(sql, e->f, uri);
- break;
- case e_convert:
- e->l = exp_replica(sql, e->l, uri);
- break;
- case e_aggr:
- case e_func:
- e->l = exps_replica(sql, e->l, uri);
- e->r = exps_replica(sql, e->r, uri);
- break;
- case e_cmp:
- if (e->flag == cmp_or || e->flag == cmp_filter) {
- e->l = exps_replica(sql, e->l, uri);
- e->r = exps_replica(sql, e->r, uri);
- } else if (e->flag == cmp_in || e->flag == cmp_notin) {
- e->l = exp_replica(sql, e->l, uri);
- e->r = exps_replica(sql, e->r, uri);
- } else {
- e->l = exp_replica(sql, e->l, uri);
- e->r = exps_replica(sql, e->r, uri);
- if (e->f)
- e->f = exps_replica(sql, e->f, uri);
- }
- break;
- case e_psm:
- if (e->flag & PSM_SET || e->flag & PSM_RETURN || e->flag &
PSM_EXCEPTION) {
- e->l = exp_replica(sql, e->l, uri);
- } else if (e->flag & PSM_WHILE || e->flag & PSM_IF) {
- e->l = exp_replica(sql, e->l, uri);
- e->r = exps_replica(sql, e->r, uri);
- if (e->f)
- e->f = exps_replica(sql, e->f, uri);
- } else if (e->flag & PSM_REL) {
- e->l = replica(sql, e->l, uri);
- }
- break;
- }
- return e;
-}
-
-static list *
-exps_replica(mvc *sql, list *exps, char *uri)
-{
- node *n;
-
- if (!exps)
- return exps;
- for( n = exps->h; n; n = n->next)
- n->data = exp_replica(sql, n->data, uri);
- return exps;
-}
-
-static sql_rel *
-replica(mvc *sql, sql_rel *rel, char *uri)
-{
- if (!rel)
- return rel;
-
+ const char *uri = v->data;
+
if (rel_is_ref(rel)) {
if (has_remote_or_replica(rel)) {
- sql_rel *nrel = rel_copy(sql, rel, 1);
+ sql_rel *nrel = rel_copy(v->sql, rel, 1);
rel_destroy(rel);
rel = nrel;
@@ -204,170 +118,53 @@ replica(mvc *sql, sql_rel *rel, char *ur
return rel;
}
}
- switch (rel->op) {
- case op_basetable: {
+ if (is_basetable(rel->op)) {
sql_table *t = rel->l;
- if (t && isReplicaTable(t)) {
- node *n;
-
+ if (t && isReplicaTable(t) && !list_empty(t->members)) {
if (uri) {
/* replace by the replica which matches the uri
*/
- for (n = t->members->h; n; n = n->next) {
+ for (node *n = t->members->h; n; n = n->next) {
sql_part *p = n->data;
- sql_table *pt =
find_sql_table_id(sql->session->tr, t->s, p->member);
+ sql_table *pt =
find_sql_table_id(v->sql->session->tr, t->s, p->member);
if (isRemote(pt) && strcmp(uri,
pt->query) == 0) {
- rel = rewrite_replica(sql, rel,
t, p, 0);
+ rel = rewrite_replica(v->sql,
rel, t, p, 0);
break;
}
}
} else { /* no match, find one without remote or use
first */
- if (t->members) {
- int fnd = 0;
- sql_part *p;
- for (n = t->members->h; n; n = n->next)
{
- sql_part *p = n->data;
- sql_table *pt =
find_sql_table_id(sql->session->tr, t->s, p->member);
+ int fnd = 0;
+ sql_part *p;
+ for (node *n = t->members->h; n; n = n->next) {
+ sql_part *p = n->data;
+ sql_table *pt =
find_sql_table_id(v->sql->session->tr, t->s, p->member);
- if (!isRemote(pt)) {
- fnd = 1;
- rel =
rewrite_replica(sql, rel, t, p, 0);
- break;
- }
+ if (!isRemote(pt)) {
+ fnd = 1;
+ rel = rewrite_replica(v->sql,
rel, t, p, 0);
+ break;
}
- if (!fnd) {
- p = t->members->h->data;
- rel = rewrite_replica(sql, rel,
t, p, 1);
- }
- } else {
- rel = NULL;
+ }
+ if (!fnd) {
+ p = t->members->h->data;
+ rel = rewrite_replica(v->sql, rel, t,
p, 1);
}
}
}
- } break;
- case op_table:
- if (IS_TABLE_PROD_FUNC(rel->flag) || rel->flag ==
TABLE_FROM_RELATION)
- rel->l = replica(sql, rel->l, uri);
- break;
- case op_join:
- case op_left:
- case op_right:
- case op_full:
-
- case op_semi:
- case op_anti:
-
- case op_union:
- case op_inter:
- case op_except:
- case op_merge:
- rel->l = replica(sql, rel->l, uri);
- rel->r = replica(sql, rel->r, uri);
- break;
- case op_project:
- case op_select:
- case op_groupby:
- case op_topn:
- case op_sample:
- case op_truncate:
- rel->l = replica(sql, rel->l, uri);
- break;
- case op_ddl:
- if ((rel->flag == ddl_psm || rel->flag == ddl_exception) &&
rel->exps)
- rel->exps = exps_replica(sql, rel->exps, uri);
- if (rel->flag == ddl_output || rel->flag == ddl_create_seq ||
rel->flag == ddl_alter_seq /*|| rel->flag == ddl_alter_table || rel->flag ==
ddl_create_table || rel->flag == ddl_create_view*/) {
- rel->l = replica(sql, rel->l, uri);
- } else if (rel->flag == ddl_list || rel->flag == ddl_exception)
{
- rel->l = replica(sql, rel->l, uri);
- rel->r = replica(sql, rel->r, uri);
- }
- break;
- case op_insert:
- case op_update:
- case op_delete:
- rel->l = replica(sql, rel->l, uri);
- rel->r = replica(sql, rel->r, uri);
- break;
}
return rel;
}
-static list * exps_distribute(mvc *sql, list *exps) ;
-static sql_rel * distribute(mvc *sql, sql_rel *rel);
-
-static sql_exp *
-exp_distribute(mvc *sql, sql_exp *e)
+static sql_rel *
+distribute(visitor *v, sql_rel *rel)
{
- switch(e->type) {
- case e_column:
- break;
- case e_atom:
- if (e->f)
- e->f = exps_distribute(sql, e->f);
- break;
- case e_convert:
- e->l = exp_distribute(sql, e->l);
- break;
- case e_aggr:
- case e_func:
- e->l = exps_distribute(sql, e->l);
- e->r = exps_distribute(sql, e->r);
- break;
- case e_cmp:
- if (e->flag == cmp_or || e->flag == cmp_filter) {
- e->l = exps_distribute(sql, e->l);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list