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

Reply via email to