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