Changeset: 3491ea3bc8b1 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3491ea3bc8b1
Modified Files:
sql/backends/monet5/Tests/rapi00.sql
sql/backends/monet5/sql.c
sql/backends/monet5/sql_gencode.c
sql/server/rel_psm.c
Branch: RIntegration
Log Message:
pass body as first argument to the rapi.eval function
diffs (193 lines):
diff --git a/sql/backends/monet5/Tests/rapi00.sql
b/sql/backends/monet5/Tests/rapi00.sql
--- a/sql/backends/monet5/Tests/rapi00.sql
+++ b/sql/backends/monet5/Tests/rapi00.sql
@@ -22,7 +22,7 @@ language R {
select * from functions where name = 'rapi00';
-select * from rapi00() as R;
+explain select * from rapi00() as R;
drop function rapi00;
drop table rapitable;
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -888,7 +888,7 @@ create_func(mvc *sql, char *sname, sql_f
if (!s)
s = cur_schema(sql);
nf = mvc_create_func(sql, NULL, s, f->base.name, f->ops, &f->res,
f->type, f->lang, f->mod, f->imp, f->query);
- if (nf && nf->query) {
+ if (nf && nf->query && nf->lang <= FUNC_LANG_SQL) {
char *buf;
sql_rel *r = NULL;
sql_allocator *sa = sql->sa;
@@ -910,7 +910,7 @@ create_func(mvc *sql, char *sname, sql_f
}
sa_destroy(sql->sa);
sql->sa = sa;
- } else {
+ } else if (nf->lang == FUNC_LANG_MAL) {
if (!backend_resolve_function(sql, nf))
return sql_message("3F000!CREATE %s%s: external name
%s.%s not bound", KF, F, nf->mod, nf->base.name);
}
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
@@ -629,8 +629,9 @@ dump_joinN(backend *sql, MalBlkPtr mb, s
InstrPtr q;
int op1, op2, op3 = 0;
bit swapped = (s->flag & SWAPPED) ? TRUE : FALSE;
+ sql_func *f = s->op4.funcval->func;
- if (backend_create_func(sql, s->op4.funcval->func) < 0)
+ if (backend_create_func(sql, f) < 0)
return -1;
mod = sql_func_mod(s->op4.funcval->func);
fimp = sql_func_imp(s->op4.funcval->func);
@@ -644,6 +645,8 @@ dump_joinN(backend *sql, MalBlkPtr mb, s
/* filter qualifying tuples, return oids of h and tail */
q = newStmt(mb, mod, fimp);
q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+ if (f->lang == FUNC_LANG_R)
+ q = pushStr(mb, q, f->query);
q = pushArgument(mb, q, op1);
q = pushArgument(mb, q, op2);
if (s->op3)
@@ -1060,13 +1063,16 @@ static int
if (get_cmp(s) == cmp_filter) {
node *n;
char *mod, *fimp;
+ sql_func *f = s->op4.funcval->func;
- if (backend_create_func(sql,
s->op4.funcval->func) < 0)
+ if (backend_create_func(sql, f) < 0)
return -1;
mod =
sql_func_mod(s->op4.funcval->func);
fimp =
sql_func_imp(s->op4.funcval->func);
q = newStmt(mb, mod,
convertOperator(fimp));
+ if (f->lang == FUNC_LANG_R)
+ q = pushStr(mb, q, f->query);
q = pushArgument(mb, q, l);
if (sub > 0)
q = pushArgument(mb, q, sub);
@@ -1560,8 +1566,9 @@ static int
case st_unop:{
char *mod, *fimp;
int l = _dumpstmt(sql, mb, s->op1);
+ sql_func *f = s->op4.funcval->func;
- if (backend_create_func(sql, s->op4.funcval->func) < 0)
+ if (backend_create_func(sql, f) < 0)
return -1;
mod = sql_func_mod(s->op4.funcval->func);
fimp = sql_func_imp(s->op4.funcval->func);
@@ -1583,6 +1590,8 @@ static int
q = pushArgument(mb, q, l);
} else {
q = newStmt(mb, mod, fimp);
+ if (f->lang == FUNC_LANG_R)
+ q = pushStr(mb, q, f->query);
q = pushArgument(mb, q, l);
}
s->nr = getDestVar(q);
@@ -1595,8 +1604,9 @@ static int
char *mod, *fimp;
int l = _dumpstmt(sql, mb, s->op1);
int r = _dumpstmt(sql, mb, s->op2);
+ sql_func *f = s->op4.funcval->func;
- if (backend_create_func(sql, s->op4.funcval->func) < 0)
+ if (backend_create_func(sql, f) < 0)
return -1;
mod = sql_func_mod(s->op4.funcval->func);
fimp = sql_func_imp(s->op4.funcval->func);
@@ -1623,6 +1633,8 @@ static int
s->nr = getDestVar(q);
} else {
q = newStmt(mb, mod, convertOperator(fimp));
+ if (f->lang == FUNC_LANG_R)
+ q = pushStr(mb, q, f->query);
q = pushArgument(mb, q, l);
if (special) {
q = pushInt(mb, q, tpe->digits);
@@ -1673,6 +1685,8 @@ static int
if (strcmp(fimp, "round") == 0 && tpe &&
tpe->type->eclass == EC_DEC)
special = 1;
+ if (f->func->lang == FUNC_LANG_R)
+ q = pushStr(mb, q, f->func->query);
for (n = s->op1->op4.lval->h; n; n = n->next) {
stmt *op = n->data;
@@ -2422,9 +2436,17 @@ monet5_resolve_function(ptr M, sql_func
*/
}
-/* TODO handle aggr */
-int
-backend_create_func(backend *be, sql_func *f)
+static int
+backend_create_r_func(backend *be, sql_func *f)
+{
+ (void)be;
+ f->mod = "rapi";
+ f->imp = "eval";
+ return 0;
+}
+
+static int
+backend_create_sql_func(backend *be, sql_func *f)
{
mvc *m = be->mvc;
sql_schema *schema = m->session->schema;
@@ -2525,3 +2547,20 @@ backend_create_func(backend *be, sql_fun
c->curprg = backup;
return 0;
}
+
+/* TODO handle aggr */
+int
+backend_create_func(backend *be, sql_func *f)
+{
+ switch(f->lang) {
+ case FUNC_LANG_MAL:
+ case FUNC_LANG_SQL:
+ return backend_create_sql_func(be, f);
+ case FUNC_LANG_R:
+ return backend_create_r_func(be, f);
+ case FUNC_LANG_C:
+ case FUNC_LANG_J:
+ default:
+ return -1;
+ }
+}
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -755,11 +755,22 @@ rel_create_func(mvc *sql, dlist *qname,
}
if (body && lang != FUNC_LANG_SQL) {
+ char *lang_body = body->h->data.sval;
char *mod = (lang == FUNC_LANG_R)?"rapi":
(lang == FUNC_LANG_C)?"capi":
(lang ==
FUNC_LANG_J)?"japi":"unknown";
- if (create)
- f = mvc_create_func(sql, sql->sa, s,
fname, l, restype, type, lang, mod, fname, q);
+ if (create) {
+ f = mvc_create_func(sql, sql->sa, s,
fname, l, restype, type, lang, mod, fname, lang_body);
+ } else if (!sf) {
+ return sql_error(sql, 01, "CREATE %s%s:
R function %s.%s not bound", KF, F, s->base.name, fname );
+ } else {
+ sql_func *f = sf->func;
+ f->mod = _STRDUP("rapi");
+ f->imp = _STRDUP("eval");
+ if (res && restype)
+ f->res = *restype;
+ f->sql = 0; /* native */
+ }
} else if (body && lang == FUNC_LANG_SQL) {
list *b = NULL;
sql_schema *old_schema = cur_schema(sql);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list