Changeset: 9a7952fd5a0c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9a7952fd5a0c
Modified Files:
monetdb5/optimizer/opt_pushselect.c
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_scenario.c
Branch: Oct2014
Log Message:
- improved usage for filter functions
- improved push down of selects (with multiple tid() statements)
- made enabling/disabling cache function again (needed for bug 3361)
diffs (108 lines):
diff --git a/monetdb5/optimizer/opt_pushselect.c
b/monetdb5/optimizer/opt_pushselect.c
--- a/monetdb5/optimizer/opt_pushselect.c
+++ b/monetdb5/optimizer/opt_pushselect.c
@@ -193,6 +193,12 @@ OPTpushselectImplementation(Client cntxt
if (getModuleId(s) == sqlRef &&
getFunctionId(s) == tidRef)
tid = getArg(q, 1);
+ if (s->argc == 2 && s->retc == 1) {
+ int i1 = getArg(s, 1);
+ InstrPtr s = old[vars[i1]];
+ if (getModuleId(s) == sqlRef &&
getFunctionId(s) == tidRef)
+ tid = getArg(q, 1);
+ }
break;
} else if (isMapOp(q) && q->argc >= 2 &&
isaBatType(getArgType(mb, q, 1))) {
int i1 = getArg(q, 1);
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
@@ -1488,16 +1488,16 @@ rel2bin_join( mvc *sql, sql_rel *rel, li
list *lje = sa_list(sql->sa);
list *rje = sa_list(sql->sa);
- /* get equi-joins first */
+ /* get equi-joins/filters first */
if (list_length(rel->exps) > 1) {
for( en = rel->exps->h; en; en = en->next ) {
sql_exp *e = en->data;
- if (e->type == e_cmp && e->flag == cmp_equal)
+ if (e->type == e_cmp && (e->flag == cmp_equal
|| e->flag == cmp_filter))
append(jexps, e);
}
for( en = rel->exps->h; en; en = en->next ) {
sql_exp *e = en->data;
- if (e->type != e_cmp || e->flag != cmp_equal)
+ if (e->type != e_cmp || (e->flag != cmp_equal
&& e->flag != cmp_filter))
append(jexps, e);
}
rel->exps = jexps;
@@ -1511,7 +1511,7 @@ rel2bin_join( mvc *sql, sql_rel *rel, li
prop *p;
/* only handle simple joins here */
- if (exp_has_func(e)) {
+ if (exp_has_func(e) && e->flag != cmp_filter) {
if (!join && !list_length(lje)) {
stmt *l = bin_first_column(sql->sa,
left);
stmt *r = bin_first_column(sql->sa,
right);
@@ -1519,7 +1519,8 @@ rel2bin_join( mvc *sql, sql_rel *rel, li
}
break;
}
- if (list_length(lje) && (idx || e->type != e_cmp ||
e->flag != cmp_equal))
+ if (list_length(lje) && (idx || e->type != e_cmp ||
(e->flag != cmp_equal && e->flag != cmp_filter) ||
+ (join && e->flag == cmp_filter)))
break;
/* handle possible index lookups */
diff --git a/sql/backends/monet5/sql_scenario.c
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -2186,9 +2186,15 @@ SQLsetTrace(backend *be, Client c, bit o
#define MAX_QUERY (64*1024*1024)
static int
+caching(mvc *m)
+{
+ return m->caching;
+}
+
+static int
cachable(mvc *m, stmt *s)
{
- if (m->emode == m_plan || !m->caching || m->type == Q_TRANS ||
/*m->type == Q_SCHEMA || cachable to make sure we have trace on alter
statements */
+ if (m->emode == m_plan || m->type == Q_TRANS || /*m->type == Q_SCHEMA
|| cachable to make sure we have trace on alter statements */
(s && s->type == st_none) || sa_size(m->sa) > MAX_QUERY)
return 0;
return 1;
@@ -2366,7 +2372,7 @@ SQLparser(Client c)
}
m->emode = m_inplace;
scanner_query_processed(&(m->scanner));
- } else if (cachable(m, NULL) && m->emode != m_prepare && (be->q =
qc_match(m->qc, m->sym, m->args, m->argc, m->scanner.key ^
m->session->schema->base.id)) != NULL) {
+ } else if (caching(m) && cachable(m, NULL) && m->emode != m_prepare &&
(be->q = qc_match(m->qc, m->sym, m->args, m->argc, m->scanner.key ^
m->session->schema->base.id)) != NULL) {
if (m->emod & mod_debug)
SQLsetDebugger(c, m, TRUE);
@@ -2392,7 +2398,7 @@ SQLparser(Client c)
SQLsetTrace(be, c, TRUE);
if (m->emod & mod_debug)
SQLsetDebugger(c, m, TRUE);
- if (!cachable(m, s)) {
+ if (!caching(m) || !cachable(m, s)) {
MalBlkPtr mb;
scanner_query_processed(&(m->scanner));
@@ -2400,7 +2406,10 @@ SQLparser(Client c)
trimMalBlk(c->curprg->def);
mb = c->curprg->def;
chkProgram(c->fdout, c->nspace, mb);
- addOptimizerPipe(c, mb, "minimal_pipe");
+ if (!cachable(m, s))
+ addOptimizerPipe(c, mb, "minimal_pipe");
+ else
+ addOptimizerPipe(c, mb, "default_pipe");
msg = optimizeMALBlock(c, mb);
if (msg != MAL_SUCCEED) {
sqlcleanup(m, err);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list