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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list