Changeset: 8c41694f7605 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8c41694f7605
Modified Files:
        gdk/gdk_private.h
        monetdb5/modules/atoms/Makefile.ag
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
        sql/scripts/Makefile.ag
        sql/server/rel_select.c
Branch: graph0
Log Message:

MAL entry point


diffs (171 lines):

diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -155,8 +155,9 @@ void BBPdump(void);         /* never called: fo
        __attribute__((__visibility__("hidden")));
 __hidden Hash *HASHnew(Heap *hp, int tpe, BUN size, BUN mask, BUN count)
        __attribute__((__visibility__("hidden")));
-__hidden gdk_return HEAPalloc(Heap *h, size_t nitems, size_t itemsize)
-       __attribute__((__visibility__("hidden")));
+//__hidden gdk_return HEAPalloc(Heap *h, size_t nitems, size_t itemsize)
+//     __attribute__((__visibility__("hidden")));
+gdk_return HEAPalloc(Heap *h, size_t nitems, size_t itemsize);
 __hidden gdk_return HEAPcopy(Heap *dst, Heap *src)
        __attribute__((__visibility__("hidden")));
 __hidden int HEAPdelete(Heap *h, const char *o, const char *ext)
diff --git a/monetdb5/modules/atoms/Makefile.ag 
b/monetdb5/modules/atoms/Makefile.ag
--- a/monetdb5/modules/atoms/Makefile.ag
+++ b/monetdb5/modules/atoms/Makefile.ag
@@ -23,6 +23,7 @@ lib_atoms = {
                json.c json.h \
                mcurl.c \
                mtime.c mtime.h \
+               nested.c \
                str.c str.h \
                streams.c streams.h \
                url.c url.h \
@@ -42,6 +43,7 @@ headers_mal = {
                json.mal \
                mcurl.mal \
                mtime.mal \
+               nested.mal \
                streams.mal \
                str.mal \
                url.mal \
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -495,7 +495,11 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                                as = const_column(be, as);
                        }
                }
-               s = stmt_aggr(be, as, grp, ext, a, 1, need_no_nil(e) /* ignore 
nil*/ );
+               if(strcmp(a->aggr->base.name, "nest") == 0 && 
strcmp(a->aggr->s->base.name, "sys") == 0){
+                       s = stmt_nest(be, as, grp, ext, cnt, a);
+               } else {
+                       s = stmt_aggr(be, as, grp, ext, a, 1, need_no_nil(e) /* 
ignore nil*/ );
+               }
                if (find_prop(e->p, PROP_COUNT)) /* propagate count == 0 ipv 
NULL in outer joins */
                        s->flag |= OUTER_ZERO;
        }       break;
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
@@ -2878,6 +2878,36 @@ stmt_aggr(backend *be, stmt *op1, stmt *
        return NULL;
 }
 
