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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list