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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list