Changeset: ac3615f815dd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ac3615f815dd
Modified Files:
        sql/backends/monet5/sql_statement.c
        sql/server/rel_dump.c
Branch: default
Log Message:

merged with Jul2017


diffs (226 lines):

diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -13,6 +13,7 @@
 #include "sql_gencode.h"
 #include "rel_rel.h"
 #include "rel_exp.h"
+#include "rel_prop.h"
 #include "rel_optimizer.h"
 
 #include "mal_namespace.h"
@@ -2896,12 +2897,20 @@ stmt_func(backend *be, stmt *ops, const 
        InstrPtr q = NULL;
        const char *mod = "user";
        node *n;
+       prop *p = NULL;
 
        /* dump args */
        if (ops && ops->nr < 0)
                return NULL;
 
+       p = find_prop(rel->p, PROP_REMOTE);
+       if (p) 
+               rel->p = prop_remove(rel->p, p);
        rel = rel_optimizer(be->mvc, rel);
+       if (p) {
+               p->p = rel->p;
+               rel->p = p;
+       }
 
        if (monet5_create_relational_function(be->mvc, mod, name, rel, ops, 
NULL, 1) < 0)
                 return NULL;
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
@@ -586,6 +586,13 @@ skipWS( char *r, int *pos)
 }
 
 static void
+skipUntilWS( char *r, int *pos)
+{
+       while(r[*pos] && (!isspace((unsigned char) r[*pos]) || r[*pos] == '|')) 
+               (*pos)++;
+}
+
+static void
 skipIdent( char *r, int *pos)
 {
        if (r[*pos] == '"') {
@@ -606,6 +613,7 @@ skipIdentOrSymbol( char *r, int *pos)
                skipIdent(r, pos);
        } else {
                while(r[*pos] && (isalnum((unsigned char) r[*pos]) ||
+                                 r[*pos] == '=' ||
                                  r[*pos] == '_' || r[*pos] == '%' ||
                                  r[*pos] == '<' || r[*pos] == '>' ||
                                  r[*pos] == '/' || r[*pos] == '*' ||
@@ -781,18 +789,25 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
        /* atom */
        case '(': 
                if (b == (r+*pos)) { /* or */
-                       int filter = 0;
+                       int filter = 0, anti = 0;
                        list *lexps,*rexps;
                        char *fname = NULL;
                       
                        lexps = read_exps(sql, lrel, rrel, pexps, r, pos, '(', 
0);
                        skipWS(r, pos);
-                       if (strncmp(r+*pos, "or",  strlen("or")) == 0) 
+                       if (r[*pos] == '!') {
+                               anti = 1;
+                               (*pos)++;
+                               skipWS(r, pos);
+                       }
+                       if (strncmp(r+*pos, "or",  strlen("or")) == 0) {
                                (*pos)+= (int) strlen("or");
-                       else if (strncmp(r+*pos, "filter",  strlen("filter")) 
== 0) 
+                       } else if (strncmp(r+*pos, "FILTER",  strlen("FILTER")) 
== 0) {
+                               (*pos)+= (int) strlen("FILTER");
                                filter = 1;
-                       else
+                       } else {
                                return sql_error(sql, -1, SQLSTATE(42000) 
"Type: missing 'or'\n");
+                       }
                        skipWS(r, pos);
                        if (filter) {
                                fname = r+*pos;
@@ -810,7 +825,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                if (!func)
                                        return sql_error(sql, -1, 
SQLSTATE(42000) "Filter: missing function '%s'\n", fname);
                                        
-                               return exp_filter(sql->sa, lexps, rexps, func, 
0/* anti*/);
+                               return exp_filter(sql->sa, lexps, rexps, func, 
anti);
                        }
                        return exp_or(sql->sa, lexps, rexps);
                }
@@ -907,8 +922,25 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        for( n = exps->h; n; n = n->next)
                                append(ops, exp_subtype(n->data));
                        f = sql_bind_func_(sql->sa, s, cname, ops, F_FUNC);
+
+                       /* fix scale of mul function, other type casts are 
explicit */
+                       if (f && f->func->fix_scale == SCALE_MUL && 
list_length(exps) == 2) {
+                               sql_arg *ares = f->func->res->h->data;
+
+                               if (strcmp(f->func->imp, "*") == 0 && 
ares->type.type->scale == SCALE_FIX) {
+                                       sql_subtype *res = f->res->h->data;
+                                       sql_subtype *lt = ops->h->data;
+                                       sql_subtype *rt = ops->h->next->data;
+
+                                       res->digits = lt->digits;
+                                       res->scale = lt->scale + rt->scale;
+                               }
+                       }
+
                        if (f)
                                exp = exp_op( sql->sa, exps, f);
+                       else
+                               return sql_error(sql, -1, SQLSTATE(42000) 
"Function: missing '%s.%s %d'\n", tname, cname, list_length(ops));
                }
        }
 
@@ -922,6 +954,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
 
                                exp = exp_atom_ref(sql->sa, nr, &a->tpe);
                        }
+                       assert(exp);
                }
                if (!exp) {
                        old = *e;
@@ -1005,6 +1038,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                skipWS(r,pos);
        }
        read_prop( sql, exp, r, pos);
