Changeset: 25409284f7fc for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=25409284f7fc Modified Files: sql/backends/monet5/sql.mx sql/server/rel_dump.c sql/server/rel_dump.h Branch: Feb2013 Log Message:
handle more queries in rel_read (filter, (not) in, REF * ) diffs (295 lines): 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 @@ -7614,10 +7614,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 @@ -26,6 +26,6 @@ extern void rel_print(mvc *sql, sql_rel extern void _rel_print(mvc *sql, sql_rel *rel); extern const char *op2string(operator_type op); -extern sql_rel *rel_read(mvc *sql, char *ra, int *pos); +extern sql_rel *rel_read(mvc *sql, char *ra, int *pos, list *refs); #endif /*_REL_DUMP_H_*/ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list