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