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

Reply via email to