Changeset: bec155f92a89 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bec155f92a89
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/include/sql_relation.h
        sql/server/Makefile.ag
        sql/server/rel_dump.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_graph.c
        sql/server/rel_graph.h
        sql/server/rel_optimizer.c
        sql/server/rel_planner.c
        sql/server/rel_rel.c
        sql/server/rel_select.c
        sql/server/sql_parser.y
Branch: graph0
Log Message:

Starting to work on the optimizer

Up to rel_push_project_up


diffs (truncated from 712 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
@@ -1268,6 +1268,8 @@ exp2bin_args(backend *be, sql_exp *e, li
                                list_append(args, s);
                        }
                }
+       case e_graph:
+               assert(0 && "Not implemented yet");
        }
        return args;
 }
@@ -4918,6 +4920,8 @@ exp_deps(sql_allocator *sa, sql_exp *e, 
                                        return exp_deps(sa, e->f, refs, l);
                        }
                }       break;
+       case e_graph:
+               assert(0 && "Not implemented yet");
        }
        return 0;
 }
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
@@ -21,7 +21,8 @@ typedef enum expression_type {
        e_func,
        e_aggr,
        e_convert,
-       e_psm
+       e_psm,
+       e_graph,
 } expression_type;
 
 #define CARD_ATOM 1
@@ -140,8 +141,6 @@ typedef struct expression {
 
 #define DDL_EMPTY 100
 
-#define MAXOPS 21
-
 typedef enum operator_type {
        op_basetable = 0,
        op_table,
@@ -161,12 +160,15 @@ typedef enum operator_type {
        op_groupby,     
        op_topn,
        op_sample,
+       op_graph,
        op_insert,      /* insert(l=table, r insert expressions) */ 
        op_update,      /* update(l=table, r update expressions) */
        op_delete,      /* delete(l=table, r delete expression) */
-       op_graph,
 } operator_type;
 
+// set to the last element of operator_type
+#define MAXOPS ((int) op_delete +1)
+
 #define is_atom(et) \
        (et == e_atom)
 /* a simple atom is a literal or on the query stack */
@@ -228,6 +230,8 @@ typedef enum operator_type {
        (op == op_sample)
 #define is_graph(op) \
        (op == op_graph)
+#define is_join_like(op) \
+       (is_join(op) || is_graph(op))
 
 /* NO NIL semantics of aggr operations */
 #define need_no_nil(e) \
@@ -303,8 +307,7 @@ typedef struct {
        sql_rel *edges; // edge table
        list *efrom;
        list *eto;
-       list *qfrom;
-       list *qto;
+       list *spfw;
 } sql_graph;
 
 #endif /* SQL_RELATION_H */
diff --git a/sql/server/Makefile.ag b/sql/server/Makefile.ag
--- a/sql/server/Makefile.ag
+++ b/sql/server/Makefile.ag
@@ -49,7 +49,8 @@ lib_sqlserver = {
                rel_psm.c \
                rel_xml.c \
                rel_dump.c \
-               rel_dump.h rel_exp.h rel_rel.h \
+               rel_graph.c \
+               rel_dump.h rel_graph.h rel_exp.h rel_rel.h \
                rel_optimizer.h rel_partition.h rel_distribute.h rel_prop.h 
rel_schema.h rel_select.h \
                rel_semantic.h rel_sequence.h rel_trans.h \
                rel_updates.h rel_psm.h rel_xml.h sql_atom.h sql_datetime.h \
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
@@ -204,6 +204,12 @@ exp_print(mvc *sql, stream *fout, sql_ex
                        exp_print(sql, fout, e->r, depth+1, 0, 0);
                }
                break;
+       case e_graph:
+               exps_print(sql, fout, e->l, depth, alias, 1);
+               mnstr_printf(fout, " -> ");
+               exps_print(sql, fout, e->r, depth, alias, 1);
+               break;
+
        default:
                ;
        }
@@ -529,14 +535,13 @@ rel_print_(mvc *sql, stream  *fout, sql_
                        print_indent(sql, fout, depth+1, decorate);
                        mnstr_printf(fout, "& REF %d ", nr);
                } else {
-                       rel_print_(sql, fout, rel->r, depth+1, refs, decorate);
+                       rel_print_(sql, fout, graph_ptr->edges, depth+1, refs, 
decorate);
                }
-               exps_print(sql, fout, graph_ptr->qfrom, depth, 1, 0);
-               mnstr_printf(fout, " -> ");
-               exps_print(sql, fout, graph_ptr->qto, depth, 1, 0);
-               mnstr_printf(fout, ", src: ");
+               print_indent(sql, fout, depth, decorate);
+               exps_print(sql, fout, rel->exps, depth, 1, 0);
+               mnstr_printf(fout, ", src:");
                exps_print(sql, fout, graph_ptr->efrom, depth, 1, 0);
-               mnstr_printf(fout, ", dst: ");
+               mnstr_printf(fout, ", dst:");
                exps_print(sql, fout, graph_ptr->eto, depth, 1, 0);
        }   break;
        default:
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
@@ -578,6 +578,16 @@ exp_rel(mvc *sql, sql_rel *rel)
        return e;
 }
 
+sql_exp *
+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;
+       return e;
+}
+
 /* Set a name (alias) for the expression, such that we can refer 
    to this expression by this simple name.
  */
@@ -1216,6 +1226,8 @@ rel_find_exp_( sql_rel *rel, sql_exp *e)
                return NULL;
        case e_atom:
                return e;
+       case e_graph:
+               assert(0 && "Not implemented yet");
        }
        return ne;
 }
