Changeset: a2ff381cef66 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a2ff381cef66
Modified Files:
        monetdb5/mal/mal_interpreter.mx
        sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/15.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/17.stable.out
        sql/benchmarks/tpch/Tests/01-22.stable.out
        sql/benchmarks/tpch/Tests/15.stable.out
        sql/benchmarks/tpch/Tests/17.stable.out
        sql/include/sql_catalog.h
        sql/server/rel_bin.c
        sql/server/rel_dump.c
        sql/server/rel_optimizer.c
        sql/server/rel_prop.c
        sql/server/rel_select.c
        sql/server/rel_select.h
        sql/storage/store.c
        sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
        sql/test/Dependencies/Tests/Dependencies.stable.out
        sql/test/bugs/Tests/crash_order_by.stable.out
Branch: default
Log Message:

improved optimizer to handle partitioned tables.


diffs (truncated from 1954 to 300 lines):

diff --git a/monetdb5/mal/mal_interpreter.mx b/monetdb5/mal/mal_interpreter.mx
--- a/monetdb5/mal/mal_interpreter.mx
+++ b/monetdb5/mal/mal_interpreter.mx
@@ -1384,12 +1384,6 @@ str runMALdataflow(Client cntxt, MalBlkP
        printFunction(GDKstdout, mb, 0, LIST_MAL_STMT | LIST_MAPI);
 #endif
 
-       /*
-        * TODO improve cost of DFLOWeligible
-        if (stoppc && stoppc - startpc > 10000)
-                return runMALsequence(cntxt, mb, startpc + 1, stoppc, stk, 
env, pcicaller);
-        */
-
        (void)env;
        (void)pcicaller;
 
diff --git a/sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out 
b/sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out
--- a/sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out
+++ b/sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out
@@ -501,7 +501,7 @@ Over..
 % rewrite,     count # name
 % clob,        int # type
 % 7,   1 # length
-[ "joinidx",   1       ]
+[ "joinidx",   0       ]
 
 # 00:16:03 >  
 # 00:16:03 >  Mtimeout -timeout 60 mclient -lsql -ftest -i -e --host=alf 
--port=39190  < 
/net/alf.ins.cwi.nl/export/scratch1/niels/rc/MonetDB/sql/src/benchmarks/tpch/LOCKED/16.sql
@@ -856,7 +856,7 @@ Over..
 % rewrite,     count # name
 % clob,        int # type
 % 7,   1 # length
-[ "joinidx",   0       ]
+[ "joinidx",   1       ]
 
 # 11:48:06 >  
 # 11:48:06 >  Mtimeout -timeout 60 MapiClient -lsql -umonetdb -Pmonetdb 
--host=localhost --port=35781
diff --git a/sql/benchmarks/tpch/LOCKED/Tests/15.stable.out 
b/sql/benchmarks/tpch/LOCKED/Tests/15.stable.out
--- a/sql/benchmarks/tpch/LOCKED/Tests/15.stable.out
+++ b/sql/benchmarks/tpch/LOCKED/Tests/15.stable.out
@@ -28,7 +28,7 @@ Over..
 % rewrite,     count # name
 % clob,        int # type
 % 7,   1 # length
-[ "joinidx",   1       ]
+[ "joinidx",   0       ]
 
 # 09:17:18 >  
 # 09:17:18 >  Done.
diff --git a/sql/benchmarks/tpch/LOCKED/Tests/17.stable.out 
b/sql/benchmarks/tpch/LOCKED/Tests/17.stable.out
--- a/sql/benchmarks/tpch/LOCKED/Tests/17.stable.out
+++ b/sql/benchmarks/tpch/LOCKED/Tests/17.stable.out
@@ -33,7 +33,7 @@ Over..
 % rewrite,     count # name
 % clob,        int # type
 % 7,   1 # length
-[ "joinidx",   0       ]
+[ "joinidx",   1       ]
 
 # 09:17:19 >  
 # 09:17:19 >  Done.
diff --git a/sql/benchmarks/tpch/Tests/01-22.stable.out 
b/sql/benchmarks/tpch/Tests/01-22.stable.out
--- a/sql/benchmarks/tpch/Tests/01-22.stable.out
+++ b/sql/benchmarks/tpch/Tests/01-22.stable.out
@@ -501,7 +501,7 @@ Over..
 % rewrite,     count # name
 % clob,        int # type
 % 7,   1 # length
-[ "joinidx",   1       ]
+[ "joinidx",   0       ]
 
 # 00:16:03 >  
 # 00:16:03 >  Mtimeout -timeout 60 mclient -lsql -ftest -i -e --host=alf 
--port=39190  < 
/net/alf.ins.cwi.nl/export/scratch1/niels/rc/MonetDB/sql/src/benchmarks/tpch/16.sql
@@ -856,7 +856,7 @@ Over..
 % rewrite,     count # name
 % clob,        int # type
 % 7,   1 # length
-[ "joinidx",   0       ]
+[ "joinidx",   1       ]
 
 # 11:48:06 >  
 # 11:48:06 >  Mtimeout -timeout 60 MapiClient -lsql -umonetdb -Pmonetdb 
--host=localhost --port=35781
diff --git a/sql/benchmarks/tpch/Tests/15.stable.out 
b/sql/benchmarks/tpch/Tests/15.stable.out
--- a/sql/benchmarks/tpch/Tests/15.stable.out
+++ b/sql/benchmarks/tpch/Tests/15.stable.out
@@ -28,7 +28,7 @@ Over..
 % rewrite,     count # name
 % clob,        int # type
 % 7,   1 # length
-[ "joinidx",   1       ]
+[ "joinidx",   0       ]
 
 # 09:17:18 >  
 # 09:17:18 >  Done.
diff --git a/sql/benchmarks/tpch/Tests/17.stable.out 
b/sql/benchmarks/tpch/Tests/17.stable.out
--- a/sql/benchmarks/tpch/Tests/17.stable.out
+++ b/sql/benchmarks/tpch/Tests/17.stable.out
@@ -33,7 +33,7 @@ Over..
 % rewrite,     count # name
 % clob,        int # type
 % 7,   1 # length
-[ "joinidx",   0       ]
+[ "joinidx",   1       ]
 
 # 09:17:19 >  
 # 09:17:19 >  Done.
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -390,6 +390,7 @@ typedef struct sql_table {
        int cleared;            /* cleared in the current transaction */
        void *data;
        struct sql_schema *s;
+       struct sql_table *p;
 } sql_table;
 
 typedef struct res_col {
diff --git a/sql/server/rel_bin.c b/sql/server/rel_bin.c
--- a/sql/server/rel_bin.c
+++ b/sql/server/rel_bin.c
@@ -655,6 +655,8 @@ stmt_rename(mvc *sql, sql_rel *rel, sql_
        char *rname = exp->rname;
 
        (void)rel;
+       if (!name && exp->type == e_column && exp->r)
+               name = exp->r;
        if (!name)
                name = column_name(sql->sa, s);
        else
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -212,15 +212,13 @@ exps_print(mvc *sql, stream *fout, list 
 {
        node *en;
 
-       if (!exps)
-               return;
-
        if (brackets)
                mnstr_printf(fout, "(");
        else
                mnstr_printf(fout, " [ ");
-       for (en = exps->h; en; en = en->next) 
-               exp_print(sql, fout, en->data, depth+1, (en->next!=NULL), 
alias);
+       if (exps)
+               for (en = exps->h; en; en = en->next) 
+                       exp_print(sql, fout, en->data, depth+1, 
(en->next!=NULL), alias);
        if (brackets)
                mnstr_printf(fout, ")");
        else
@@ -362,13 +360,15 @@ rel_print_(mvc *sql, stream  *fout, sql_
                mnstr_printf(fout, "%s (", r);
                if (rel_is_ref(rel->l)) {
                        int nr = find_ref(refs, rel->l);
-                       mnstr_printf(fout, " & REF %d ", nr);
+                       print_indent(sql, fout, depth+1);
+                       mnstr_printf(fout, "& REF %d ", nr);
                } else
                        rel_print_(sql, fout, rel->l, depth+1, refs);
                mnstr_printf(fout, ",");
                if (rel_is_ref(rel->r)) {
                        int nr = find_ref(refs, rel->r);
-                       mnstr_printf(fout, " & REF %d  ", nr);
+                       print_indent(sql, fout, depth+1);
+                       mnstr_printf(fout, "& REF %d  ", nr);
                } else
                        rel_print_(sql, fout, rel->r, depth+1, refs);
                print_indent(sql, fout, depth);
@@ -395,13 +395,14 @@ rel_print_(mvc *sql, stream  *fout, sql_
                        mnstr_printf(fout, "%s (", r);
                        if (rel_is_ref(rel->l)) {
                                int nr = find_ref(refs, rel->l);
-                               mnstr_printf(fout, " & REF %d ", nr);
+                               print_indent(sql, fout, depth+1);
+                               mnstr_printf(fout, "& REF %d ", nr);
                        } else
                                rel_print_(sql, fout, rel->l, depth+1, refs);
                        print_indent(sql, fout, depth);
                        mnstr_printf(fout, ")");
                }
-               if (rel->r && rel->op == op_groupby)  /* group by columns */
+               if (rel->op == op_groupby)  /* group by columns */
                        exps_print(sql, fout, rel->r, depth, 1, 0);
                exps_print(sql, fout, rel->exps, depth, 1, 0);
                if (rel->r && rel->op == op_project) /* order by columns */
@@ -421,14 +422,16 @@ rel_print_(mvc *sql, stream  *fout, sql_
 
                if (rel_is_ref(rel->l)) {
                        int nr = find_ref(refs, rel->l);
-                       mnstr_printf(fout, " & REF %d ", nr);
+                       print_indent(sql, fout, depth+1);
+                       mnstr_printf(fout, "& REF %d ", nr);
                } else
                        rel_print_(sql, fout, rel->l, depth+1, refs);
 
                if (rel->r) {
                        if (rel_is_ref(rel->r)) {
                                int nr = find_ref(refs, rel->r);
-                               mnstr_printf(fout, " & REF %d ", nr);
+                               print_indent(sql, fout, depth+1);
+                               mnstr_printf(fout, "& REF %d ", nr);
                        } else
                                rel_print_(sql, fout, rel->r, depth+1, refs);
                }
@@ -838,6 +841,16 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                if (not)
                        set_has_no_nil(exp);
        }
+       if (strncmp(r+*pos, "HASHIDX",  strlen("HASHIDX")) == 0) {
+               (*pos)+= strlen("HASHIDX");
+               exp->p = prop_create(sql->sa, PROP_HASHIDX, exp->p);
+               skipWS(r,pos);
+       }
+       if (strncmp(r+*pos, "FETCH",  strlen("FETCH")) == 0) {
+               (*pos)+= strlen("FETCH");
+               exp->p = prop_create(sql->sa, PROP_FETCH, exp->p);
+               skipWS(r,pos);
+       }
 
        /* as alias */
        if (strncmp(r+*pos, "as", 2) == 0) {
@@ -867,6 +880,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        *e = old;
                }
        }
+       skipWS(r, pos);
        switch(r[*pos]) {
        case '=': 
                f = cmp_equal;
@@ -1048,11 +1062,11 @@ rel_read(mvc *sql, char *r, int *pos)
                        rel = rel_select_copy(sql->sa, nrel, exps);
                        return rel;
                        // semijoin or antijoin
-               } else if (r[*pos+2] == 'l' || r[*pos+1] == 'n') {
+               } else if (r[*pos+1] == 'e' || r[*pos+1] == 'n') {
                        j = op_semi;
 
                        if (r[*pos+1] == 'n') 
-                               j = op_semi;
+                               j = op_anti;
 
                        *pos += strlen("semijoin");
                        skipWS(r, pos);
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -48,7 +48,7 @@ static sql_subfunc *find_func( mvc *sql,
 
 /* currently we only find simple column expressions */
 static sql_column *
-name_find_column( sql_rel *rel, char *rname, char *name, sql_rel **bt ) 
+name_find_column( sql_rel *rel, char *rname, char *name, int pnr, sql_rel **bt 
) 
 {
        sql_exp *alias = NULL;
        sql_column *c = NULL;
@@ -77,7 +77,9 @@ name_find_column( sql_rel *rel, char *rn
                        sql_column *c = cn->data;
                        if (strcmp(c->base.name, name) == 0) {
                                *bt = rel;
-                               return c;
+                               if (pnr < 0 || (c->t->p &&
+                                   list_position(c->t->p->tables.set, c->t) == 
pnr))
+                                       return c;
                        }
                }
                break;
@@ -87,7 +89,7 @@ name_find_column( sql_rel *rel, char *rn
                return NULL;
        case op_ddl: 
                if (is_updateble(rel))
-                       return name_find_column( rel->l, rname, name, bt);
+                       return name_find_column( rel->l, rname, name, pnr, bt);
                return NULL;
        case op_join: 
        case op_left: 
@@ -96,17 +98,26 @@ name_find_column( sql_rel *rel, char *rn
        case op_semi: 
        case op_anti: 
                /* first right (possible subquery) */
-               c = name_find_column( rel->r, rname, name, bt);
+               c = name_find_column( rel->r, rname, name, pnr, bt);
                if (!c) 
-                       c = name_find_column( rel->l, rname, name, bt);
+                       c = name_find_column( rel->l, rname, name, pnr, bt);
                return c;
        case op_select: 
        case op_topn: 
-               return name_find_column( rel->l, rname, name, bt);
+               return name_find_column( rel->l, rname, name, pnr, bt);
        case op_union: 
        case op_inter: 
        case op_except: 
 
+               if (pnr >= 0 || pnr == -2) {
+                       /* first right (possible subquery) */
+                       c = name_find_column( rel->r, rname, name, pnr, bt);
+                       if (!c) 
+                               c = name_find_column( rel->l, rname, name, pnr, 
bt);
+                       return c;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to