Changeset: 59f7eaf1fc20 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=59f7eaf1fc20 Modified Files: sql/server/rel_distribute.c sql/server/rel_exp.c sql/server/rel_optimizer.c sql/server/rel_propagate.c sql/server/rel_rel.c sql/server/rel_unnest.c sql/server/sql_partition.c Branch: default Log Message:
More define lines for ->f atoms, ie lists of atoms diffs (truncated from 303 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 @@ -132,7 +132,10 @@ exp_replica(mvc *sql, sql_exp *e, char * { 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); @@ -298,7 +301,10 @@ exp_distribute(mvc *sql, sql_exp *e) { 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); @@ -525,7 +531,10 @@ exp_remote_func(mvc *sql, sql_exp *e) { switch(e->type) { case e_column: + break; case e_atom: + if (e->f) + e->f = exps_remote_func(sql, e->f); break; case e_convert: e->l = exp_remote_func(sql, e->l); diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c --- a/sql/server/rel_exp.c +++ b/sql/server/rel_exp.c @@ -1350,6 +1350,8 @@ exp_match_exp( sql_exp *e1, sql_exp *e2) case e_atom: if (e1->l && e2->l && !atom_cmp(e1->l, e2->l)) return 1; + if (e1->f && e2->f && exps_equal(e1->f, e2->f)) + return 1; break; default: break; @@ -1420,28 +1422,37 @@ static int exp_is_complex_select( sql_exp *e ) { switch (e->type) { - case e_atom: + case e_atom: { + if (e->f) { + int r = (e->card == CARD_ATOM); + list *l = e->f; + + if (r) + for (node *n = l->h; n && !r; n = n->next) + r |= exp_is_complex_select(n->data); + return r; + } return 0; + } case e_convert: return exp_is_complex_select(e->l); case e_func: case e_aggr: { int r = (e->card == CARD_ATOM); - node *n; list *l = e->l; if (r && l) - for (n = l->h; n && !r; n = n->next) + for (node *n = l->h; n && !r; n = n->next) r |= exp_is_complex_select(n->data); return r; } + case e_psm: + return 1; case e_column: case e_cmp: default: return 0; - case e_psm: - return 1; } } @@ -2263,6 +2274,8 @@ exp_has_func(sql_exp *e) return 0; switch (e->type) { case e_atom: + if (e->f) + return exps_have_func(e->f); return 0; case e_convert: return exp_has_func(e->l); @@ -2316,6 +2329,9 @@ exp_has_sideeffect( sql_exp *e ) return 0; } case e_atom: + if (e->f) + return exps_has_sideeffect(e->f); + return 0; case e_aggr: case e_cmp: case e_column: @@ -2360,8 +2376,12 @@ exp_unsafe(sql_exp *e, int allow_identit return exp_unsafe(e->l, allow_identity) || exp_unsafe(e->r, allow_identity) || (e->f && exp_unsafe(e->f, allow_identity)); } } break; + case e_atom: { + if (e->f) + return exps_have_unsafe(e->f, allow_identity); + return 0; + } break; case e_column: - case e_atom: case e_psm: return 0; } diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -233,8 +233,11 @@ psm_exp_properties(mvc *sql, global_prop { /* only functions need fix up */ switch(e->type) { + case e_column: + break; case e_atom: - case e_column: + if (e->f) + psm_exps_properties(sql, gp, e->f); break; case e_convert: psm_exp_properties(sql, gp, e->l); @@ -1429,13 +1432,15 @@ exp_needs_push_down(sql_exp *e) case e_convert: return exp_needs_push_down(e->l); case e_aggr: - case e_func: { + case e_func: if (!e->l || exps_are_atoms(e->l)) return 0; return 1; - } break; + case e_atom: + if (!e->f || exps_are_atoms(e->f)) + return 0; + return 1; case e_column: - case e_atom: default: return 0; } @@ -1514,7 +1519,10 @@ exp_push_single_func_down(visitor *v, sq v->changes++; } } break; - case e_atom: + case e_atom: { + if (e->f && (e->f = exps_push_single_func_down(v, rel, l, r, e->f, depth + 1)) == NULL) + return NULL; + } break; case e_column: case e_psm: break; @@ -2778,6 +2786,8 @@ exp_shares_exps(sql_exp *e, list *shared else return exp_shares_exps(e->l, shared, uses) || exp_shares_exps(e->r, shared, uses) || (e->f && exp_shares_exps(e->f, shared, uses)); case e_atom: + if (e->f) + return exps_shares_exps(e->f, shared, uses); return false; case e_column: { @@ -4030,8 +4040,11 @@ exp_uses_exp(sql_exp *e, const char *rna switch (e->type) { case e_psm: - case e_atom: break; + case e_atom: { + if (e->f) + return list_exps_uses_exp(e->f, rname, name); + } break; case e_convert: return exp_uses_exp(e->l, rname, name); case e_column: { @@ -6219,8 +6232,11 @@ split_aggr_and_project(mvc *sql, list *a case e_func: list_split_aggr_and_project(sql, aexps, e->l); return e; + case e_atom: + if (e->f) + list_split_aggr_and_project(sql, aexps, e->f); + return e; case e_column: /* constants and columns shouldn't be rewriten */ - case e_atom: case e_psm: return e; } @@ -7949,8 +7965,11 @@ split_exp(mvc *sql, sql_exp *e, sql_rel e->f = split_exp(sql, e->f, rel); } return e; + case e_atom: + if (e->f) + split_exps(sql, e->f, rel); + return e; case e_psm: - case e_atom: return e; } return e; @@ -8067,8 +8086,11 @@ select_split_exp(mvc *sql, sql_exp *e, s e->f = select_split_exp(sql, e->f, rel); } return e; + case e_atom: + if (e->f) + select_split_exp(sql, e->f, rel); + return e; case e_psm: - case e_atom: return e; } return e; diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c --- a/sql/server/rel_propagate.c +++ b/sql/server/rel_propagate.c @@ -476,8 +476,11 @@ exp_change_column_table(mvc *sql, sql_ex case e_convert: { e->l = exp_change_column_table(sql, e->l, oldt, newt); } break; - case e_atom: - break; + case e_atom: { + if (e->f) + for (node *n = ((list*)e->f)->h ; n ; n = n->next) + n->data = exp_change_column_table(sql, (sql_exp*) n->data, oldt, newt); + } break; case e_aggr: case e_func: { if (e->l) 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 @@ -1663,7 +1663,11 @@ exp_deps(mvc *sql, sql_exp *e, list *ref sql_rel *rel = e->l; return rel_deps(sql, rel, refs, l); } + break; case e_atom: + if (e->f && exp_deps(sql, e->f, refs, l) != 0) + return -1; + break; case e_column: break; case e_convert: @@ -2296,6 +2300,9 @@ rel_rebind_exp(mvc *sql, sql_rel *rel, s case e_column: return rel_find_exp(rel, e) != NULL; case e_atom: + if (e->f) + return exps_rebind_exp(sql, rel, e->f); + return true; case e_psm: return true; } diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -237,6 +237,8 @@ exp_only_freevar(sql_query *query, sql_e rel_only_freevar(query, e->l, arguments_correlated, found_one_freevar, ungrouped_cols); break; case e_atom: + if (e->f) + exps_only_freevar(query, e->f, arguments_correlated, found_one_freevar, ungrouped_cols); break; case e_column: *arguments_correlated = 0; diff --git a/sql/server/sql_partition.c b/sql/server/sql_partition.c --- a/sql/server/sql_partition.c +++ b/sql/server/sql_partition.c @@ -188,8 +188,11 @@ exp_find_table_columns(mvc *sql, sql_exp case e_convert: { exp_find_table_columns(sql, e->l, t, cols); } break; - case e_atom: - break; + case e_atom: { + if (e->f) + for (node *n = ((list*)e->f)->h ; n ; n = n->next) + exp_find_table_columns(sql, (sql_exp*) n->data, t, cols); + } break; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list