Changeset: 54168ec9a7a3 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=54168ec9a7a3
Modified Files:
        sql/backends/monet5/sql_gencode.c
        sql/server/rel_dump.c
Branch: Dec2016
Log Message:

fix problem with remote relation parsing


diffs (270 lines):

diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -474,7 +474,10 @@ static int
                        const char *nme = 
(op->op3)?op->op3->op4.aval->data.val.sval:op->cname;
                        char buf[64];
 
-                       snprintf(buf,64,"A%s",nme);
+                       if (op->op3)
+                               snprintf(buf,64,"A%s",nme);
+                       else
+                               snprintf(buf,64,"%s",nme);
                        varid = newVariable(curBlk, buf, strlen(buf), type);
                        curInstr = pushArgument(curBlk, curInstr, varid);
                        setVarType(curBlk, varid, type);
@@ -721,11 +724,12 @@ static int
        pushEndInstruction(curBlk);
 
        /* SQL function definitions meant for inlineing should not be optimized 
before */
-       curBlk->inlineProp = 1;
+       //for now no inline of the remote function, this gives garbage 
collection problems
+       //curBlk->inlineProp = 1;
 
        SQLaddQueryToCache(c);
-       chkProgram(c->fdout, c->nspace, c->curprg->def);
-       //SQLoptimizeFunction(c,c->curprg->def);
+       //chkProgram(c->fdout, c->nspace, c->curprg->def);
+       SQLoptimizeFunction(c, c->curprg->def);
        if (backup)
                c->curprg = backup;
        name[0] = old;          /* make sure stub is called */
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
@@ -592,6 +592,18 @@ skipIdent( char *r, int *pos)
                (*pos)++;
 }
 
+static void
+skipIdentOrSymbol( char *r, int *pos)
+{
+       while(r[*pos] && (isalnum(r[*pos]) || 
+                         r[*pos] == '_' || r[*pos] == '%' ||
+                         r[*pos] == '<' || r[*pos] == '>' || 
+                         r[*pos] == '/' || r[*pos] == '*' || 
+                         r[*pos] == '-' || r[*pos] == '+' || 
+                         r[*pos] == '~' || r[*pos] == '^' ))
+               (*pos)++;
+}
+
 static int
 readInt( char *r, int *pos)
 {
@@ -621,7 +633,7 @@ readString( char *r, int *pos)
        return st;
 }
 
-static sql_exp* exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, char *r, int 
*pos, int grp) ;
+static sql_exp* exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, list *pexps, 
char *r, int *pos, int grp) ;
 
 
 static void *
@@ -663,18 +675,19 @@ read_prop( mvc *sql, sql_exp *exp, char 
 }
 
 static list*
