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

Reply via email to