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