Changeset: 158e0108771c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/158e0108771c
Modified Files:
        monetdb5/modules/mal/iterator.c
        monetdb5/modules/mal/manifold.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/server/rel_optimizer.c
Branch: sequences_7184
Log Message:

And more progress...


diffs (106 lines):

diff --git a/monetdb5/modules/mal/iterator.c b/monetdb5/modules/mal/iterator.c
--- a/monetdb5/modules/mal/iterator.c
+++ b/monetdb5/modules/mal/iterator.c
@@ -145,7 +145,7 @@ ITRbunIterator(Client cntxt, MalBlkPtr m
        *head = 0;
 
        bi = bat_iterator(b);
-       if (VALinit(tail, b->ttype, BUNtail(bi, *head)) == NULL) {
+       if (VALinit(tail, ATOMtype(b->ttype), BUNtail(bi, *head)) == NULL) {
                bat_iterator_end(&bi);
                BBPunfix(b->batCacheid);
                throw(MAL, "iterator.nextChunk", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
@@ -181,7 +181,7 @@ ITRbunNext(Client cntxt, MalBlkPtr mb, M
                return MAL_SUCCEED;
        }
        bi = bat_iterator(b);
-       if (VALinit(tail, b->ttype, BUNtail(bi, *head)) == NULL) {
+       if (VALinit(tail, ATOMtype(b->ttype), BUNtail(bi, *head)) == NULL) {
                bat_iterator_end(&bi);
                BBPunfix(b->batCacheid);
                throw(MAL, "iterator.nextChunk", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
diff --git a/monetdb5/modules/mal/manifold.c b/monetdb5/modules/mal/manifold.c
--- a/monetdb5/modules/mal/manifold.c
+++ b/monetdb5/modules/mal/manifold.c
@@ -384,6 +384,7 @@ MANIFOLDremapMultiplex(Client cntxt, Mal
 #include "mel.h"
 mel_func manifold_init_funcs[] = {
  pattern("mal", "multiplex", MANIFOLDremapMultiplex, false, "", args(1,4, 
varargany("",0),arg("mod",str),arg("fcn",str),varargany("a",0))),
+ pattern("mal", "multiplex", MANIFOLDremapMultiplex, false, "", args(1,4, 
varargany("",0),arg("card", lng), arg("mod",str),arg("fcn",str))),
  pattern("mal", "multiplex", MANIFOLDremapMultiplex, false, "", args(1,5, 
varargany("",0),arg("card", lng), 
arg("mod",str),arg("fcn",str),varargany("a",0))),
  pattern("batmal", "multiplex", MANIFOLDremapMultiplex, false, "", args(1,4, 
varargany("",0),arg("mod",str),arg("fcn",str),varargany("a",0))),
  pattern("mal", "manifold", MANIFOLDevaluate, false, "", args(1,4, 
batargany("",0),arg("mod",str),arg("fcn",str),varargany("a",0))),
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
@@ -1243,19 +1243,8 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                stmt *rows = NULL;
                int push_cands = can_push_cands(sel, f);
 
-               if (f->func->side_effect && left && left->nrcols > 0 && 
f->func->type != F_LOADER) {
-                       sql_subfunc *f1 = NULL;
-                       /* we cannot assume all SQL functions with no arguments 
have a correspondent with one argument, so attempt to find it. 'rand' function 
is the exception */
-                       if (list_empty(exps) && (strcmp(f->func->base.name, 
"rand") == 0 || (f1 = sql_find_func(sql, f->func->s ? f->func->s->base.name : 
NULL, f->func->base.name, 1, f->func->type, NULL)))) {
-                               if (f1)
-                                       f = f1;
-                               list_append(l, stmt_const(be, 
bin_find_smallest_column(be, left),
-                                                                               
  stmt_atom(be, atom_general(sql->sa, f1 ? 
&(((sql_arg*)f1->func->ops->h->data)->type) : sql_bind_localtype("int"), 
NULL))));
-                       } else if (exps_card(exps) < CARD_MULTI) {
-                               rows = bin_find_smallest_column(be, left);
-                       }
-                       sql->session->status = 0; /* if the function was not 
found clean the error */
-                       sql->errstr[0] = '\0';
+               if (f->func->side_effect && left && left->nrcols > 0 && 
f->func->type != F_LOADER && exps_card(exps) < CARD_MULTI) {
+                       rows = bin_find_smallest_column(be, left);
                }
                assert(!e->r);
                if (strcmp(sql_func_mod(f->func), "") == 0 && 
strcmp(sql_func_imp(f->func), "") == 0 && strcmp(f->func->base.name, "star") == 
0)
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
@@ -3365,9 +3365,11 @@ stmt_Nop(backend *be, stmt *ops, stmt *s
                }
                s->op1 = ops;
                if (o) {
-                       s->nrcols = rows? rows->nrcols:o->nrcols;
+                       s->nrcols = o->nrcols;
                        s->key = o->key;
                        s->aggr = o->aggr;
+               } else if (rows) {
+                       s->nrcols = rows->nrcols;
                } else {
                        s->nrcols = 0;
                        s->key = 1;
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -9073,8 +9073,18 @@ static bool
        switch(e->type) {
        case e_func: // I.e. f() or f(arg) or f(arg1, ..., argn)
                {
+               is_independent = true;
+
+               sql_subfunc *f = e->f;
+               if (strcmp(sql_func_mod(f->func), "") == 0 && 
strcmp(sql_func_imp(f->func), "") == 0 && strcmp(f->func->base.name, "star") == 
0) {
+                       /* the star() function call signals that the parent 
expression is a function call
+                        * to some window function without column expressions.
+                        * We do not optimize such window functions here.*/
+                       is_independent = false;
+                       break;
+               }
+
                list* args = e->l;// The list of actual arguments which can be 
empty
-               is_independent = true;
                if (args)
                        for (node *en = args->h; en; en = en->next) {
                                sql_exp* arg = en->data;
@@ -9091,6 +9101,9 @@ static bool
                if (is_independent)
                        e->argument_independence = 1;
                break;
+       case e_cmp:
+               is_independent = _rel_flag_independent_projections(sql, e->l, 
projected_from) && _rel_flag_independent_projections(sql, e->r, projected_from);
+               break;
        case e_atom: // Any atom potentially aliased, e.g. 2 as i
                is_independent = true;
                break;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to