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