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