Changeset: a863f656b9d8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a863f656b9d8
Modified Files:
sql/backends/monet5/sql_statement.c
sql/server/rel_dump.c
Branch: Jul2017
Log Message:
fixes for parsing relational plans (remote execution)
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
@@ -585,6 +585,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] == '"') {
@@ -605,6 +612,7 @@ skipIdentOrSymbol( char *r, int *pos)
skipIdent(r, pos);
} else {
while(r[*pos] && (isalnum(r[*pos]) ||
+ r[*pos] == '=' ||
r[*pos] == '_' || r[*pos] == '%' ||
r[*pos] == '<' || r[*pos] == '>' ||
r[*pos] == '/' || r[*pos] == '*' ||
@@ -780,18 +788,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, "type: missing
'or'\n");
+ }
skipWS(r, pos);
if (filter) {
fname = r+*pos;
@@ -809,7 +824,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
if (!func)
return sql_error(sql, -1, "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);
}
@@ -906,8 +921,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, "Function: missing
'%s.%s %d'\n", tname, cname, list_length(ops));
}
}
@@ -921,6 +953,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;
@@ -1004,6 +1037,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) {
@@ -1199,7 +1233,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);
@@ -1214,7 +1247,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':
@@ -1240,7 +1272,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);
@@ -1264,7 +1296,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') {
@@ -1281,7 +1313,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);
@@ -1298,7 +1329,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;
@@ -1330,7 +1360,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':
@@ -1384,7 +1413,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");
@@ -1431,12 +1460,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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list