Changeset: 0f8f143a1df6 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0f8f143a1df6 Modified Files: sql/backends/monet5/rel_bin.c sql/include/sql_relation.h sql/server/rel_distribute.c sql/server/rel_dump.c sql/server/rel_exp.c sql/server/rel_graph.c sql/server/rel_optimizer.c sql/server/rel_partition.c sql/server/rel_rel.c sql/server/rel_select.c Branch: graph0 Log Message:
Split op_graph in op_graph_join and op_graph_select diffs (truncated from 529 to 300 lines): diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -1331,7 +1331,8 @@ rel2bin_args(backend *be, sql_rel *rel, case op_delete: args = rel2bin_args(be, rel->r, args); break; - case op_graph: + case op_graph_join: + case op_graph_select: assert(0 && "Not implemented yet"); // TODO: not handled } return args; @@ -4787,7 +4788,8 @@ subrel_bin(backend *be, sql_rel *rel, li case op_ddl: s = rel2bin_ddl(be, rel, refs); break; - case op_graph: + case op_graph_join: + case op_graph_select: assert(0 && "Not implemented yet"); // TODO: not handled } if (s && rel_is_ref(rel)) { @@ -5031,7 +5033,8 @@ rel_deps(sql_allocator *sa, sql_rel *r, exps_deps(sa, r->exps, refs, l); } break; - case op_graph: + case op_graph_join: + case op_graph_select: assert(0 && "Not implemented yet"); // TODO: not handled } if (r->exps) diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h --- a/sql/include/sql_relation.h +++ b/sql/include/sql_relation.h @@ -160,7 +160,8 @@ typedef enum operator_type { op_groupby, op_topn, op_sample, - op_graph, + op_graph_join, + op_graph_select, op_insert, /* insert(l=table, r insert expressions) */ op_update, /* update(l=table, r update expressions) */ op_delete, /* delete(l=table, r delete expression) */ @@ -229,9 +230,7 @@ typedef enum operator_type { #define is_sample(op) \ (op == op_sample) #define is_graph(op) \ - (op == op_graph) -#define is_join_like(op) \ - (is_join(op) || is_graph(op)) + (op == op_graph_join || op_graph_select) /* NO NIL semantics of aggr operations */ #define need_no_nil(e) \ 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 @@ -65,7 +65,8 @@ has_remote_or_replica( sql_rel *rel ) if (rel->r && has_remote_or_replica( rel->r )) return 1; break; - case op_graph: + case op_graph_join: + case op_graph_select: assert(0 && "Not implemented yet"); // TODO: not handled } return 0; @@ -177,7 +178,8 @@ replica(mvc *sql, sql_rel *rel, char *ur case op_delete: rel->r = replica(sql, rel->r, uri); break; - case op_graph: + case op_graph_join: + case op_graph_select: assert(0 && "Not implemented yet"); // TODO: not handled } return rel; @@ -274,7 +276,8 @@ distribute(mvc *sql, sql_rel *rel) case op_delete: rel->r = distribute(sql, rel->r); break; - case op_graph: + case op_graph_join: + case op_graph_select: assert(0 && "Not implemented yet"); // TODO: not handled } return rel; @@ -322,7 +325,8 @@ rel_remote_func(mvc *sql, sql_rel *rel) case op_delete: rel->r = rel_remote_func(sql, rel->r); break; - case op_graph: + case op_graph_join: + case op_graph_select: assert(0 && "Not implemented yet"); // TODO: not handled } if (find_prop(rel->p, PROP_REMOTE) != NULL) { 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 @@ -294,8 +294,10 @@ op2string(operator_type op) case op_update: case op_delete: return "modify op"; - case op_graph: - return "graph"; + case op_graph_join: + return "graph/2"; + case op_graph_select: + return "graph/1"; default: return "unknown"; } @@ -512,10 +514,10 @@ rel_print_(mvc *sql, stream *fout, sql_ if (rel->exps) exps_print(sql, fout, rel->exps, depth, 1, 0); } break; - case op_graph: { + case op_graph_join: { sql_graph *graph_ptr = (sql_graph*) rel; print_indent(sql, fout, depth, decorate); - mnstr_printf(fout, "graph"); + mnstr_printf(fout, "%s", op2string(rel->op)); if (rel_is_ref(rel->l)) { int nr = find_ref(refs, rel->l); print_indent(sql, fout, depth+1, decorate); @@ -615,7 +617,8 @@ rel_print_refs(mvc *sql, stream* fout, s list_append(refs, rel->r); } break; - case op_graph: + case op_graph_join: + case op_graph_select: { sql_graph* graph_ptr = (sql_graph*) rel; rel_print_refs(sql, fout, rel->l, depth, refs, decorate); 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 @@ -584,7 +584,7 @@ exp_graph(mvc *sql, list *l, list *r) sql_exp *e = exp_create(sql->sa, e_graph); e->l = l; e->r = r; - e->card = CARD_ATOM; + e->card = CARD_MULTI; return e; } @@ -1229,7 +1229,7 @@ rel_find_exp_( sql_rel *rel, sql_exp *e) case e_atom: return e; case e_graph: - assert(0 && "Not implemented yet"); + return NULL; } return ne; } @@ -1246,6 +1246,7 @@ rel_find_exp( sql_rel *rel, sql_exp *e) case op_full: case op_join: case op_apply: + case op_graph_join: ne = rel_find_exp(rel->l, e); if (!ne) ne = rel_find_exp(rel->r, e); diff --git a/sql/server/rel_graph.c b/sql/server/rel_graph.c --- a/sql/server/rel_graph.c +++ b/sql/server/rel_graph.c @@ -51,9 +51,8 @@ sql_rel* rel_graph_reaches(mvc *sql, sql symbol* sym_edges_from = NULL; // reference to the `edges from' column in the ast symbol* sym_edges_to = NULL; // ref to the `edges to' column in the ast sql_exp* efrom = NULL; // ref to the edges column `from' - sql_exp* eto= NULL; // ref to the edges column `to' + sql_exp* eto = NULL; // ref to the edges column `to' sql_subtype* exptype = NULL; // the expression type for all columns -// sql_exp* graph_join = NULL; // the produced predicate for the join exp_kind exp_kind_value = {type_value, card_column, TRUE}; sql_graph* graph_ptr = NULL; // the created operator sql_exp* exp_ptr = NULL; // the created expression ( x reaches y ) @@ -77,6 +76,10 @@ sql_rel* rel_graph_reaches(mvc *sql, sql if(!qfrom) return NULL; // cannot refer to qfrom qto = rel_value_exp(sql, &rel, sym_qto, context, exp_kind_value); if(!qto) return NULL; // cannot refer to qto + // TODO: to be handled with graph_select + if(qfrom->card != CARD_MULTI || qto->card != CARD_MULTI){ + return sql_error(sql, 42, "["__FILE__ ":%d] select/filter syntax not implemented yet", __LINE__); + } // edges table lstoperands = lstoperands->next; @@ -113,13 +116,13 @@ sql_rel* rel_graph_reaches(mvc *sql, sql memset(graph_ptr, 0, sizeof(sql_graph)); result = (sql_rel*) graph_ptr; sql_ref_init(&result->ref); - result->op = op_graph; + result->op = op_graph_select; result->l = rel; exp_ptr = (sql_exp*) sa_alloc(sql->sa, sizeof(sql_exp)); if(!exp_ptr) { return sql_error(sql, 03, "Cannot allocate sql_exp [e_graph] "); } memset(exp_ptr, 0, sizeof(sql_exp)); exp_ptr->type = e_graph; - exp_ptr->card = CARD_ATOM; // it shouldn't matter + exp_ptr->card = CARD_MULTI; exp_ptr->l = sa_list(sql->sa); list_append(exp_ptr->l, qfrom); exp_ptr->r = sa_list(sql->sa); @@ -138,7 +141,7 @@ sql_rel* rel_graph_reaches(mvc *sql, sql // let us see if what we are creating makes sense printf("[Semantic analysis] Output relation: %s\n", rel2str1(sql, result)); - return result; + return rel; } /***************************************************************************** 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 @@ -156,7 +156,8 @@ name_find_column( sql_rel *rel, char *rn case op_update: case op_delete: break; - case op_graph: + case op_graph_join: + case op_graph_select: assert(0 && "Not implemented yet"); // TODO: not handled } if (alias) { /* we found an expression with the correct name, but @@ -259,7 +260,8 @@ rel_properties(mvc *sql, global_props *g if (rel->r) rel_properties(sql, gp, rel->r); break; - case op_graph: { + case op_graph_join: + case op_graph_select: { sql_graph* graph_ptr = (sql_graph*) rel; // propagate rel_properties(sql, gp, rel->l); @@ -300,7 +302,8 @@ rel_properties(mvc *sql, global_props *g case op_delete: case op_ddl: break; - case op_graph: + case op_graph_join: + case op_graph_select: break; } } @@ -1106,7 +1109,8 @@ rel_join_order(mvc *sql, sql_rel *rel) rel->l = rel_join_order(sql, rel->l); rel->r = rel_join_order(sql, rel->r); break; - case op_graph: + case op_graph_join: + case op_graph_select: assert(0 && "Not implemented yet"); // TODO: not handled } if (is_join(rel->op) && rel->exps && !rel_is_ref(rel)) { @@ -3886,6 +3890,7 @@ rel_push_select_down(int *changes, mvc * if (rel_is_ref(rel->l) && rel->l == rel_find_ref(r->r)){ sql_rel *lx = rel->l; sql_rel *rx = r->r; + // TODO: maybe it needs to be handled for graphs as well. It needs an use case where this rule fires if (lx->ref.refcnt == 2 && !rel_is_ref(rx)) { while (rx->l && !rel_is_ref(rx->l) && (is_project(rx->op) || @@ -3911,6 +3916,7 @@ rel_push_select_down(int *changes, mvc * if (is_select(rel->op) && r && (is_join(r->op) || is_apply(r->op)) && !(rel_is_ref(r))) { sql_rel *jl = r->l; sql_rel *jr = r->r; + // booleans, can we push down in the lhs and rhs? int left = r->op == op_join || r->op == op_left; int right = r->op == op_join || r->op == op_right; @@ -5378,10 +5384,10 @@ rel_remove_join(int *changes, mvc *sql, static sql_rel * rel_push_project_up(int *changes, mvc *sql, sql_rel *rel) { - const int is_join_like = is_join_like(rel->op); + const int is_join_like = is_join(rel->op) || rel->op == op_graph_join; /* project/project cleanup is done later */ - if (is_join_like || is_select(rel->op)) { + if (is_join(rel->op) || is_select(rel->op) || is_graph(rel->op)) { node *n; list *exps = NULL, *l_exps, *r_exps; sql_rel *l = rel->l; @@ -5400,7 +5406,7 @@ rel_push_project_up(int *changes, mvc *s return rel; // Same for graphs, avoid the infinite recursion O.o' - if(rel->op == op_graph && ((l->op != op_project) || + if(is_graph(rel->op) && ((l->op != op_project) || (r && r->op != op_project) || (r && rel_is_ref(r)))) return rel; @@ -5430,7 +5436,7 @@ rel_push_project_up(int *changes, mvc *s _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list