+       skipWS(r,pos);
 
        /* as alias */
        if (strncmp(r+*pos, "as", 2) == 0) {
@@ -1200,7 +1234,6 @@ rel_read(mvc *sql, char *r, int *pos, li
                                (*pos)+= (int) strlen("COUNT");
                                skipWS( r, pos);
                        }
-                       return rel;
                } else { /* top N */
                        *pos += (int) strlen("top N");
                        skipWS(r, pos);
@@ -1215,7 +1248,6 @@ rel_read(mvc *sql, char *r, int *pos, li
                        skipWS(r, pos);
                        exps = read_exps(sql, nrel, NULL, NULL, r, pos, '[', 0);
                        rel = rel_topn(sql->sa, nrel, exps);
-                       return rel;
                }
                break;
        case 'p':
@@ -1241,7 +1273,7 @@ rel_read(mvc *sql, char *r, int *pos, li
                if (distinct)
                        set_distinct(rel);
                distinct = 0;
-               return rel;
+               break;
        case 'g':
                *pos += (int) strlen("group by");
                skipWS(r, pos);
@@ -1265,7 +1297,7 @@ rel_read(mvc *sql, char *r, int *pos, li
 
                rel = rel_groupby(sql, nrel, gexps);
                rel->exps = exps;
-               return rel;
+               break;
        case 's':
        case 'a':
                if (r[*pos+1] == 'a') {
@@ -1282,7 +1314,6 @@ rel_read(mvc *sql, char *r, int *pos, li
                        skipWS(r, pos);
                        exps = read_exps(sql, nrel, NULL, NULL, r, pos, '[', 0);
                        rel = rel_sample(sql->sa, nrel, exps);
-                       return rel;
                } else if (r[*pos+2] == 'l') {
                        *pos += (int) strlen("select");
                        skipWS(r, pos);
@@ -1299,7 +1330,6 @@ rel_read(mvc *sql, char *r, int *pos, li
 
                        exps = read_exps(sql, nrel, NULL, NULL, r, pos, '[', 0);
                        rel = rel_select_copy(sql->sa, nrel, exps);
-                       return rel;
                        /* semijoin or antijoin */
                } else if (r[*pos+1] == 'e' || r[*pos+1] == 'n') {
                        j = op_semi;
@@ -1331,7 +1361,6 @@ rel_read(mvc *sql, char *r, int *pos, li
                        exps = read_exps(sql, lrel, rrel, NULL, r, pos, '[', 0);
                        rel = rel_crossproduct(sql->sa, lrel, rrel, j);
                        rel->exps = exps;
-                       return rel;
                }
                break;
        case 'l':
@@ -1385,7 +1414,7 @@ rel_read(mvc *sql, char *r, int *pos, li
                exps = read_exps(sql, lrel, rrel, NULL, r, pos, '[', 0);
                rel = rel_crossproduct(sql->sa, lrel, rrel, j);
                rel->exps = exps;
-               return rel;
+               break;
        case 'u':
                if (j == op_basetable) {
                        *pos += (int) strlen("union");
@@ -1432,12 +1461,19 @@ rel_read(mvc *sql, char *r, int *pos, li
                if (rel_set_types(sql, rel) < 0)
                        return NULL;
                set_processed(rel);
-               return rel;
+               break;
        case 'd':
                /* 'ddl' not supported */
        default:
                return NULL;
        }
+       /* sometimes the properties are send */
+       if (strncmp(r+*pos, "REMOTE",  strlen("REMOTE")) == 0) {
+               (*pos)+= (int) strlen("REMOTE");
+               skipWS(r, pos);
+               skipUntilWS(r, pos);
+               skipWS(r, pos);
+       }
        return rel;
 }
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to