+stmt *stmt_nest(backend *be, stmt *ops, stmt *grp, stmt *ext, stmt *histo, 
sql_subaggr *aggr){
+       InstrPtr q = NULL;
+
+       (void) ext; // not used ftm
+       assert(ops->type == st_list);
+
+       q = newStmt(be->mb, aggr->aggr->mod, aggr->aggr->imp);
+       if(!q) return NULL;
+       setVarType(be->mb, getArg(q, 0), newBatType( ((sql_subtype*) 
aggr->res->h->data)->type->localtype ));
+       setVarUDFtype(be->mb, getArg(q, 0)); // TODO: what is this?
+       q = pushArgument(be->mb, q, grp->nr);
+       q = pushArgument(be->mb, q, histo->nr);
+
+       if(q) { // same as stmt_aggr
+               stmt *s = stmt_create(be->mvc->sa, st_aggr);
+               s->op1 = ops;
+               s->op2 = grp;
+               s->op3 = histo;
+               s->nrcols = 1;
+               s->key = s->aggr = true;
+               s->flag = 1;
+               s->op4.aggrval = aggr;
+               s->nr = getDestVar(q);
+               s->q = q;
+               return s;
+       }
+       return NULL;
+
+}
+
 static stmt *
 stmt_alias_(backend *be, stmt *op1, const char *tname, const char *alias)
 {
diff --git a/sql/backends/monet5/sql_statement.h 
b/sql/backends/monet5/sql_statement.h
--- a/sql/backends/monet5/sql_statement.h
+++ b/sql/backends/monet5/sql_statement.h
@@ -217,6 +217,7 @@ extern stmt *stmt_binop(backend *be, stm
 extern stmt *stmt_Nop(backend *be, stmt *ops, sql_subfunc *op);
 extern stmt *stmt_func(backend *be, stmt *ops, const char *name, sql_rel *imp, 
int f_union);
 extern stmt *stmt_aggr(backend *be, stmt *op1, stmt *grp, stmt *ext, 
sql_subaggr *op, int reduce, int no_nil);
+extern stmt *stmt_nest(backend *be, stmt *ops, stmt *grp, stmt *ext, stmt 
*histo, sql_subaggr *aggr);
 
 extern stmt *stmt_alias(backend *be, stmt *op1, const char *tname, const char 
*name);
 
diff --git a/sql/scripts/Makefile.ag b/sql/scripts/Makefile.ag
--- a/sql/scripts/Makefile.ag
+++ b/sql/scripts/Makefile.ag
@@ -26,6 +26,7 @@ headers_sql = {
                25_debug.sql \
                26_sysmon.sql \
                27_rejects.sql \
+               35_nested.sql \
                39_analytics.sql \
                40_json.sql \
                41_md5sum.sql \
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -3237,33 +3237,41 @@ rel_nop(mvc *sql, sql_rel **rel, symbol 
        dnode *ops = l->next->data.lval->h;
        list *exps = new_exp_list(sql->sa);
        list *tl = sa_list(sql->sa);
-       sql_subfunc *f = NULL;
        sql_subtype *obj_type = NULL;
        char *fname = qname_fname(l->data.lval);
        char *sname = qname_schema(l->data.lval);
        sql_schema *s = sql->session->schema;
        exp_kind iek = {type_value, card_column, FALSE};
-
-       for (; ops; ops = ops->next, nr_args++) {
+       bool bind_error = false;
+
+       for (; ops && !bind_error; ops = ops->next, nr_args++) {
                sql_exp *e = rel_value_exp(sql, rel, ops->data.sym, fs, iek);
                sql_subtype *tpe;
 
-               if (!e) 
-                       return NULL;
-               append(exps, e);
-               tpe = exp_subtype(e);
-               if (!nr_args)
-                       obj_type = tpe;
-               append(tl, tpe);
+               if (!e) {
+                       bind_error = true;
+               } else {
+                       append(exps, e);
+                       tpe = exp_subtype(e);
+                       if (!nr_args)
+                               obj_type = tpe;
+                       append(tl, tpe);
+               }
        }
        if (sname)
                s = mvc_bind_schema(sql, sname);
        
-       /* first try aggregate */
-       f = find_func(sql, s, fname, nr_args, F_AGGR, NULL);
-       if (f)
+       /* try again with an aggregate */
+       if (bind_error) {
+               sql_subfunc *f = find_func(sql, s, fname, nr_args, F_AGGR, 
NULL);
+               if (!f) return NULL; // no match in the aggr~ world => error
+               // reset the error
+               sql->session->status = 0;
+               sql->errstr[0] = '\0';
                return _rel_aggr(sql, rel, 0, s, fname, l->next->data.lval->h, 
fs);
-       return _rel_nop(sql, s, fname, tl, exps, obj_type, nr_args, ek);
+       } else {
+               return _rel_nop(sql, s, fname, tl, exps, obj_type, nr_args, ek);
+       }
 
 }
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to