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