Changeset: c3120c666919 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c3120c666919
Modified Files:
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_statement.c
        sql/server/rel_dump.c
Branch: Jul2017
Log Message:

fixed for bug 6343, ie handle passing stack variables


diffs (160 lines):

diff --git a/sql/backends/monet5/sql_execute.c 
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -811,6 +811,17 @@ RAstatement(Client c, MalBlkPtr mb, MalS
        return msg;
 }
 
+static int 
+is_a_number(char *v)
+{
+       while(*v) {
+               if (!isdigit(*v))
+                       return 0;
+               v++;
+       }
+       return 1;
+}
+
 str
 RAstatement2(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
@@ -833,19 +844,22 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
        if (!m->sa)
                m->sa = sa_create();
 
-       //fprintf(stderr, "#(%s){{%s}}\n", *sig, *expr);
-       //fflush(stderr);
-               ops = sa_list(m->sa);
+       /* keep copy of signature and relational expression */
        snprintf(buf, BUFSIZ, "%s %s", *sig, *expr);
+
+       stack_push_frame(m, NULL);
+       ops = sa_list(m->sa);
        while (c && *c && !isspace(*c)) {
                char *vnme = c, *tnme; 
                char *p = strchr(++c, (int)' ');
-               int d,s,nr;
+               int d,s,nr = -1;
                sql_subtype t;
                atom *a;
 
                *p++ = 0;
-               nr = strtol(vnme+1, NULL, 10);
+               /* vnme can be name or number */
+               if (is_a_number(vnme+1))
+                       nr = strtol(vnme+1, NULL, 10);
                tnme = p;
                p = strchr(p, (int)'(');
                *p++ = 0;
@@ -861,14 +875,22 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
                 * don't use sql_add_arg, but special numbered version
                 * sql_set_arg(m, a, nr);
                 * */
-               append(ops, exp_atom_ref(m->sa, nr, &t));
-               sql_set_arg(m, nr, a);
+               if (nr >= 0) { 
+                       append(ops, exp_atom_ref(m->sa, nr, &t));
+                       sql_set_arg(m, nr, a);
+               } else {
+                       stack_push_var(m, vnme+1, &t);
+                       append(ops, exp_var(m->sa, sa_strdup(m->sa, vnme+1), 
&t, m->frame));
+               }
                c = strchr(p, (int)',');
                if (c)
                        c++;
        }
        refs = sa_list(m->sa);
        rel = rel_read(m, *expr, &pos, refs);
+       stack_pop_frame(m);
+       if (rel)
+               rel = rel_optimizer(m, rel);
        if (!rel || monet5_create_relational_function(m, *mod, *nme, rel, NULL, 
ops, 0) < 0)
                throw(SQL, "sql.register", "Cannot register %s", buf);
        rel_destroy(rel);
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
@@ -139,11 +139,9 @@ relational_func_create_result(mvc *sql, 
        return q;
 }
 
-
 static int
-_create_relational_function(mvc *m, const char *mod, const char *name, sql_rel 
*rel, stmt *call, list *rel_ops, int inline_func)
+_create_relational_function(mvc *m, const char *mod, const char *name, sql_rel 
*r, stmt *call, list *rel_ops, int inline_func)
 {
-       sql_rel *r;
        Client c = MCgetClient(m->clientid);
        backend *be = (backend *) c->sqlcontext;
        MalBlkPtr curBlk = 0;
@@ -151,8 +149,6 @@ static int
        Symbol backup = NULL, curPrg = NULL;
        int old_argc = be->mvc->argc;
 
-       r = rel_optimizer(m, rel);
-
        backup = c->curprg;
        curPrg = c->curprg = newFunction(putName(mod), putName(name), 
FUNCTIONsymbol);
        if( curPrg == NULL)
@@ -196,7 +192,10 @@ static int
                        int varid = 0;
                        char buf[64];
 
-                       snprintf(buf,64,"A%d",e->flag);
+                       if (e->type == e_atom) 
+                               snprintf(buf,64,"A%d",e->flag);
+                       else
+                               snprintf(buf,64,"A%s",e->name);
                        varid = newVariable(curBlk, (char *)buf, strlen(buf), 
type);
                        curInstr = pushArgument(curBlk, curInstr, varid);
                        setVarType(curBlk, varid, type);
@@ -247,7 +246,6 @@ rel2str( mvc *sql, sql_rel *rel)
        return res;
 }
 
-
 /* stub and remote function */
 static int
 _create_relational_remote(mvc *m, const char *mod, const char *name, sql_rel 
*rel, stmt *call, prop *prp)
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_optimizer.h"
 
 #include "mal_namespace.h"
 #include "mal_builder.h"
@@ -2681,6 +2682,9 @@ stmt_func(backend *be, stmt *ops, const 
        /* dump args */
        if (ops && ops->nr < 0)
                return NULL;
+
+       rel = rel_optimizer(be->mvc, rel);
+
        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
@@ -919,6 +919,16 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                exp = exp_atom_ref(sql->sa, nr, &a->tpe);
                        }
                }
+               if (!exp) {
+                       old = *e;
+                       *e = 0;
+                       if (stack_find_var(sql, b)) {
+                               sql_subtype *tpe = stack_find_type(sql, b);
+                               int frame = stack_find_frame(sql, b);
+                               exp = exp_param(sql->sa, sa_strdup(sql->sa, b), 
tpe, frame);
+                       }
+                       *e = old;
+               }
                if (!exp && lrel) { 
                        int amb = 0;
                        char *cname;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to