Changeset: 623aa3f321dd for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=623aa3f321dd
Modified Files:
monetdb5/optimizer/opt_mergetable.c
monetdb5/optimizer/opt_prelude.c
monetdb5/optimizer/opt_prelude.h
monetdb5/optimizer/opt_support.c
monetdb5/optimizer/opt_support.h
sql/backends/monet5/sql.c
sql/backends/monet5/sql_optimizer.c
sql/server/sql_mvc.h
Branch: Jun2016
Log Message:
handle sample in mitosis/mergetable
renamed point_query into no_mitosis.
disabled mitosis on select * from table queries.
diffs (195 lines):
diff --git a/monetdb5/optimizer/opt_mergetable.c
b/monetdb5/optimizer/opt_mergetable.c
--- a/monetdb5/optimizer/opt_mergetable.c
+++ b/monetdb5/optimizer/opt_mergetable.c
@@ -1439,6 +1439,37 @@ mat_topn(MalBlkPtr mb, InstrPtr p, matli
}
}
+static void
+mat_sample(MalBlkPtr mb, InstrPtr p, matlist_t *ml, int m)
+{
+ int tpe = getArgType(mb,p,0), k, piv;
+ InstrPtr pck, q;
+
+ pck = newInstruction(mb,ASSIGNsymbol);
+ setModuleId(pck, matRef);
+ setFunctionId(pck, packRef);
+ getArg(pck,0) = getArg(p,0);
+
+ for(k=1; k< ml->v[m].mi->argc; k++) {
+ q = copyInstruction(p);
+ getArg(q,0) = newTmpVariable(mb, tpe);
+ getArg(q,q->retc) = getArg(ml->v[m].mi,k);
+ pushInstruction(mb,q);
+ pck = pushArgument(mb, pck, getArg(q,0));
+ }
+
+ piv = ml->top;
+ mat_add_var(ml, pck, p, getArg(p,0), mat_slc, m, -1);
+ pushInstruction(mb,pck);
+
+ q = copyInstruction(p);
+ getArg(q,q->retc) = getArg(pck,0);
+ pushInstruction(mb,q);
+
+ ml->v[piv].packed = 1;
+ ml->v[piv].type = mat_slc;
+}
+
int
OPTmergetableImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr p)
{
@@ -1580,6 +1611,12 @@ OPTmergetableImplementation(Client cntxt
continue;
}
+ if (match == 1 && bats == 1 && p->argc == 3 && isSample(p) &&
((m=is_a_mat(getArg(p,p->retc), &ml)) >= 0)) {
+ mat_sample(mb, p, &ml, m);
+ actions++;
+ continue;
+ }
+
if (!distinct_topn && match == 1 && bats == 1 &&
(p->argc-p->retc) == 4 && isTopn(p) && ((m=is_a_mat(getArg(p,p->retc), &ml)) >=
0)) {
mat_topn(mb, p, &ml, m, -1, -1);
actions++;
@@ -1768,7 +1805,6 @@ OPTmergetableImplementation(Client cntxt
for (k = p->retc; k<p->argc; k++) {
if((m=is_a_mat(getArg(p,k), &ml)) >= 0){
mat_pack(mb, ml.v, m);
- actions++;
}
}
pushInstruction(mb, copyInstruction(p));
diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c
--- a/monetdb5/optimizer/opt_prelude.c
+++ b/monetdb5/optimizer/opt_prelude.c
@@ -214,7 +214,9 @@ str subavgRef;
str subsortRef;
str takeRef;
str not_uniqueRef;
+str sampleRef;
str subuniqueRef;
+str subuniformRef;
str unlockRef;
str unpackRef;
str unpinRef;
@@ -428,7 +430,9 @@ void optimizerInit(void)
takeRef= putName("take",5);
timestampRef = putName("timestamp", 9);
not_uniqueRef= putName("not_unique",10);
+ sampleRef= putName("sample",6);
subuniqueRef= putName("subunique",9);
+ subuniformRef= putName("subuniform",10);
unlockRef= putName("unlock",6);
unpackRef = putName("unpack",6);
unpinRef = putName("unpin",5);
diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h
--- a/monetdb5/optimizer/opt_prelude.h
+++ b/monetdb5/optimizer/opt_prelude.h
@@ -209,7 +209,9 @@ opt_export str subsortRef;
opt_export str timestampRef;
opt_export str takeRef;
opt_export str not_uniqueRef;
+opt_export str sampleRef;
opt_export str subuniqueRef;
+opt_export str subuniformRef;
opt_export str unpackRef;
opt_export str unpinRef;
opt_export str unlockRef;
diff --git a/monetdb5/optimizer/opt_support.c b/monetdb5/optimizer/opt_support.c
--- a/monetdb5/optimizer/opt_support.c
+++ b/monetdb5/optimizer/opt_support.c
@@ -677,7 +677,12 @@ int isTopn(InstrPtr p){
int isSlice(InstrPtr p){
return (getModuleId(p) == algebraRef &&
- getFunctionId(p) == subsliceRef);
+ getFunctionId(p) == subsliceRef);
+}
+
+int isSample(InstrPtr p){
+ return (getModuleId(p) == sampleRef &&
+ getFunctionId(p) == subuniformRef);
}
int isOrderby(InstrPtr p){
diff --git a/monetdb5/optimizer/opt_support.h b/monetdb5/optimizer/opt_support.h
--- a/monetdb5/optimizer/opt_support.h
+++ b/monetdb5/optimizer/opt_support.h
@@ -108,6 +108,7 @@ opt_export int isMapOp(InstrPtr q);
opt_export int isLikeOp(InstrPtr q);
opt_export int isTopn(InstrPtr q);
opt_export int isSlice(InstrPtr q);
+opt_export int isSample(InstrPtr q);
opt_export int isOrderby(InstrPtr q);
opt_export int isSubSelect(InstrPtr q);
opt_export int isSubJoin(InstrPtr q);
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -61,16 +61,16 @@ exp_is_point_select(sql_exp *e)
}
static int
-rel_is_point_query(sql_rel *rel)
+rel_no_mitosis(sql_rel *rel)
{
int is_point = 0;
- if (!rel)
+ if (!rel || is_basetable(rel->op))
return 1;
if (is_project(rel->op))
- return rel_is_point_query(rel->l);
+ return rel_no_mitosis(rel->l);
if (is_modify(rel->op) && rel->card <= CARD_AGGR)
- return rel_is_point_query(rel->r);
+ return rel_no_mitosis(rel->r);
if (is_select(rel->op) && rel_is_table(rel->l) && rel->exps) {
is_point = 0;
/* just one point expression makes this a point query */
@@ -120,8 +120,8 @@ sql_symbol2relation(mvc *c, symbol *sym)
r = rel_optimizer(c, r);
r = rel_distribute(c, r);
r = rel_partition(c, r);
- if (rel_is_point_query(r) || rel_need_distinct_query(r))
- c->point_query = 1;
+ if (rel_no_mitosis(r) || rel_need_distinct_query(r))
+ c->no_mitosis = 1;
}
return r;
}
@@ -175,7 +175,7 @@ sqlcleanup(mvc *c, int err)
if (err <0)
c->session->status = err;
c->label = 0;
- c->point_query = 0;
+ c->no_mitosis = 0;
scanner_query_processed(&(c->scanner));
return err;
}
diff --git a/sql/backends/monet5/sql_optimizer.c
b/sql/backends/monet5/sql_optimizer.c
--- a/sql/backends/monet5/sql_optimizer.c
+++ b/sql/backends/monet5/sql_optimizer.c
@@ -115,8 +115,7 @@ addOptimizers(Client c, MalBlkPtr mb, ch
msg = addOptimizerPipe(c, mb, pipe);
if (msg)
GDKfree(msg); /* what to do with an error? */
- /* point queries do not require mitosis and dataflow */
- if (be->mvc->point_query) {
+ if (be->mvc->no_mitosis) {
for (i = mb->stop - 1; i > 0; i--) {
q = getInstrPtr(mb, i);
if (q->token == ENDsymbol)
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -96,7 +96,7 @@ typedef struct mvc {
int argc;
int argmax;
struct symbol *sym;
- int point_query; /* mark when a query is a point query */
+ int no_mitosis; /* run query without mitosis */
int user_id;
int role_id;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list