Changeset: 575ed6cd0370 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=575ed6cd0370
Added Files:
sql/server/rel_graph.c
sql/server/rel_graph.h
Modified Files:
.gitignore
sql/backends/monet5/rel_bin.c
sql/include/sql_relation.h
sql/server/rel_distribute.c
sql/server/rel_dump.c
sql/server/rel_optimizer.c
sql/server/rel_partition.c
sql/server/rel_rel.c
sql/server/rel_select.c
Branch: graph0
Log Message:
Semantic phase (only join)
diffs (truncated from 682 to 300 lines):
diff --git a/.gitignore b/.gitignore
--- a/.gitignore
+++ b/.gitignore
@@ -116,3 +116,4 @@ syntax: regexp
/.settings/
/build
/symbols.xml
+/Default/
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
@@ -1329,6 +1329,8 @@ rel2bin_args(backend *be, sql_rel *rel,
case op_delete:
args = rel2bin_args(be, rel->r, args);
break;
+ case op_graph:
+ assert(0 && "Not implemented yet"); // TODO: not handled
}
return args;
}
@@ -4783,6 +4785,8 @@ subrel_bin(backend *be, sql_rel *rel, li
case op_ddl:
s = rel2bin_ddl(be, rel, refs);
break;
+ case op_graph:
+ assert(0 && "Not implemented yet"); // TODO: not handled
}
if (s && rel_is_ref(rel)) {
list_append(refs, rel);
@@ -5023,6 +5027,8 @@ rel_deps(sql_allocator *sa, sql_rel *r,
exps_deps(sa, r->exps, refs, l);
}
break;
+ case op_graph:
+ assert(0 && "Not implemented yet"); // TODO: not handled
}
if (r->exps)
exps_deps(sa, r->exps, refs, l);
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
@@ -163,7 +163,8 @@ typedef enum operator_type {
op_sample,
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_delete, /* delete(l=table, r delete expression) */
+ op_graph,
} operator_type;
#define is_atom(et) \
@@ -225,6 +226,8 @@ typedef enum operator_type {
(op == op_insert || op == op_update || op == op_delete)
#define is_sample(op) \
(op == op_sample)
+#define is_graph(op) \
+ (op == op_graph)
/* NO NIL semantics of aggr operations */
#define need_no_nil(e) \
@@ -295,4 +298,13 @@ typedef struct relation {
void *p; /* properties for the optimizer, distribution */
} sql_rel;
+typedef struct {
+ sql_rel relation;
+ sql_rel *edges; // edge table
+ list *efrom;
+ list *eto;
+ list *qfrom;
+ list *qto;
+} sql_graph;
+
#endif /* SQL_RELATION_H */
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
@@ -65,6 +65,8 @@ has_remote_or_replica( sql_rel *rel )
if (rel->r && has_remote_or_replica( rel->r ))
return 1;
break;
+ case op_graph:
+ assert(0 && "Not implemented yet"); // TODO: not handled
}
return 0;
}
@@ -175,6 +177,8 @@ replica(mvc *sql, sql_rel *rel, char *ur
case op_delete:
rel->r = replica(sql, rel->r, uri);
break;
+ case op_graph:
+ assert(0 && "Not implemented yet"); // TODO: not handled
}
return rel;
}
@@ -270,6 +274,8 @@ distribute(mvc *sql, sql_rel *rel)
case op_delete:
rel->r = distribute(sql, rel->r);
break;
+ case op_graph:
+ assert(0 && "Not implemented yet"); // TODO: not handled
}
return rel;
}
@@ -316,6 +322,8 @@ rel_remote_func(mvc *sql, sql_rel *rel)
case op_delete:
rel->r = rel_remote_func(sql, rel->r);
break;
+ case op_graph:
+ assert(0 && "Not implemented yet"); // TODO: not handled
}
if (find_prop(rel->p, PROP_REMOTE) != NULL) {
list *exps = rel_projections(sql, rel, NULL, 1, 1);
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
@@ -288,6 +288,8 @@ op2string(operator_type op)
case op_update:
case op_delete:
return "modify op";
+ case op_graph:
+ return "graph";
default:
return "unknown";
}
@@ -504,6 +506,39 @@ rel_print_(mvc *sql, stream *fout, sql_
if (rel->exps)
exps_print(sql, fout, rel->exps, depth, 1, 0);
} break;
+ case op_graph: {
+ sql_graph *graph_ptr = (sql_graph*) rel;
+ print_indent(sql, fout, depth, decorate);
+ mnstr_printf(fout, "graph");
+ 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) {
+ if (rel_is_ref(rel->r)) {
+ int nr = find_ref(refs, rel->r);
+ print_indent(sql, fout, depth+1, decorate);
+ mnstr_printf(fout, "& REF %d ", nr);
+ } else
+ rel_print_(sql, fout, rel->r, depth+1, refs,
decorate);
+ }
+ if(rel_is_ref(graph_ptr->edges)){
+ int nr = find_ref(refs, graph_ptr->edges);
+ print_indent(sql, fout, depth+1, decorate);
+ mnstr_printf(fout, "& REF %d ", nr);
+ } else {
+ rel_print_(sql, fout, rel->r, 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: ");
+ exps_print(sql, fout, graph_ptr->efrom, depth, 1, 0);
+ mnstr_printf(fout, ", dst: ");
+ exps_print(sql, fout, graph_ptr->eto, depth, 1, 0);
+ } break;
default:
assert(0);
}
@@ -575,6 +610,25 @@ rel_print_refs(mvc *sql, stream* fout, s
list_append(refs, rel->r);
}
break;
+ case op_graph:
+ {
+ sql_graph* graph_ptr = (sql_graph*) rel;
+ rel_print_refs(sql, fout, rel->l, depth, refs, decorate);
+ if (rel->l && rel_is_ref(rel->l) && !find_ref(refs, rel->l)) {
+ rel_print_(sql, fout, rel->l, depth, refs, decorate);
+ list_append(refs, rel->l);
+ }
+ rel_print_refs(sql, fout, rel->r, depth, refs, decorate);
+ if (rel->r && rel_is_ref(rel->r) && !find_ref(refs, rel->r)) {
+ rel_print_(sql, fout, rel->r, depth, refs, decorate);
+ list_append(refs, rel->r);
+ }
+ rel_print_refs(sql, fout, graph_ptr->edges, depth, refs,
decorate);
+ if (graph_ptr->edges && rel_is_ref(graph_ptr->edges) &&
!find_ref(refs, graph_ptr->edges)) {
+ rel_print_(sql, fout, graph_ptr->edges, depth, refs,
decorate);
+ list_append(refs, graph_ptr->edges);
+ }
+ }
}
}
diff --git a/sql/server/rel_graph.c b/sql/server/rel_graph.c
new file mode 100644
--- /dev/null
+++ b/sql/server/rel_graph.c
@@ -0,0 +1,264 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 1997 - July 2008 CWI, August 2008 - 2016 MonetDB B.V.
+ */
+
+#include "monetdb_config.h"
+#include "rel_graph.h"
+
+#include <assert.h>
+
+#include "rel_dump.h"
+#include "rel_exp.h"
+#include "rel_rel.h"
+#include "rel_select.h"
+#include "sql_relation.h" // rel_graph
+
+sql_rel* rel_graph_reaches(mvc *sql, sql_rel *rel, symbol *sq, int context){
+ 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
+ sql_exp* qfrom = NULL; // reference to the `from' column
+ sql_exp* qto = NULL; // reference to the `to' column
+ symbol* sym_edges_tbl = NULL; // the table edges in the ast
+ sql_rel* tbl_edges = NULL; // the edges table exp~
+ symbol* sym_edges_from = NULL; // reference to the `edges from' column in
the ast
+ symbol* sym_edges_to = NULL; // ref to the `edges to' column in the ast
+ 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
+ exp_kind exp_kind_value = {type_value, card_column, TRUE};
+ sql_graph* graph_ptr; // the created operator
+ sql_rel* result = NULL; // final output operator
+ int use_views_old = 0; // temporary to remember the old value of
sql->use_views
+
+ assert(sq->token == SQL_GRAPH_REACHES && "Invalid label in the AST,
expected SQL_GRAPH_REACHES");
+
+ // disable stmt caching for this query as WIP
+ sql->caching = false;
+
+ // let's see what we have got so far
+ printf("[Semantic analysis] Input relation: %s", rel_to_str(sql, rel));
+
+ lstoperands = sq->data.lval->h;
+ sym_qfrom = lstoperands->data.sym; // first operand symbol( dlist( table,
column ) )
+ lstoperands = lstoperands->next; // move next
+ sym_qto = lstoperands->data.sym; // second operand symbol( dlist( table,
column ) )
+
+ qfrom = rel_value_exp(sql, &rel, sym_qfrom, context, exp_kind_value);
+ if(!qfrom) return NULL; // cannot refer to qfrom
+ qto = rel_value_exp(sql, &rel, sym_qto, context, exp_kind_value);
+ if(!qto) return NULL; // cannot refer to qto
+
+ // edges table
+ lstoperands = lstoperands->next;
+ sym_edges_tbl = lstoperands->data.sym;
+ use_views_old = sql->use_views; // TODO: ask Ni3ls the rationale of this
trick
+ sql->use_views = TRUE; // table_ref can find references declared with
`WITH'
+ tbl_edges = table_ref(sql, NULL, sym_edges_tbl, /* lateral = */ 0);
+ sql->use_views = use_views_old; // restore the previous value
+ if(!tbl_edges) return NULL; // error
+
+ // find the columns in tbl_edges
+ lstoperands = lstoperands->next;
+ sym_edges_from = lstoperands->data.sym;
+ efrom = rel_value_exp(sql, &tbl_edges, sym_edges_from, context,
exp_kind_value);
+ if(!efrom) return NULL; // error
+ lstoperands = lstoperands->next;
+ sym_edges_to = lstoperands->data.sym;
+ eto = rel_value_exp(sql, &tbl_edges, sym_edges_to, context,
exp_kind_value);
+ if(!eto) return NULL; // error
+
+ // check the types match
+ exptype = exp_subtype(efrom);
+ if(subtype_cmp(exptype, exp_subtype(eto)) < 0){
+ return sql_error(sql, 03, "Types for the edge columns `%s' and `%s' do
not match", efrom->name, eto->name);
+ }
+ qfrom = rel_check_type(sql, exptype, qfrom, type_equal);
+ if(!qfrom) return NULL; // cannot convert qfrom into the same type of efrom
+ qto = rel_check_type(sql, exptype, qto, type_equal);
+ 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));
+ if(!graph_ptr) { return sql_error(sql, 03, "Cannot allocate rel_graph"); }
+ memset(graph_ptr, 0, sizeof(graph_ptr));
+ result = (sql_rel*) graph_ptr;
+ sql_ref_init(&result->ref);
+ result->l = rel;
+ result->exps = sa_list(sql->sa); // empty list
+ result->card = CARD_MULTI;
+ result->nrcols = rel->nrcols;
+ graph_ptr->edges = tbl_edges;
+ graph_ptr->efrom = sa_list(sql->sa);
+ 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