Changeset: 7d1515b0afe0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7d1515b0afe0
Modified Files:
sql/backends/monet5/rel_bin.c
sql/server/rel_distribute.c
sql/server/rel_dump.c
sql/server/rel_graph.c
sql/server/rel_optimizer.c
Branch: graph0
Log Message:
SEMA: accept atoms as vertices
diffs (185 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
@@ -4820,9 +4820,12 @@ rel2bin_graph(backend *be, sql_rel* rel,
// printf("[rel2bin_graph] input: %s\n", dump_rel(sql, rel)); // DEBUG ONLY
// first construct the depending relations
- left = subrel_bin(be, rel->l, refs);
- if(!left) return NULL; // error
+ if(rel->l != NULL) {
+ left = subrel_bin(be, rel->l, refs);
+ if(!left) return NULL; // error
+ }
if(rel->op == op_graph_join) {
+ assert(rel->l != NULL && rel->r != NULL && "Missing the table
expressions to join");
right = subrel_bin(be, rel->r, refs);
if(!right) return NULL; // error
}
@@ -4876,12 +4879,14 @@ rel2bin_graph(backend *be, sql_rel* rel,
// right might be null, that's ok
stmt* s = exp_bin(be, n->data, left, right, NULL, NULL,
NULL, NULL);
if(!s) return NULL; // error
+ s = column(be, s); // scalar -> column [ scalar ]
list_append(lhs, s);
}
// repeat for the rhs
for(node *n = ((list*)graph_exp->r)->h; n; n = n->next){
stmt* s = exp_bin(be, n->data, left, right, NULL, NULL,
NULL, NULL);
if(!s) return NULL; // error
+ s = column(be, s); // scalar -> column [ scalar ]
list_append(rhs, s);
}
@@ -4954,14 +4959,16 @@ rel2bin_graph(backend *be, sql_rel* rel,
int op_out_index = 2;
// start with the lhs
- jl = stmt_result(be, spfw, 0);
- for(node* n = left->op4.lval->h; n; n = n->next ) {
- stmt *c = n->data;
- const char *rnme = table_name(sql->sa, c);
- const char *nme = column_name(sql->sa, c);
- stmt *s = stmt_project(be, jl, column(be, c));
- s = stmt_alias(be, s, rnme, nme);
- list_append(lst1, s);
+ if(left != NULL) {
+ jl = stmt_result(be, spfw, 0);
+ for(node* n = left->op4.lval->h; n; n = n->next ) {
+ stmt *c = n->data;
+ const char *rnme = table_name(sql->sa, c);
+ const char *nme = column_name(sql->sa, c);
+ stmt *s = stmt_project(be, jl, column(be, c));
+ s = stmt_alias(be, s, rnme, nme);
+ list_append(lst1, s);
+ }
}
// repeat with the rhs
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
@@ -297,7 +297,7 @@ distribute(mvc *sql, sql_rel *rel)
r = rel->r = distribute(sql, rel->r);
g = graph_ptr->edges = distribute(sql, graph_ptr->edges);
- pl = find_prop(l->p, PROP_REMOTE);
+ pl = rel->l != NULL ? find_prop(l->p, PROP_REMOTE) : NULL;
if(rel->op == op_graph_join)
pr = find_prop(r->p, PROP_REMOTE);
else
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
@@ -543,12 +543,14 @@ rel_print_(mvc *sql, stream *fout, sql_
sql_graph *graph_ptr = (sql_graph*) rel;
print_indent(sql, fout, depth, decorate);
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);
- mnstr_printf(fout, "& REF %d ", nr);
- } else
- rel_print_(sql, fout, rel->l, depth+1, refs, decorate);
+ if(rel->l){ // address the case SELECT 1 WHERE x REACHES y ...
+ if (rel_is_ref(rel->l)) {
+ int nr = find_ref(refs, rel->l);
+ print_indent(sql, fout, depth+1, decorate);
+ mnstr_printf(fout, "& REF %d ", nr);
+ } else
+ rel_print_(sql, fout, rel->l, depth+1, refs,
decorate);
+ }
if (rel->r) {
assert(rel->op == op_graph_join && "Expected join
semantics when a rhs is present");
if (rel_is_ref(rel->r)) {
@@ -558,6 +560,7 @@ rel_print_(mvc *sql, stream *fout, sql_
} else
rel_print_(sql, fout, rel->r, depth+1, refs,
decorate);
}
+ assert(graph_ptr->edges != NULL && "The edge table must always
be present");
if(rel_is_ref(graph_ptr->edges)){
int nr = find_ref(refs, graph_ptr->edges);
print_indent(sql, fout, depth+1, decorate);
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
@@ -100,9 +100,9 @@ sql_rel* rel_graph_reaches(mvc *sql, sql
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 semantic not
allowed for the time being", __LINE__);
- }
+// if(qfrom->card != CARD_MULTI || qto->card != CARD_MULTI){
+// return sql_error(sql, 42, "["__FILE__ ":%d] select/filter semantic not
allowed for the time being", __LINE__);
+// }
// edges table
lstoperands = lstoperands->next;
@@ -145,8 +145,8 @@ sql_rel* rel_graph_reaches(mvc *sql, sql
list_append(exp_ptr->r, qto);
result->exps = sa_list(sql->sa); // by convention exps has to be a list,
even it contains only one item
list_append(result->exps, exp_ptr);
- result->card = CARD_MULTI;
- result->nrcols = rel->nrcols;
+ result->card = (qfrom->card != CARD_MULTI && qto->card != CARD_MULTI) ?
CARD_ATOM : CARD_MULTI;
+ if(rel) { result->nrcols = rel->nrcols; }
graph_ptr->edges = tbl_edges;
graph_ptr->efrom = sa_list(sql->sa);
list_append(graph_ptr->efrom, efrom);
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
@@ -277,7 +277,8 @@ rel_properties(mvc *sql, global_props *g
case op_graph_select: {
sql_graph* graph_ptr = (sql_graph*) rel;
// propagate
- rel_properties(sql, gp, rel->l);
+ // if(rel->l) is to account for the case SELECT 1 WHERE x
REACHES y ...
+ if (rel->l) rel_properties(sql, gp, rel->l);
if (rel->r) rel_properties(sql, gp, rel->r);
rel_properties(sql, gp, graph_ptr->edges);
} break;
@@ -6376,12 +6377,15 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
sql_graph* graph_ptr = (sql_graph*) rel;
// lhs and rhs as usual
- exps_mark_used(sql->sa, rel, rel->l);
- rel_mark_used(sql, rel->l, 0);
- if(rel->r) {
- assert(rel->op == op_graph_join);
- exps_mark_used(sql->sa, rel, rel->r);
- rel_mark_used(sql, rel->r, 0);
+ if(rel->l) { // yeah, a select can be the topmost operator,
hard to believe
+ exps_mark_used(sql->sa, rel, rel->l);
+ rel_mark_used(sql, rel->l, 0);
+
+ if(rel->r) {
+ assert(rel->op == op_graph_join);
+ exps_mark_used(sql->sa, rel, rel->r);
+ rel_mark_used(sql, rel->r, 0);
+ }
}
// edges
@@ -9387,8 +9391,9 @@ rel_graph_pda(int *changes, mvc *sql, sq
sql_rel* target = NULL;
sql_exp* graph_pda = NULL;
- // only applies to op_graph_select
- if(graph_rel->op != op_graph_select) {
+ // It only applies to op_graph_select. The relation might be the
topmost in case of a
+ // query such as SELECT 1 WHERE x REACHES y ... => rel->l == NULL
+ if(graph_rel->op != op_graph_select || rel->l == NULL) {
return rel;
}
graph_pda = graph_rel->exps->h->data;
@@ -9459,7 +9464,7 @@ rel_graph_create_join(int *changes, mvc
sql_exp* graph_pda = NULL;
// only applies to op_graph_select
- if(graph_rel->op != op_graph_select || rel_is_ref(rel)) {
+ if(graph_rel->op != op_graph_select || rel->l == NULL ||
rel_is_ref(rel)) {
return rel;
}
graph_pda = graph_rel->exps->h->data;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list