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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list