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