-read_exps(mvc *sql, sql_rel *lrel, sql_rel *rrel, char *r, int *pos, char 
bracket, int grp) 
+read_exps(mvc *sql, sql_rel *lrel, sql_rel *rrel, list *pexps, char *r, int 
*pos, char bracket, int grp) 
 {
        list *exps = new_exp_list(sql->sa);
        sql_exp *e;
        char ebracket = (bracket == '[')?']':')';
+       int plist = (bracket == '[');
 
        if (r[*pos] == bracket) {
                skipWS( r, pos);
 
                (*pos)++;
                skipWS( r, pos);
-               e = exp_read(sql, lrel, rrel, r, pos, grp);
+               e = exp_read(sql, lrel, rrel, pexps, r, pos, grp);
                if (!e && r[*pos] != ebracket) {
                        return sql_error(sql, -1, "missing closing %c\n", 
ebracket);
                } else if (!e) {
@@ -688,7 +701,7 @@ read_exps(mvc *sql, sql_rel *lrel, sql_r
                while (r[*pos] == ',') {
                        (*pos)++;
                        skipWS( r, pos);
-                       e = exp_read(sql, lrel, rrel, r, pos, grp);
+                       e = exp_read(sql, lrel, rrel, (plist)?exps:pexps, r, 
pos, grp);
                        if (!e)
                                return NULL;
                        append(exps, e);
@@ -704,7 +717,7 @@ read_exps(mvc *sql, sql_rel *lrel, sql_r
 }
 
 static sql_exp*
-exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, char *r, int *pos, int grp) 
+exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, list *pexps, char *r, int 
*pos, int grp) 
 {
        int f = -1;
        int not = 1, old, d=0, s=0, unique = 0, no_nils = 0;
@@ -723,7 +736,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                (*pos)++;
                tname = b;
                cname = r + *pos;
-               skipIdent(r, pos);
+               skipIdentOrSymbol(r, pos);
                e = r+*pos;
                skipWS(r, pos);
                old = *e;
@@ -731,11 +744,13 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                
                tname = sa_strdup(sql->sa, tname);
                cname = sa_strdup(sql->sa, cname);
-               if (lrel) { 
+               if (pexps)
+                       exp = exps_bind_column2(pexps, tname, cname);
+               if (!exp && lrel) { 
                        exp = rel_bind_column2(sql, lrel, tname, cname, 0);
                        if (!exp && rrel)
                                exp = rel_bind_column2(sql, rrel, tname, cname, 
0);
-               } else {
+               } else if (!exp) {
                        exp = exp_column(sql->sa, tname, cname, NULL, 
CARD_ATOM, 1, (strchr(cname,'%') != NULL));
                }
                *e = old;
@@ -747,7 +762,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        list *lexps,*rexps;
                        char *fname = NULL;
                       
-                       lexps = read_exps(sql, lrel, rrel, r, pos, '(', 0);
+                       lexps = read_exps(sql, lrel, rrel, pexps, r, pos, '(', 
0);
                        skipWS(r, pos);
                        if (strncmp(r+*pos, "or",  strlen("or")) == 0) 
                                (*pos)+= (int) strlen("or");
@@ -766,7 +781,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                skipWS(r,pos);
                        }
 
-                       rexps = read_exps(sql, lrel, rrel, r, pos, '(', 0);
+                       rexps = read_exps(sql, lrel, rrel, pexps, r, pos, '(', 
0);
                        if (filter) {
                                sql_subfunc *func = sql_find_func(sql->sa, 
mvc_bind_schema(sql, "sys"), fname, 1+list_length(exps), F_FILT, NULL);
                                if (!func)
@@ -800,7 +815,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                if (r[*pos] == '[') { /* convert */
                        (*pos)++;
                        skipWS(r, pos);
-                       exp = exp_read(sql, lrel, rrel, r, pos, 0);
+                       exp = exp_read(sql, lrel, rrel, pexps, r, pos, 0);
                        if (r[*pos] != ']') 
                                return sql_error(sql, -1, "convert: missing 
']'\n");
                        (*pos)++;
@@ -844,7 +859,9 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                sql_subaggr *a = NULL;
                node *n;
 
-               exps = read_exps(sql, lrel, rrel, r, pos, '(', 0);
+               exps = read_exps(sql, lrel, rrel, pexps, r, pos, '(', 0);
+               if (!exps)
+                       return NULL;
                tname = b;
                *e = 0;
                s = mvc_bind_schema(sql, tname);
@@ -1008,13 +1025,13 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                if (f == cmp_in || f == cmp_notin) {
                        list *exps;
                       
-                       exps = read_exps(sql, lrel, rrel, r, pos, '(', 0);
+                       exps = read_exps(sql, lrel, rrel, pexps, r, pos, '(', 
0);
                        if (f == cmp_in || f == cmp_notin)
                                return exp_in(sql->sa, exp, exps, f);
                } else {
                        sql_exp *e;
 
-                       e = exp_read(sql, lrel, rrel, r, pos, 0);
+                       e = exp_read(sql, lrel, rrel, pexps, 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)
@@ -1099,7 +1116,7 @@ rel_read(mvc *sql, char *r, int *pos, li
                                return rel;
        
                        /* scan aliases */
-                       exps = read_exps(sql, rel, NULL, r, pos, '[', 0);
+                       exps = read_exps(sql, rel, NULL, NULL, r, pos, '[', 0);
                        if (exps && list_length(exps))
                                rel->exps = exps;
                        if (strncmp(r+*pos, "COUNT",  strlen("COUNT")) == 0) {
@@ -1119,7 +1136,7 @@ rel_read(mvc *sql, char *r, int *pos, li
                                return sql_error(sql, -1, "top N: missing 
')'\n");
                        (*pos)++;
                        skipWS(r, pos);
-                       exps = read_exps(sql, nrel, NULL, r, pos, '[', 0);
+                       exps = read_exps(sql, nrel, NULL, NULL, r, pos, '[', 0);
                        rel = rel_topn(sql->sa, nrel, exps);
                        return rel;
                }
@@ -1139,11 +1156,11 @@ rel_read(mvc *sql, char *r, int *pos, li
                (*pos)++;
                skipWS(r, pos);
 
-               exps = read_exps(sql, nrel, NULL, r, pos, '[', 0);
+               exps = read_exps(sql, nrel, NULL, NULL, r, pos, '[', 0);
                rel = rel_project(sql->sa, nrel, exps);
                /* order by ? */
                if (r[*pos] == '[') 
-                       rel->r = read_exps(sql, nrel, rel, r, pos, '[', 0);
+                       rel->r = read_exps(sql, nrel, rel, NULL, r, pos, '[', 
0);
                if (distinct)
                        set_distinct(rel);
                distinct = 0;
@@ -1163,9 +1180,9 @@ rel_read(mvc *sql, char *r, int *pos, li
                (*pos)++;
                skipWS(r, pos);
 
-               gexps = read_exps(sql, nrel, NULL, r, pos, '[', 0);
+               gexps = read_exps(sql, nrel, NULL, NULL, r, pos, '[', 0);
                skipWS(r, pos);
-               exps = read_exps(sql, nrel, NULL, r, pos, '[', 1);
+               exps = read_exps(sql, nrel, NULL, NULL, r, pos, '[', 1);
 
                rel = rel_groupby(sql, nrel, gexps);
                rel->exps = exps;
@@ -1184,7 +1201,7 @@ rel_read(mvc *sql, char *r, int *pos, li
                                return sql_error(sql, -1, "sample: missing 
')'\n");
                        (*pos)++;
                        skipWS(r, pos);
-                       exps = read_exps(sql, nrel, NULL, r, pos, '[', 0);
+                       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') {
@@ -1201,7 +1218,7 @@ rel_read(mvc *sql, char *r, int *pos, li
                        (*pos)++;
                        skipWS(r, pos);
 
-                       exps = read_exps(sql, nrel, NULL, r, pos, '[', 0);
+                       exps = read_exps(sql, nrel, NULL, NULL, r, pos, '[', 0);
                        rel = rel_select_copy(sql->sa, nrel, exps);
                        return rel;
                        /* semijoin or antijoin */
@@ -1232,7 +1249,7 @@ rel_read(mvc *sql, char *r, int *pos, li
                        (*pos)++;
                        skipWS(r, pos);
 
-                       exps = read_exps(sql, lrel, rrel, r, pos, '[', 0);
+                       exps = read_exps(sql, lrel, rrel, NULL, r, pos, '[', 0);
                        rel = rel_crossproduct(sql->sa, lrel, rrel, j);
                        rel->exps = exps;
                        return rel;
@@ -1286,7 +1303,7 @@ rel_read(mvc *sql, char *r, int *pos, li
                (*pos)++;
                skipWS(r, pos);
 
-               exps = read_exps(sql, lrel, rrel, r, pos, '[', 0);
+               exps = read_exps(sql, lrel, rrel, NULL, r, pos, '[', 0);
                rel = rel_crossproduct(sql->sa, lrel, rrel, j);
                rel->exps = exps;
                return rel;
@@ -1328,7 +1345,7 @@ rel_read(mvc *sql, char *r, int *pos, li
                (*pos)++;
                skipWS(r, pos);
 
-               exps = read_exps(sql, lrel, rrel, r, pos, '[', 0);
+               exps = read_exps(sql, lrel, rrel, NULL, r, pos, '[', 0);
                rel = rel_setop(sql->sa, lrel, rrel, j);
                rel->exps = exps;
                set_processed(rel);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to