Changeset: 06c6851b3b1c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=06c6851b3b1c
Modified Files:
        sql/backends/monet5/sql_gencode.c
Branch: default
Log Message:

allow for vararg (sofar only table functions)


diffs (117 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
@@ -629,7 +629,7 @@ multiplexN(MalBlkPtr mb, char *mod, char
        return q;
 }
 
-static int backend_create_subfunc(backend *be, sql_subfunc *f);
+static int backend_create_subfunc(backend *be, sql_subfunc *f, list *ops);
 static int backend_create_subaggr(backend *be, sql_subaggr *f);
 
 #define SMALLBUFSIZ 64
@@ -641,7 +641,7 @@ dump_joinN(backend *sql, MalBlkPtr mb, s
        int op1, op2, op3 = 0;
        bit swapped = (s->flag & SWAPPED) ? TRUE : FALSE;
 
-       if (backend_create_subfunc(sql, s->op4.funcval) < 0)
+       if (backend_create_subfunc(sql, s->op4.funcval, NULL) < 0)
                return -1;
        mod = sql_func_mod(s->op4.funcval->func);
        fimp = sql_func_imp(s->op4.funcval->func);
@@ -1074,7 +1074,7 @@ static int
                                        node *n;
                                        char *mod, *fimp;
 
-                                       if (backend_create_subfunc(sql, 
s->op4.funcval) < 0)
+                                       if (backend_create_subfunc(sql, 
s->op4.funcval, NULL) < 0)
                                                return -1;
                                        mod = 
sql_func_mod(s->op4.funcval->func);
                                        fimp = 
sql_func_imp(s->op4.funcval->func);
@@ -1579,7 +1579,7 @@ static int
                        /* dump operands */
                        _dumpstmt(sql, mb, s->op1);
 
-                       if (backend_create_subfunc(sql, f) < 0)
+                       if (backend_create_subfunc(sql, f, s->op1->op4.lval) < 
0)
                                return -1;
                        mod = sql_func_mod(f->func);
                        fimp = sql_func_imp(f->func);
@@ -2361,7 +2361,7 @@ monet5_resolve_function(ptr M, sql_func 
 
 /* TODO handle aggr */
 static int
-backend_create_func(backend *be, sql_func *f, list *restypes)
+backend_create_func(backend *be, sql_func *f, list *restypes, list *ops)
 {
        mvc *m = be->mvc;
        sql_schema *schema = m->session->schema;
@@ -2370,13 +2370,14 @@ backend_create_func(backend *be, sql_fun
        Client c = be->client;
        Symbol backup = NULL;
        stmt *s;
-       int i, retseen = 0, sideeffects = 0;
+       int i, retseen = 0, sideeffects = 0, vararg = (f->varres || f->vararg);
        sql_allocator *sa, *osa = m->sa;
 
        /* nothing to do for internal and ready (not recompiling) functions */
-       if (!f->sql || f->sql > 1)
+       if (!f->sql || (!vararg && f->sql > 1))
                return 0;
-       f->sql++;
+       if (!vararg)
+               f->sql++;
        sa = sa_create();
        m->session->schema = f->s;
        s = sql_parse(m, sa, f->query, m_instantiate);
@@ -2388,7 +2389,8 @@ backend_create_func(backend *be, sql_fun
        }
 
        if (!s) {
-               f->sql--;
+               if (!vararg)
+                       f->sql--;
                sa_destroy(sa);
                return -1;
        }
@@ -2411,6 +2413,23 @@ backend_create_func(backend *be, sql_fun
        }
        setVarUDFtype(curBlk, 0);
 
+       if (f->vararg && ops) {
+               int argc = 0;
+               node *n;
+
+               for (n = ops->h; n; n = n->next, argc++) {
+                       stmt *s = n->data;
+                       int type = tail_type(s)->type->localtype;
+                       int varid = 0;
+                       char *buf = GDKmalloc(MAXIDENTLEN);
+
+                       (void) snprintf(buf, MAXIDENTLEN, "A%d", argc);
+                       varid = newVariable(curBlk, buf, type);
+                       curInstr = pushArgument(curBlk, curInstr, varid);
+                       setVarType(curBlk, varid, type);
+                       setVarUDFtype(curBlk, varid);
+               }
+       } else
        if (f->ops) {
                int argc = 0;
                node *n;
@@ -2465,13 +2484,13 @@ backend_create_func(backend *be, sql_fun
 }
 
 static int
-backend_create_subfunc(backend *be, sql_subfunc *f)
+backend_create_subfunc(backend *be, sql_subfunc *f, list *ops)
 {
-       return backend_create_func(be, f->func, f->res);
+       return backend_create_func(be, f->func, f->res, ops);
 }
 
 static int
 backend_create_subaggr(backend *be, sql_subaggr *f)
 {
-       return backend_create_func(be, f->aggr, f->res);
+       return backend_create_func(be, f->aggr, f->res, NULL);
 }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to