Changeset: 4c929f516f64 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4c929f516f64
Modified Files:
        monetdb5/modules/mal/manifold.c
        monetdb5/optimizer/opt_inline.c
        monetdb5/optimizer/opt_multiplex.c
        monetdb5/optimizer/opt_remap.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
        sql/benchmarks/nobench/Tests/nobench.test.in
        sql/server/rel_optimizer.c
Branch: sequences_7184
Log Message:

More progress.


diffs (truncated from 467 to 300 lines):

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
@@ -201,6 +201,11 @@ MANIFOLDtypecheck(Client cntxt, MalBlkPt
        MalBlkPtr nmb;
        MALfcn fcn;
 
+       if (getArgType(mb, pci, pci->retc) == TYPE_lng) {
+               // TODO: trivial case
+               return NULL;
+       }
+
        if (pci->retc >1 || pci->argc > 8 || getModuleId(pci) == NULL) // 
limitation on MANIFOLDjob
                return NULL;
        // We need a private MAL context to resolve the function call
@@ -379,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,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))),
  { .imp=NULL }
diff --git a/monetdb5/optimizer/opt_inline.c b/monetdb5/optimizer/opt_inline.c
--- a/monetdb5/optimizer/opt_inline.c
+++ b/monetdb5/optimizer/opt_inline.c
@@ -31,8 +31,9 @@ OPTinlineMultiplex(MalBlkPtr mb, InstrPt
        Symbol s;
        str mod,fcn;
 
-       mod = VALget(&getVar(mb, getArg(p, p->retc+0))->value);
-       fcn = VALget(&getVar(mb, getArg(p, p->retc+1))->value);
+       int plus_one = getArgType(mb, p, p->retc) == TYPE_lng ? 1 : 0;
+       mod = VALget(&getVar(mb, getArg(p, p->retc+0+plus_one))->value);
+       fcn = VALget(&getVar(mb, getArg(p, p->retc+1+plus_one))->value);
        if ((s = findSymbolInModule(getModule(putName(mod)), putName(fcn))) == 
0)
                return false;
        return s->def->inlineProp;
diff --git a/monetdb5/optimizer/opt_multiplex.c 
b/monetdb5/optimizer/opt_multiplex.c
--- a/monetdb5/optimizer/opt_multiplex.c
+++ b/monetdb5/optimizer/opt_multiplex.c
@@ -50,10 +50,10 @@ OPTexpandMultiplex(Client cntxt, MalBlkP
                if (isAnyExpression(getArgType(mb, pci, i)))
                        throw(MAL, "optimizer.multiplex", SQLSTATE(HY002) 
"Target type is missing");
        }
-
-       mod = VALget(&getVar(mb, getArg(pci, pci->retc))->value);
+       int plus_one = getArgType(mb, pci, pci->retc) == TYPE_lng ? 1 : 0;
+       mod = VALget(&getVar(mb, getArg(pci, pci->retc + plus_one))->value);
        mod = putName(mod);
-       fcn = VALget(&getVar(mb, getArg(pci, pci->retc+1))->value);
+       fcn = VALget(&getVar(mb, getArg(pci, pci->retc+1 + plus_one))->value);
        fcn = putName(fcn);
        if(mod == NULL || fcn == NULL)
                throw(MAL, "optimizer.multiplex", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
@@ -66,7 +66,12 @@ OPTexpandMultiplex(Client cntxt, MalBlkP
        }
 #endif
 
-       /* search the iterator bat */
+       if (plus_one) {
+               q = newFcnCallArgs(mb, batRef, putName("densebat"), 2);
+               q = pushArgument(mb, q, getArg(pci, pci->retc));
+               iter = getArg(q,0);
+       }
+       else /* search the iterator bat */
        for (i = pci->retc+2; i < pci->argc; i++)
                if (isaBatType(getArgType(mb, pci, i))) {
                        iter = getArg(pci, i);
@@ -112,7 +117,7 @@ OPTexpandMultiplex(Client cntxt, MalBlkP
        (void) pushArgument(mb,q,iter);
 
        /* $1:= algebra.fetch(Ai,h) or constant */
-       for (i = pci->retc+2; i < pci->argc; i++) {
+       for (i = pci->retc+2+plus_one; i < pci->argc; i++) {
                if (getArg(pci, i) != iter && isaBatType(getArgType(mb, pci, 
i))) {
                        q = newFcnCall(mb, algebraRef, "fetch");
                        alias[i] = newTmpVariable(mb, getBatType(getArgType(mb, 
pci, i)));
@@ -123,7 +128,7 @@ OPTexpandMultiplex(Client cntxt, MalBlkP
        }
 
        /* cr:= mod.CMD($1,...,$n); */
-       q = newFcnCallArgs(mb, mod, fcn, pci->argc - 2);
+       q = newFcnCallArgs(mb, mod, fcn, pci->argc - 2 - plus_one);
        for (i = 0; i < pci->retc; i++) {
                int nvar = 0;
                if (bat) {
@@ -138,7 +143,7 @@ OPTexpandMultiplex(Client cntxt, MalBlkP
                        getArg(q, 0) = nvar;
        }
 
-       for (i = pci->retc+2; i < pci->argc; i++) {
+       for (i = pci->retc+2+plus_one; i < pci->argc; i++) {
                if (getArg(pci, i) == iter) {
                        q = pushArgument(mb, q, tvar);
                } else if (isaBatType(getArgType(mb, pci, i))) {
diff --git a/monetdb5/optimizer/opt_remap.c b/monetdb5/optimizer/opt_remap.c
--- a/monetdb5/optimizer/opt_remap.c
+++ b/monetdb5/optimizer/opt_remap.c
@@ -27,8 +27,9 @@ OPTremapDirect(Client cntxt, MalBlkPtr m
 
        (void) cntxt;
        (void) stk;
-       mod = VALget(&getVar(mb, getArg(pci, retc+0))->value);
-       fcn = VALget(&getVar(mb, getArg(pci, retc+1))->value);
+       int plus_one = getArgType(mb, pci, pci->retc) == TYPE_lng ? 1 : 0;
+       mod = VALget(&getVar(mb, getArg(pci, retc+0+plus_one))->value);
+       fcn = VALget(&getVar(mb, getArg(pci, retc+1+plus_one))->value);
 
        if(strncmp(mod,"bat",3)==0)
                mod+=3;
@@ -48,7 +49,14 @@ OPTremapDirect(Client cntxt, MalBlkPtr m
                else
                        p = pushReturn(mb, p, getArg(pci,i));
        p->retc= p->argc= pci->retc;
-       for(i= pci->retc+2; i<pci->argc; i++)
+
+
+
+       if (plus_one) {
+               p = addArgument(mb,p,getArg(pci,pci->retc)); // cardinality 
argument
+       }
+
+       for(i= pci->retc+2+plus_one; i<pci->argc; i++)
                p= addArgument(mb,p,getArg(pci,i));
        if (p->retc == 1 &&
                ((bufName == batcalcRef &&
@@ -341,7 +349,7 @@ OPTremapSwitched(Client cntxt, MalBlkPtr
        (void) stk;
        (void) scope;
 
-       if( !isMultiplex(pci) &&
+       if( !isMultiplex(pci) && getArgType(mb, pci, pci->retc) != TYPE_lng &&
                !isVarConstant(mb,getArg(pci,1)) &&
                !isVarConstant(mb,getArg(pci,2)) &&
                !isVarConstant(mb,getArg(pci,4)) &&
@@ -401,8 +409,9 @@ OPTremapImplementation(Client cntxt, Mal
                         * such as the calculator functions. It is particularly
                         * geared at handling the PSM code.
                         */
-                       str mod = VALget(&getVar(mb, getArg(p, 
p->retc+0))->value);
-                       str fcn = VALget(&getVar(mb, getArg(p, 
p->retc+1))->value);
+                       int plus_one = getArgType(mb, p, p->retc) == TYPE_lng ? 
1 : 0;
+                       str mod = VALget(&getVar(mb, getArg(p, 
p->retc+0+plus_one))->value);
+                       str fcn = VALget(&getVar(mb, getArg(p, 
p->retc+1+plus_one))->value);
                        //Symbol s = findSymbol(cntxt->usermodule, mod,fcn);
                        Symbol s = 
findSymbolInModule(getModule(putName(mod)),putName(fcn));
 
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,7 +1243,7 @@ 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) {
+               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)))) {
@@ -1277,8 +1277,8 @@ exp_bin(backend *be, sql_exp *e, stmt *l
 
                                if (!es)
                                        return NULL;
-                               if (rows && en == exps->h && f->func->type != 
F_LOADER)
-                                       es = stmt_const(be, rows, es);
+                               /*if (rows && en == exps->h && f->func->type != 
F_LOADER)
+                                       es = stmt_const(be, rows, es);*/
                                else if (f->func->type == F_ANALYTIC && 
es->nrcols == 0) {
                                        if (en == exps->h && left->nrcols)
                                                es = stmt_const(be, 
bin_find_smallest_column(be, left), es); /* ensure the first argument is a 
column */
@@ -1293,7 +1293,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                }
                stmt* args = stmt_list(be, l);
                args->argument_independence = e->argument_independence;
-               if (!(s = stmt_Nop(be, args, sel, f)))
+               if (!(s = stmt_Nop(be, args, sel, f, rows)))
                        return NULL;
        }       break;
        case e_aggr: {
@@ -1537,7 +1537,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                                                        list_append(args, l);
                                                        list_append(args, r);
                                                        list_append(args, 
stmt_bool(be, 1));
-                                                       s = stmt_Nop(be, 
stmt_list(be, args), sel, f);
+                                                       s = stmt_Nop(be, 
stmt_list(be, args), sel, f, NULL);
                                                }
                                        } else {
                                                s = stmt_binop(be, l, r, sel, 
f);
@@ -1671,7 +1671,7 @@ sql_Nop_(backend *be, const char *fname,
        }
 
        if ((f = sql_bind_func_(sql, "sys", fname, tl, F_FUNC)))
-               return stmt_Nop(be, stmt_list(be, sl), NULL, f);
+               return stmt_Nop(be, stmt_list(be, sl), NULL, f, NULL);
        return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "SELECT: no such 
operator '%s'", fname);
 }
 
@@ -2270,7 +2270,7 @@ rel2bin_hash_lookup(backend *be, sql_rel
                        sql_subfunc *xor = sql_bind_func_result(sql, "sys", 
"rotate_xor_hash", F_FUNC, lng, 3, lng, it, tail_type(s));
 
                        h = stmt_Nop(be, stmt_list(be, list_append( list_append(
-                               list_append(sa_list(sql->sa), h), bits), s)), 
NULL, xor);
+                               list_append(sa_list(sql->sa), h), bits), s)), 
NULL, xor, false);
                        semantics = 1;
                } else {
                        sql_subfunc *hf = sql_bind_func_result(sql, "sys", 
"hash", F_FUNC, lng, 1, tail_type(s));
@@ -2306,7 +2306,7 @@ join_hash_key( backend *be, list *l )
                if (h) {
                        sql_subfunc *xor = sql_bind_func_result(sql, "sys", 
"rotate_xor_hash", F_FUNC, lng, 3, lng, it, tail_type(s));
 
-                       h = stmt_Nop(be, stmt_list(be, list_append( 
list_append( list_append(sa_list(sql->sa), h), bits), s )), NULL, xor);
+                       h = stmt_Nop(be, stmt_list(be, list_append( 
list_append( list_append(sa_list(sql->sa), h), bits), s )), NULL, xor, NULL);
                } else {
                        sql_subfunc *hf = sql_bind_func_result(sql, "sys", 
"hash", F_FUNC, lng, 1, tail_type(s));
                        h = stmt_unop(be, s, NULL, hf);
@@ -2372,7 +2372,7 @@ releqjoin( backend *be, list *l1, list *
                }
                if (semantics)
                        list_append(ops, stmt_bool(be, 1));
-               cmp = stmt_Nop(be, stmt_list(be, ops), NULL, f);
+               cmp = stmt_Nop(be, stmt_list(be, ops), NULL, f, NULL);
                cmp = stmt_uselect(be, cmp, stmt_bool(be, 1), cmp_equal, NULL, 
0, 0);
                l = stmt_project(be, cmp, l );
                r = stmt_project(be, cmp, r );
@@ -4936,7 +4936,7 @@ hash_update(backend *be, sql_idx * i, st
                        h = stmt_Nop(be, stmt_list( be, list_append( 
list_append(
                                list_append(sa_list(sql->sa), h),
                                stmt_atom_int(be, bits)),  upd)), NULL,
-                               xor);
+                               xor, false);
                } else if (h)  {
                        stmt *h2;
                        sql_subfunc *lsh = sql_bind_func_result(sql, "sys", 
"left_shift", F_FUNC, lng, 2, lng, it);
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
@@ -3209,7 +3209,7 @@ stmt_unop(backend *be, stmt *op1, stmt *
 {
        list *ops = sa_list(be->mvc->sa);
        list_append(ops, op1);
-       stmt *r = stmt_Nop(be, stmt_list(be, ops), sel, op);
+       stmt *r = stmt_Nop(be, stmt_list(be, ops), sel, op, NULL);
        if (!r->cand)
                r->cand = op1->cand;
        return r;
@@ -3221,14 +3221,14 @@ stmt_binop(backend *be, stmt *op1, stmt 
        list *ops = sa_list(be->mvc->sa);
        list_append(ops, op1);
        list_append(ops, op2);
-       stmt *r = stmt_Nop(be, stmt_list(be, ops), sel, op);
+       stmt *r = stmt_Nop(be, stmt_list(be, ops), sel, op, NULL);
        if (!r->cand)
                r->cand = op1->cand?op1->cand:op2->cand;
        return r;
 }
 
 stmt *
-stmt_Nop(backend *be, stmt *ops, stmt *sel, sql_subfunc *f)
+stmt_Nop(backend *be, stmt *ops, stmt *sel, sql_subfunc *f, stmt* rows)
 {
        MalBlkPtr mb = be->mb;
        InstrPtr q = NULL;
@@ -3277,7 +3277,7 @@ stmt_Nop(backend *be, stmt *ops, stmt *s
                        return NULL;
                mod = sql_func_mod(f->func);
                fimp = sql_func_imp(f->func);
-               if (o && o->nrcols > 0 && f->func->type != F_LOADER && 
f->func->type != F_PROC) {
+               if (((o && o->nrcols > 0) || rows) && f->func->type != F_LOADER 
&& f->func->type != F_PROC) {
                        sql_subtype *res = f->res->h->data;
                        fimp = convertMultiplexFcn(fimp);
                        q = NULL;
@@ -3287,14 +3287,19 @@ stmt_Nop(backend *be, stmt *ops, stmt *s
                                return NULL;
                        if (!q) {
                                if (f->func->type == F_UNION)
-                                       q = newStmtArgs(mb, batmalRef, 
multiplexRef, (f->res && list_length(f->res) ? list_length(f->res) : 1) + 
list_length(ops->op4.lval) + 6);
-                               else
-                                       q = newStmtArgs(mb, malRef, 
multiplexRef, (f->res && list_length(f->res) ? list_length(f->res) : 1) + 
list_length(ops->op4.lval) + 6 + ops->argument_independence);
+                                               q = newStmtArgs(mb, batmalRef, 
multiplexRef, (f->res && list_length(f->res) ? list_length(f->res) : 1) + 
list_length(ops->op4.lval) + 6);
+                               else {
+                                       if (ops->argument_independence) {
+                                               stmt *card = stmt_aggr(be, 
rows, NULL, NULL, sql_bind_func(be->mvc, "sys", "count", 
sql_bind_localtype("void"), NULL, F_AGGR), 1, 0, 1);
+                                               q = newStmtArgs(mb, malRef, 
multiplexRef, (f->res && list_length(f->res) ? list_length(f->res) : 1) + 
list_length(ops->op4.lval) + 7);
+                                               q = pushArgument(mb, q, 
card->nr);
+                                       }
+                                       else
+                                               q = newStmtArgs(mb, malRef, 
multiplexRef, (f->res && list_length(f->res) ? list_length(f->res) : 1) + 
list_length(ops->op4.lval) + 6);
+                               }
                                if (q == NULL)
                                        return NULL;
                                setVarType(mb, getArg(q, 0), 
newBatType(res->type->localtype));
-                               if (ops->argument_independence)
-                                       q = pushLng(mb, q, 0); // Represents 
input cardinality which signals the multiplex optimizer to use a manifold 
implementation or bulkoperator which is only dependent of the input cardinality.
                                q = pushStr(mb, q, mod);
                                q = pushStr(mb, q, fimp);
                        } else {
@@ -3360,7 +3365,7 @@ stmt_Nop(backend *be, stmt *ops, stmt *s
                }
                s->op1 = ops;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to