Changeset: 57a754716181 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=57a754716181 Modified Files: sql/backends/monet5/rel_bin.c sql/include/sql_relation.h sql/server/rel_distribute.c sql/server/rel_dump.c sql/server/rel_dump.h sql/server/rel_graph.c sql/server/rel_optimizer.c sql/server/rel_rel.c sql/server/rel_select.c Branch: graph0 Log Message:
Basic handling of query rewrite phase for the spfw operator diffs (truncated from 582 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 @@ -16,6 +16,7 @@ #include "rel_select.h" #include "rel_updates.h" #include "rel_optimizer.h" +#include "rel_dump.h" #include "sql_env.h" #define OUTER_ZERO 64 @@ -4550,6 +4551,15 @@ rel2bin_ddl(mvc *sql, sql_rel *rel, list } static stmt * +rel2bin_spfw(mvc *sql, sql_rel *rel, list *refs) +{ + printf("[Codegen] Input relation: %s\n", rel_to_str(sql, rel)); + + // for the time being, just ignore spfw and generate the code for the upper table + return subrel_bin(sql, rel->l, refs); +} + +static stmt * subrel_bin(mvc *sql, sql_rel *rel, list *refs) { stmt *s = NULL; @@ -4639,8 +4649,8 @@ subrel_bin(mvc *sql, sql_rel *rel, list s = rel2bin_ddl(sql, rel, refs); break; case op_spfw: - // todo - return NULL; + s = rel2bin_spfw(sql, rel, refs); + break; } if (s && rel_is_ref(rel)) { list_append(refs, rel); 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 @@ -135,7 +135,7 @@ typedef struct expression { #define DDL_ALTER_TABLE_DEL_TABLE 64 #define DDL_ALTER_TABLE_SET_ACCESS 65 -#define MAXOPS 21 +#define MAXOPS 22 typedef enum operator_type { op_basetable = 0, @@ -221,6 +221,8 @@ typedef enum operator_type { (op == op_insert || op == op_update || op == op_delete) #define is_sample(op) \ (op == op_sample) +#define is_spfw(op) \ + (op == op_spfw) /* NO NIL semantics of aggr operations */ #define need_no_nil(e) \ 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 @@ -43,6 +43,7 @@ has_remote_or_replica( sql_rel *rel ) case op_union: case op_inter: case op_except: + case op_spfw: if (has_remote_or_replica( rel->l ) || has_remote_or_replica( rel->r )) return 1; @@ -65,8 +66,6 @@ has_remote_or_replica( sql_rel *rel ) if (rel->r && has_remote_or_replica( rel->r )) return 1; break; - case op_spfw: - break; // TODO, just allow to compile ftb } return 0; } @@ -157,6 +156,7 @@ replica(mvc *sql, sql_rel *rel, char *ur case op_union: case op_inter: case op_except: + case op_spfw: rel->l = replica(sql, rel->l, uri); rel->r = replica(sql, rel->r, uri); break; @@ -177,8 +177,6 @@ replica(mvc *sql, sql_rel *rel, char *ur case op_delete: rel->r = replica(sql, rel->r, uri); break; - case op_spfw: - break; // TODO, just allow to compile ftb } return rel; } @@ -301,7 +299,8 @@ rel_remote_func(mvc *sql, sql_rel *rel) case op_union: case op_inter: - case op_except: + case op_except: + case op_spfw: rel->l = rel_remote_func(sql, rel->l); rel->r = rel_remote_func(sql, rel->r); break; @@ -322,8 +321,6 @@ rel_remote_func(mvc *sql, sql_rel *rel) case op_delete: rel->r = rel_remote_func(sql, rel->r); break; - case op_spfw: - break; // TODO, just allow to compile ftb } 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 @@ -1343,3 +1343,20 @@ rel_read(mvc *sql, char *r, int *pos, li return rel; } +// copied and pasted from codegen +str +rel_to_str(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, 0); + rel_print_(sql, s, rel, 0, refs, 0); + mnstr_printf(s, "\n"); + res = buffer_get_buf(b); + buffer_destroy(b); + mnstr_destroy(s); + return res; +} diff --git a/sql/server/rel_dump.h b/sql/server/rel_dump.h --- a/sql/server/rel_dump.h +++ b/sql/server/rel_dump.h @@ -18,4 +18,6 @@ extern const char *op2string(operator_ty extern sql_rel *rel_read(mvc *sql, char *ra, int *pos, list *refs); +extern str rel_to_str(mvc *sql, sql_rel *rel); + #endif /*_REL_DUMP_H_*/ 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 @@ -16,25 +16,6 @@ #include "rel_rel.h" #include "rel_select.h" -// copied and pasted from codegen -static str -rel2str( 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, 0); - rel_print_(sql, s, rel, 0, refs, 0); - 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){ str dump = NULL; dnode* lstoperands = NULL; // temp to navigate over the operands @@ -54,9 +35,12 @@ sql_rel* rel_graph_reaches(mvc *sql, sql 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 - dump = rel2str(sql, rel); - printf("Input relation: %s", dump); + dump = rel_to_str(sql, rel); + printf("[Semantic analysis] Input relation: %s", dump); lstoperands = sq->data.lval->h; sym_qfrom = lstoperands->data.sym; // first operand symbol( dlist( table, column ) ) @@ -99,12 +83,10 @@ sql_rel* rel_graph_reaches(mvc *sql, sql // build the new operator graphjoin operator result = rel_spfw(sql, rel, tbl_edges, exp_spfw(sql, qfrom, qto, efrom, eto)); - (void) result; // -Werror, unutilised variable bla bla.. // let's if what we are creating makes sense - dump = rel2str(sql, result); - printf("Output relation: %s\n", dump); + dump = rel_to_str(sql, result); + printf("[Semantic analysis] Output relation: %s\n", dump); - // atm just ignore the operator otherwise it will cause a crash down in the phases - return rel; + return result; } 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 @@ -6,7 +6,7 @@ * Copyright 1997 - July 2008 CWI, August 2008 - 2016 MonetDB B.V. */ -/*#define DEBUG*/ +#define DEBUG // */ #include "monetdb_config.h" #include "rel_optimizer.h" @@ -21,6 +21,8 @@ #endif #include "mtime.h" + + #define new_func_list(sa) sa_list(sa) #define new_col_list(sa) sa_list(sa) @@ -109,6 +111,7 @@ name_find_column( sql_rel *rel, char *rn case op_apply: case op_semi: case op_anti: + case op_spfw: /* first right (possible subquery) */ c = name_find_column( rel->r, rname, name, pnr, bt); if (!c) @@ -155,8 +158,6 @@ name_find_column( sql_rel *rel, char *rn case op_update: case op_delete: break; - case op_spfw: - break; // TODO, just allow to compile ftb } if (alias) { /* we found an expression with the correct name, but we need sql_columns */ @@ -240,6 +241,7 @@ rel_properties(mvc *sql, global_props *g case op_union: case op_inter: case op_except: + case op_spfw: rel_properties(sql, gp, rel->l); rel_properties(sql, gp, rel->r); break; @@ -258,8 +260,6 @@ rel_properties(mvc *sql, global_props *g if (rel->r) rel_properties(sql, gp, rel->r); break; - case op_spfw: - break; // TODO, just allow to compile ftb } switch (rel->op) { @@ -268,34 +268,8 @@ rel_properties(mvc *sql, global_props *g if (!find_prop(rel->p, PROP_COUNT)) rel->p = prop_create(sql->sa, PROP_COUNT, rel->p); break; - case op_join: - case op_left: - case op_right: - case op_full: - - case op_apply: - case op_semi: - case op_anti: - - case op_union: - case op_inter: - case op_except: + default: break; - - case op_project: - case op_groupby: - case op_topn: - case op_sample: - case op_select: - break; - - case op_insert: - case op_update: - case op_delete: - case op_ddl: - break; - case op_spfw: - break; // TODO, just allow to compile ftb } } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list