Changeset: 7bc1969a7552 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7bc1969a7552
Modified Files:
sql/backends/monet5/sql_gencode.c
sql/common/sql_types.c
sql/server/rel_distribute.c
sql/server/rel_distribute.h
sql/server/rel_dump.c
sql/server/rel_optimizer.c
sql/test/Dependencies/Tests/Dependencies.stable.out
sql/test/Dependencies/Tests/Dependencies.stable.out.int128
sql/test/Tests/systemfunctions.stable.out.int128
sql/test/emptydb/Tests/check.stable.out
sql/test/emptydb/Tests/check.stable.out.32bit
sql/test/emptydb/Tests/check.stable.out.int128
sql/test/leaks/Tests/check1.stable.out.int128
Branch: Jul2017
Log Message:
fixes for bugs 6341, 6342 and 6343
For 6343 more is needed.
added missing sql_div definitions (for decimals)
added parsing of anti ( ! ) in rel dump
handle aliases with in the group by operator
pushed merge table rewrites down functions
diffs (truncated from 1445 to 300 lines):
diff --git a/sql/backends/monet5/sql_gencode.c
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -42,6 +42,8 @@
#include <rel_select.h>
#include <rel_optimizer.h>
+#include <rel_distribute.h>
+#include <rel_partition.h>
#include <rel_prop.h>
#include <rel_rel.h>
#include <rel_exp.h>
@@ -872,8 +874,11 @@ backend_create_sql_func(backend *be, sql
if (!vararg)
f->sql++;
r = rel_parse(m, f->s, f->query, m_instantiate);
- if (r)
+ if (r) {
r = rel_optimizer(m, r);
+ r = rel_distribute(m, r);
+ r = rel_partition(m, r);
+ }
if (r && !f->sql) /* native function */
return 0;
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -1544,6 +1544,17 @@ sqltypeinit( sql_allocator *sa)
}
}
}
+ for (t = decimals, t++; t != floats; t++) {
+ sql_type **u;
+
+ for (u = decimals, u++; u != floats; u++) {
+ if (t != u && (*t)->localtype > (*u)->localtype) {
+ sql_create_func(sa, "sql_mul", "calc", "*", *t,
*u, *t, SCALE_MUL);
+ sql_create_func(sa, "sql_div", "calc", "/", *t,
*u, *t, SCALE_DIV);
+ }
+ }
+ }
+
/* all numericals */
for (t = numerical; *t != TME; t++) {
sql_subtype *lt;
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
@@ -94,6 +94,42 @@ rewrite_replica( mvc *sql, sql_rel *rel,
return r;
}
+static list * exps_replica(mvc *sql, list *exps, char *uri) ;
+static sql_rel * replica(mvc *sql, sql_rel *rel, char *uri);
+
+static sql_exp *
+exp_replica(mvc *sql, sql_exp *e, char *uri)
+{
+ if (e->type != e_psm)
+ return e;
+ if (e->flag & PSM_VAR)
+ return e;
+ if (e->flag & PSM_SET || e->flag & PSM_RETURN)
+ e->l = exp_replica(sql, e->l, uri);
+ if (e->flag & PSM_WHILE || e->flag & PSM_IF) {
+ e->l = exp_replica(sql, e->l, uri);
+ e->r = exps_replica(sql, e->r, uri);
+ if (e->f)
+ e->f = exps_replica(sql, e->f, uri);
+ return e;
+ }
+ if (e->flag & PSM_REL)
+ e->l = replica(sql, e->l, uri);
+ return e;
+}
+
+static list *
+exps_replica(mvc *sql, list *exps, char *uri)
+{
+ node *n;
+
+ if (!exps)
+ return exps;
+ for( n = exps->h; n; n = n->next)
+ n->data = exp_replica(sql, n->data, uri);
+ return exps;
+}
+
static sql_rel *
replica(mvc *sql, sql_rel *rel, char *uri)
{
@@ -168,6 +204,8 @@ replica(mvc *sql, sql_rel *rel, char *ur
rel->l = replica(sql, rel->l, uri);
break;
case op_ddl:
+ if (rel->flag == DDL_PSM && rel->exps)
+ rel->exps = exps_replica(sql, rel->exps, uri);
rel->l = replica(sql, rel->l, uri);
if (rel->r)
rel->r = replica(sql, rel->r, uri);
@@ -181,6 +219,42 @@ replica(mvc *sql, sql_rel *rel, char *ur
return rel;
}
+static list * exps_distribute(mvc *sql, list *exps) ;
+static sql_rel * distribute(mvc *sql, sql_rel *rel);
+
+static sql_exp *
+exp_distribute(mvc *sql, sql_exp *e)
+{
+ if (e->type != e_psm)
+ return e;
+ if (e->flag & PSM_VAR)
+ return e;
+ if (e->flag & PSM_SET || e->flag & PSM_RETURN)
+ e->l = exp_distribute(sql, e->l);
+ if (e->flag & PSM_WHILE || e->flag & PSM_IF) {
+ e->l = exp_distribute(sql, e->l);
+ e->r = exps_distribute(sql, e->r);
+ if (e->f)
+ e->f = exps_distribute(sql, e->f);
+ return e;
+ }
+ if (e->flag & PSM_REL)
+ e->l = distribute(sql, e->l);
+ return e;
+}
+
+static list *
+exps_distribute(mvc *sql, list *exps)
+{
+ node *n;
+
+ if (!exps)
+ return exps;
+ for( n = exps->h; n; n = n->next)
+ n->data = exp_distribute(sql, n->data);
+ return exps;
+}
+
static sql_rel *
distribute(mvc *sql, sql_rel *rel)
{
@@ -263,6 +337,8 @@ distribute(mvc *sql, sql_rel *rel)
}
break;
case op_ddl:
+ if (rel->flag == DDL_PSM && rel->exps)
+ rel->exps = exps_distribute(sql, rel->exps);
rel->l = distribute(sql, rel->l);
if (rel->r)
rel->r = distribute(sql, rel->r);
@@ -276,6 +352,42 @@ distribute(mvc *sql, sql_rel *rel)
return rel;
}
+static list * exps_remote_func(mvc *sql, list *exps) ;
+static sql_rel * rel_remote_func(mvc *sql, sql_rel *rel);
+
+static sql_exp *
+exp_remote_func(mvc *sql, sql_exp *e)
+{
+ if (e->type != e_psm)
+ return e;
+ if (e->flag & PSM_VAR)
+ return e;
+ if (e->flag & PSM_SET || e->flag & PSM_RETURN)
+ e->l = exp_remote_func(sql, e->l);
+ if (e->flag & PSM_WHILE || e->flag & PSM_IF) {
+ e->l = exp_remote_func(sql, e->l);
+ e->r = exps_remote_func(sql, e->r);
+ if (e->f)
+ e->f = exps_remote_func(sql, e->f);
+ return e;
+ }
+ if (e->flag & PSM_REL)
+ e->l = rel_remote_func(sql, e->l);
+ return e;
+}
+
+static list *
+exps_remote_func(mvc *sql, list *exps)
+{
+ node *n;
+
+ if (!exps)
+ return exps;
+ for( n = exps->h; n; n = n->next)
+ n->data = exp_remote_func(sql, n->data);
+ return exps;
+}
+
static sql_rel *
rel_remote_func(mvc *sql, sql_rel *rel)
{
@@ -309,6 +421,8 @@ rel_remote_func(mvc *sql, sql_rel *rel)
rel->l = rel_remote_func(sql, rel->l);
break;
case op_ddl:
+ if (rel->flag == DDL_PSM && rel->exps)
+ rel->exps = exps_remote_func(sql, rel->exps);
rel->l = rel_remote_func(sql, rel->l);
if (rel->r)
rel->r = rel_remote_func(sql, rel->r);
diff --git a/sql/server/rel_distribute.h b/sql/server/rel_distribute.h
--- a/sql/server/rel_distribute.h
+++ b/sql/server/rel_distribute.h
@@ -12,11 +12,6 @@
#include "sql_relation.h"
#include "sql_mvc.h"
-extern int mapiuri_valid( char *uri);
-extern char *mapiuri_database(char *uri, char *fallback);
-extern char *mapiuri_schema(char *uri, char *fallback);
-extern char *mapiuri_table(char *uri, char *fallback);
-
extern sql_rel * rel_distribute(mvc *sql, sql_rel *rel);
#endif /*_REL_DISTRIBUTE_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
@@ -64,15 +64,14 @@ cmp_print(mvc *sql, stream *fout, int cm
mnstr_printf(fout, " %s ", r);
}
-static void exps_print(mvc *sql, stream *fout, list *exps, int depth, int
alias, int brackets);
+static void exps_print(mvc *sql, stream *fout, list *exps, int depth, list
*refs, int alias, int brackets);
static void
-exp_print(mvc *sql, stream *fout, sql_exp *e, int depth, int comma, int alias)
+exp_print(mvc *sql, stream *fout, sql_exp *e, int depth, list *refs, int
comma, int alias)
{
(void)sql;
if (!e)
return;
- //mnstr_printf(fout, " %p ", e);
switch(e->type) {
case e_psm: {
if (e->flag & PSM_SET) {
@@ -81,25 +80,26 @@ exp_print(mvc *sql, stream *fout, sql_ex
/* todo */
} else if (e->flag & PSM_RETURN) {
mnstr_printf(fout, "return ");
- exp_print(sql, fout, e->l, depth, 0, 0);
+ exp_print(sql, fout, e->l, depth, refs, 0, 0);
} else if (e->flag & PSM_WHILE) {
mnstr_printf(fout, "while ");
- exp_print(sql, fout, e->l, depth, 0, 0);
- exps_print(sql, fout, e->r, depth, alias, 0);
+ exp_print(sql, fout, e->l, depth, refs, 0, 0);
+ exps_print(sql, fout, e->r, depth, refs, alias, 0);
} else if (e->flag & PSM_IF) {
mnstr_printf(fout, "if ");
- exp_print(sql, fout, e->l, depth, 0, 0);
- exps_print(sql, fout, e->r, depth, alias, 0);
+ exp_print(sql, fout, e->l, depth, refs, 0, 0);
+ exps_print(sql, fout, e->r, depth, refs, alias, 0);
if (e->f)
- exps_print(sql, fout, e->f, depth, alias, 0);
+ exps_print(sql, fout, e->f, depth, refs, alias,
0);
} else if (e->flag & PSM_REL) {
+ rel_print_(sql, fout, e->l, depth+1, refs, 1);
}
break;
}
case e_convert: {
char *to_type = sql_subtype_string(&e->tpe);
mnstr_printf(fout, "%s[", to_type);
- exp_print(sql, fout, e->l, depth, 0, 0);
+ exp_print(sql, fout, e->l, depth, refs, 0, 0);
mnstr_printf(fout, "]");
_DELETE(to_type);
break;
@@ -126,8 +126,7 @@ exp_print(mvc *sql, stream *fout, sql_ex
mnstr_printf(fout, "%s", name);
} else if (e->f) { /* values list */
list *l = e->f;
- //exp_print(sql, fout, l->h->data, depth, 0, 0);
- exps_print(sql, fout, l, depth, 0, 0);
+ exps_print(sql, fout, l, depth, refs, 0, 0);
} else { /* numbered arguments */
mnstr_printf(fout, "A%d", e->flag);
}
@@ -138,9 +137,9 @@ exp_print(mvc *sql, stream *fout, sql_ex
mnstr_printf(fout, "%s.%s",
f->func->s?f->func->s->base.name:"sys",
f->func->base.name);
- exps_print(sql, fout, e->l, depth, alias, 1);
+ exps_print(sql, fout, e->l, depth, refs, alias, 1);
if (e->r)
- exps_print(sql, fout, e->r, depth, alias, 1);
+ exps_print(sql, fout, e->r, depth, refs, alias, 1);
} break;
case e_aggr: {
sql_subaggr *a = e->f;
@@ -152,7 +151,7 @@ exp_print(mvc *sql, stream *fout, sql_ex
if (need_no_nil(e))
mnstr_printf(fout, " no nil ");
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list