@@ -1323,6 +1335,7 @@ exp_is_atom( sql_exp *e )
        case e_column:
        case e_cmp:
        case e_psm:
+       case e_graph:
                return 0;
        }
        return 0;
@@ -1376,6 +1389,8 @@ exp_has_func( sql_exp *e )
        case e_column:
        case e_psm:
                return 0;
+       case e_graph:
+               return exps_has_func(e->l) || exps_has_func(e->r);
        }
        return 0;
 }
@@ -1413,6 +1428,8 @@ exp_has_sideeffect( sql_exp *e )
        case e_column:
        case e_psm:
                return 0;
+       case e_graph:
+               assert(0 && "Not implemented yet");
        }
        return 0;
 }
@@ -1792,6 +1809,12 @@ exp_copy( sql_allocator *sa, sql_exp * e
                if (e->flag == PSM_SET) 
                        ne = exp_set(sa, e->name, exp_copy(sa, e->l), 
GET_PSM_LEVEL(e->flag));
                break;
+       case e_graph:
+               ne = exp_create(sa, e_graph);
+               ne->l = exps_copy(sa, e->l);
+               ne->r = exps_copy(sa, e->r);
+               ne->card = CARD_ATOM;
+               break;
        }
        if (!ne)
                return ne;
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -80,6 +80,8 @@ extern sql_exp * exp_while(sql_allocator
 extern sql_exp * exp_if(sql_allocator *sa, sql_exp *cond, list *if_stmts, list 
*else_stmts);
 extern sql_exp * exp_rel(mvc *sql, sql_rel * r);
 
+extern sql_exp * exp_graph(mvc *sql, list *l, list *r);
+
 extern void exp_setname(sql_allocator *sa, sql_exp *e, const char *rname, 
const char *name );
 extern void exp_setrelname(sql_allocator *sa, sql_exp *e, int nr );
 
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
@@ -17,7 +17,30 @@
 #include "rel_select.h"
 #include "sql_relation.h" // rel_graph
 
+// DEBUG ONLY -- copy & paste from sql_gencode.c + decorate = TRUE
+str
+rel2str1( mvc *sql, sql_rel *rel)
+{
+       buffer *b;
+       stream *s = buffer_wastream(b = buffer_create(1024), "rel_dump");
+       list *refs = sa_list(sql->sa);
+       char *res = NULL;
+
+       rel_print_refs(sql, s, rel, 0, refs, TRUE);
+       rel_print_(sql, s, rel, 0, refs, TRUE);
+       mnstr_printf(s, "\n");
+       res = buffer_get_buf(b);
+       buffer_destroy(b);
+       mnstr_destroy(s);
+       return res;
+}
+
+
 sql_rel* rel_graph_reaches(mvc *sql, sql_rel *rel, symbol *sq, int context){
+       // TODO handle edge components defined with multiple attributes
+       // this needs changes in the parser to accept list of columns & scalars
+
+
     dnode* lstoperands = NULL; // temp to navigate over the operands
     symbol* sym_qfrom = NULL; // the `from' column in the ast
     symbol* sym_qto = NULL; // the `to' column in the ast
@@ -30,9 +53,10 @@ sql_rel* rel_graph_reaches(mvc *sql, sql
     sql_exp* efrom = NULL; // ref to the edges column `from'
     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
+//    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; // the created operator
+    sql_graph* graph_ptr = NULL; // the created operator
+    sql_exp* exp_ptr = NULL; // the created expression ( x reaches y )
     sql_rel* result = NULL; // final output operator
     int use_views_old = 0; // temporary to remember the old value of 
sql->use_views
 
@@ -42,7 +66,7 @@ sql_rel* rel_graph_reaches(mvc *sql, sql
     sql->caching = false;
 
     // let's see what we have got so far
-    printf("[Semantic analysis] Input relation: %s", rel_to_str(sql, rel));
+    printf("[Semantic analysis] Input relation: %s", rel2str1(sql, rel));
 
     lstoperands = sq->data.lval->h;
     sym_qfrom = lstoperands->data.sym; // first operand symbol( dlist( table, 
column ) )
@@ -84,13 +108,24 @@ sql_rel* rel_graph_reaches(mvc *sql, sql
     if(!qto) return NULL; // cannot convert qto into the same type of eto
 
     // build the new operator graph join operator
-    *graph_ptr = sa_alloc(sql->sa, sizeof(sql_graph));
+    graph_ptr = (sql_graph*) sa_alloc(sql->sa, sizeof(sql_graph));
     if(!graph_ptr) { return sql_error(sql, 03, "Cannot allocate rel_graph"); }
-    memset(graph_ptr, 0, sizeof(graph_ptr));
+    memset(graph_ptr, 0, sizeof(sql_graph));
     result = (sql_rel*) graph_ptr;
     sql_ref_init(&result->ref);
+    result->op = op_graph;
     result->l = rel;
-    result->exps = sa_list(sql->sa); // empty list
+    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->l = sa_list(sql->sa);
+    list_append(exp_ptr->l, qfrom);
+    exp_ptr->r = sa_list(sql->sa);
+    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;
     graph_ptr->edges = tbl_edges;
@@ -98,18 +133,14 @@ sql_rel* rel_graph_reaches(mvc *sql, sql
     list_append(graph_ptr->efrom, efrom);
     graph_ptr->eto = sa_list(sql->sa);
     list_append(graph_ptr->eto, eto);
-    graph_ptr->qfrom = sa_list(sql->sa);
-    list_append(graph_ptr->qfrom, qfrom);
-    graph_ptr->qto = sa_list(sql->sa);
-    list_append(graph_ptr->qto, qto);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to