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

Reply via email to