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