Changeset: 26e6c1865c53 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=26e6c1865c53
Modified Files:
sql/backends/monet5/datacell/opt_datacell.h
sql/backends/monet5/sql.mx
sql/backends/monet5/sql_gencode.c
sql/server/rel_dump.c
sql/server/rel_dump.h
Branch: default
Log Message:
Merge with Feb2013 branch.
diffs (truncated from 308 to 300 lines):
diff --git a/sql/backends/monet5/datacell/opt_datacell.h
b/sql/backends/monet5/datacell/opt_datacell.h
--- a/sql/backends/monet5/datacell/opt_datacell.h
+++ b/sql/backends/monet5/datacell/opt_datacell.h
@@ -23,7 +23,7 @@
#include "opt_support.h"
#include "opt_pipes.h"
-#define OPTDEBUGdatacell if (1)
-//#define OPTDEBUGdatacell if (optDebug & (1 << DEBUG_OPT_DATACELL))
+//#define OPTDEBUGdatacell if (1)
+#define OPTDEBUGdatacell if (optDebug & (1 << DEBUG_OPT_DATACELL))
opt_export int OPTdatacellImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
#endif
diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx
--- a/sql/backends/monet5/sql.mx
+++ b/sql/backends/monet5/sql.mx
@@ -7613,10 +7613,12 @@ RAstatement(Client cntxt, MalBlkPtr mb,
mvc *m = NULL;
str msg = getSQLContext(cntxt, mb, &m, &b);
sql_rel *rel;
+ list *refs;
if (!m->sa)
m->sa = sa_create();
- rel = rel_read(m, *expr, &pos);
+ refs = sa_list(m->sa);
+ rel = rel_read(m, *expr, &pos, refs);
if (rel) {
int oldvtop = cntxt->curprg->def->vtop;
int oldstop = cntxt->curprg->def->stop;
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
@@ -152,7 +152,7 @@ exp_print(mvc *sql, stream *fout, sql_ex
break;
case e_cmp:
if (e->flag == cmp_in || e->flag == cmp_notin) {
- exp_print(sql, fout, e->l, depth, alias, 1);
+ exp_print(sql, fout, e->l, depth, 0, alias);
cmp_print(sql, fout, get_cmp(e));
exps_print(sql, fout, e->r, depth, alias, 1);
} else if (e->flag == cmp_or) {
@@ -193,18 +193,18 @@ exp_print(mvc *sql, stream *fout, sql_ex
mnstr_printf(fout, " ASC");
if (e->type != e_atom && e->type != e_cmp && !has_nil(e))
mnstr_printf(fout, " NOT NULL");
+ if (e->p) {
+ prop *p = e->p;
+
+ for (; p; p = p->p)
+ mnstr_printf(fout, " %s %s", propkind2string(p),
propvalue2string(p));
+ }
if (e->name && alias) {
mnstr_printf(fout, " as ");
if (e->rname)
mnstr_printf(fout, "%s.", e->rname);
mnstr_printf(fout, "%s", e->name);
}
- if (e->p) {
- prop *p = e->p;
-
- for (; p; p = p->p)
- mnstr_printf(fout, " %s %s", propkind2string(p),
propvalue2string(p));
- }
if (comma)
mnstr_printf(fout, ", ");
}
@@ -741,6 +741,19 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
break;
/* atom */
case '(':
+ if (b == (r+*pos)) { /* or */
+ list *lexps,*rexps;
+
+ lexps = read_exps(sql, lrel, rrel, r, pos, '(', 0);
+ skipWS(r, pos);
+ if (strncmp(r+*pos, "or", strlen("or")) == 0)
+ (*pos)+= (int) strlen("or");
+ else
+ return sql_error(sql, -1, "type: missing
'or'\n");
+ skipWS(r, pos);
+ rexps = read_exps(sql, lrel, rrel, r, pos, '(', 0);
+ return exp_or(sql->sa, lexps, rexps);
+ }
case '[':
old = *e;
*e = 0;
@@ -903,6 +916,30 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
}
skipWS(r, pos);
switch(r[*pos]) {
+ case 'n':
+ if (strncmp(r+*pos, "notin", strlen("notin")) == 0) {
+ (*pos)+= (int) strlen("notin");
+ f = cmp_notin;
+ }
+ break;
+ case 'F':
+ if (strncmp(r+*pos, "FILTER", strlen("FILTER")) == 0) {
+ (*pos)+= (int) strlen("FILTER");
+ f = cmp_filter;
+ }
+ break;
+ case 'i':
+ if (strncmp(r+*pos, "in", strlen("in")) == 0) {
+ (*pos)+= (int) strlen("in");
+ f = cmp_in;
+ }
+ break;
+ case 'o':
+ if (strncmp(r+*pos, "or", strlen("or")) == 0) {
+ (*pos)+= (int) strlen("or");
+ f = cmp_or;
+ }
+ break;
case '=':
f = cmp_equal;
(*pos)++;
@@ -930,20 +967,45 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
return exp;
}
if (f >= 0) {
- sql_exp *e;
+ skipWS(r,pos);
+ if (f == cmp_in || f == cmp_notin || f == cmp_filter) {
+ char *fname = NULL;
+ list *exps;
+
+ if (f == cmp_filter) {
+ fname = r+*pos, e;
- skipWS(r,pos);
- e = exp_read(sql, lrel, rrel, r, pos, 0);
- if (e && e->type == e_cmp)
- return exp_compare2(sql->sa, e->l, exp, e->r,
compare2range(swap_compare(f),e->flag));
- else if (e)
- return exp_compare(sql->sa, exp, e, f);
+ skipIdent(r,pos);
+ e = r+*pos;
+ *e = 0;
+ (*pos)++;
+ skipWS(r,pos);
+ }
+ exps = read_exps(sql, lrel, rrel, r, pos, '(', 0);
+ if (f == cmp_in || f == cmp_notin)
+ return exp_in(sql->sa, exp, exps, f);
+ else {
+ sql_subfunc *func = sql_find_func(sql->sa,
mvc_bind_schema(sql, "sys"), fname, 1+list_length(exps), F_FILT);
+ if (!func)
+ return sql_error(sql, -1, "filter:
missing function '%s'\n", fname);
+
+ return exp_filter(sql->sa, exp, exps, func, 0/*
anti*/);
+ }
+ } else {
+ sql_exp *e;
+
+ e = exp_read(sql, lrel, rrel, r, pos, 0);
+ if (e && e->type == e_cmp)
+ return exp_compare2(sql->sa, e->l, exp, e->r,
compare2range(swap_compare((comp_type)f),e->flag));
+ else if (e)
+ return exp_compare(sql->sa, exp, e, f);
+ }
}
return exp;
}
sql_rel*
-rel_read(mvc *sql, char *r, int *pos)
+rel_read(mvc *sql, char *r, int *pos, list *refs)
{
sql_rel *rel = NULL, *nrel, *lrel, *rrel;
list *exps, *gexps;
@@ -951,6 +1013,28 @@ rel_read(mvc *sql, char *r, int *pos)
operator_type j = op_basetable;
skipWS(r,pos);
+ if (r[*pos] == 'R') {
+ *pos += (int) strlen("REF");
+
+ skipWS(r, pos);
+ (void)readInt(r,pos);
+ skipWS(r, pos);
+ (*pos)++; /* ( */
+ (void)readInt(r,pos); /* skip nr refs */
+ (*pos)++; /* ) */
+ rel = rel_read(sql, r, pos, refs);
+ append(refs, rel);
+ skipWS(r,pos);
+ }
+ if (r[*pos] == '&') {
+ int nr;
+ (*pos)++;
+ skipWS(r, pos);
+ *pos += (int) strlen("REF");
+ skipWS(r, pos);
+ nr = readInt(r,pos); /* skip nr refs */
+ return rel_dup(list_fetch(refs, nr-1));
+ }
if (r[*pos] == 'd') {
*pos += (int) strlen("distinct");
skipWS(r, pos);
@@ -1010,7 +1094,7 @@ rel_read(mvc *sql, char *r, int *pos)
return sql_error(sql, -1, "top N: missing
'('\n");
(*pos)++;
skipWS(r, pos);
- nrel = rel_read(sql, r, pos);
+ nrel = rel_read(sql, r, pos, refs);
if (r[*pos] != ')')
return sql_error(sql, -1, "top N: missing
')'\n");
(*pos)++;
@@ -1028,7 +1112,7 @@ rel_read(mvc *sql, char *r, int *pos)
return sql_error(sql, -1, "project: missing '('\n");
(*pos)++;
skipWS(r, pos);
- nrel = rel_read(sql, r, pos);
+ nrel = rel_read(sql, r, pos, refs);
skipWS(r, pos);
if (r[*pos] != ')')
return sql_error(sql, -1, "project: missing ')'\n");
@@ -1052,7 +1136,7 @@ rel_read(mvc *sql, char *r, int *pos)
return sql_error(sql, -1, "group by: missing '('\n");
(*pos)++;
skipWS(r, pos);
- nrel = rel_read(sql, r, pos);
+ nrel = rel_read(sql, r, pos, refs);
skipWS(r, pos);
if (r[*pos] != ')')
return sql_error(sql, -1, "group by: missing ')'\n");
@@ -1075,7 +1159,7 @@ rel_read(mvc *sql, char *r, int *pos)
return sql_error(sql, -1, "sample: missing
'('\n");
(*pos)++;
skipWS(r, pos);
- nrel = rel_read(sql, r, pos);
+ nrel = rel_read(sql, r, pos, refs);
if (r[*pos] != ')')
return sql_error(sql, -1, "sample: missing
')'\n");
(*pos)++;
@@ -1090,7 +1174,7 @@ rel_read(mvc *sql, char *r, int *pos)
return sql_error(sql, -1, "select: missing
'('\n");
(*pos)++;
skipWS(r, pos);
- nrel = rel_read(sql, r, pos);
+ nrel = rel_read(sql, r, pos, refs);
skipWS(r, pos);
if (r[*pos] != ')')
return sql_error(sql, -1, "select: missing
')'\n");
@@ -1113,14 +1197,14 @@ rel_read(mvc *sql, char *r, int *pos)
return sql_error(sql, -1, "semijoin: missing
'('\n");
(*pos)++;
skipWS(r, pos);
- lrel = rel_read(sql, r, pos);
+ lrel = rel_read(sql, r, pos, refs);
skipWS(r, pos);
if (r[*pos] != ',')
return sql_error(sql, -1, "semijoin: missing
','\n");
(*pos)++;
skipWS(r, pos);
- rrel = rel_read(sql, r, pos);
+ rrel = rel_read(sql, r, pos, refs);
skipWS(r, pos);
if (r[*pos] != ')')
@@ -1167,14 +1251,14 @@ rel_read(mvc *sql, char *r, int *pos)
return sql_error(sql, -1, "join: missing '('\n");
(*pos)++;
skipWS(r, pos);
- lrel = rel_read(sql, r, pos);
+ lrel = rel_read(sql, r, pos, refs);
skipWS(r, pos);
if (r[*pos] != ',')
return sql_error(sql, -1, "join: missing ','\n");
(*pos)++;
skipWS(r, pos);
- rrel = rel_read(sql, r, pos);
+ rrel = rel_read(sql, r, pos, refs);
skipWS(r, pos);
if (r[*pos] != ')')
@@ -1207,14 +1291,14 @@ rel_read(mvc *sql, char *r, int *pos)
return sql_error(sql, -1, "setop: missing '('\n");
(*pos)++;
skipWS(r, pos);
- lrel = rel_read(sql, r, pos);
+ lrel = rel_read(sql, r, pos, refs);
skipWS(r, pos);
if (r[*pos] != ',')
return sql_error(sql, -1, "setop: missing ','\n");
(*pos)++;
skipWS(r, pos);
- rrel = rel_read(sql, r, pos);
+ rrel = rel_read(sql, r, pos, refs);
skipWS(r, pos);
if (r[*pos] != ')')
diff --git a/sql/server/rel_dump.h b/sql/server/rel_dump.h
--- a/sql/server/rel_dump.h
+++ b/sql/server/rel_dump.h
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list