Changeset: b74e39a680eb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b74e39a680eb
Modified Files:
sql/backends/monet5/rel_bin.c
sql/server/rel_optimizer.c
sql/server/rel_select.c
Branch: nospare
Log Message:
more merge fun
diffs (truncated from 708 to 300 lines):
diff --git
a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows
b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows
---
a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows
+++
b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows
@@ -5,13 +5,13 @@
% %2 # name
% varchar # type
% 15 # length
-[ "sequential_pipe" ]
+[ "sequential_pipe" ]
#select def from optimizers() where name = optimizer;
% .%1 # table_name
% def # name
% clob # type
% 626 # length
-[
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.aliases();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.deadcode();optimizer.postfix();optimizer.wlc();optimizer.garbageCollector();"
]
+[
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.aliases();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.bincopyfrom();optimizer.parappend();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.deadcode();optimizer.postfix();optimizer.wlc();optimizer.garbageCollector();"
]
#explain copy into ttt from E'\\tmp/xyz';
% .explain # table_name
% mal # name
@@ -99,7 +99,7 @@ end user.main;
#start transaction;
#create local temp table "opt_pipe_name" ("opt_pipe_name" string);
#insert into "opt_pipe_name" values ((select optimizer));
-[ 1 ]
+[ 1 ]
#set optimizer = substring((select def from optimizers() where name = (select
opt_pipe_name from "opt_pipe_name")),0,
# length((select def from optimizers() where name = (select
opt_pipe_name from "opt_pipe_name")))-length('optimizer.garbageCollector();'))
|| 'optimizer.sql_append();optimizer.garbageCollector();';
#select optimizer;
@@ -107,7 +107,7 @@ end user.main;
% %2 # name
% varchar # type
% 6 # length
-[ "user_0" ]
+[ "user_0" ]
#select def from optimizers() where name = optimizer;
% .%1 # table_name
% def # name
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
@@ -3312,7 +3312,6 @@ rel2bin_select(backend *be, sql_rel *rel
if ((p=find_prop(e->p, PROP_HASHCOL)) != NULL) {
sql_idx *i = p->value;
- assert(0);
sel = rel2bin_hash_lookup(be, rel, sub, NULL, i, en);
}
}
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
@@ -593,10 +593,10 @@ matching_joins(sql_allocator *sa, list *
}
static int
-sql_kc_column_cmp(sql_kc *kc, sql_column *c)
+sql_column_kc_cmp(sql_column *c, sql_kc *kc)
{
/* return on equality */
- return (kc->c->colnr - c->colnr);
+ return (c->colnr - kc->c->colnr);
}
static sql_idx *
@@ -610,11 +610,11 @@ find_fk_index(mvc *sql, sql_table *l, li
sql_idx *li = in->data;
if (li->type == join_idx) {
sql_key *rk =
(sql_key*)os_find_id(tr->cat->objects, tr, ((sql_fkey*)li->key)->rkey);
- fcmp cmp = (fcmp)&sql_kc_column_cmp;
+ fcmp cmp = (fcmp)&sql_column_kc_cmp;
if (rk->t == r &&
- list_match(li->columns, lcols, cmp) ==
0 &&
- list_match(rk->columns, rcols, cmp) ==
0) {
+ list_match(lcols, li->columns, cmp) ==
0 &&
+ list_match(rcols, rk->columns, cmp) ==
0) {
return li;
}
}
@@ -1356,23 +1356,33 @@ exp_rename(mvc *sql, sql_exp *e, sql_rel
}
static int
-can_push_func(sql_exp *e, sql_rel *rel, int *must)
+can_push_func(sql_exp *e, sql_rel *rel, int *must, int depth)
{
switch(e->type) {
case e_cmp: {
- int mustl = 0, mustr = 0, mustf = 0;
sql_exp *l = e->l, *r = e->r, *f = e->f;
- if ((is_project(rel->op) && e->f) || e->flag == cmp_or ||
e->flag == cmp_in || e->flag == cmp_notin || e->flag == cmp_filter)
+ if (e->flag == cmp_or || e->flag == cmp_in || e->flag ==
cmp_notin || e->flag == cmp_filter)
return 0;
- return ((l->type == e_column || can_push_func(l, rel, &mustl))
&& (*must = mustl)) ||
- (!f && (r->type == e_column || can_push_func(r,
rel, &mustr)) && (*must = mustr)) ||
- (f &&
- (r->type == e_column || can_push_func(r, rel,
&mustr)) &&
- (f->type == e_column || can_push_func(f, rel, &mustf))
&& (*must = (mustr || mustf)));
+ if (depth > 0) { /* for comparisons under the top ones, they
become functions */
+ int lmust = 0;
+ int res = can_push_func(l, rel, &lmust, depth + 1) &&
can_push_func(r, rel, &lmust, depth + 1) &&
+ (!f || can_push_func(f, rel, &lmust,
depth + 1));
+ if (res && !lmust)
+ return 1;
+ (*must) |= lmust;
+ return res;
+ } else {
+ int mustl = 0, mustr = 0, mustf = 0;
+ return ((l->type == e_column || can_push_func(l, rel,
&mustl, depth + 1)) && (*must = mustl)) ||
+ (!f && (r->type == e_column ||
can_push_func(r, rel, &mustr, depth + 1)) && (*must = mustr)) ||
+ (f &&
+ (r->type == e_column ||
can_push_func(r, rel, &mustr, depth + 1)) &&
+ (f->type == e_column || can_push_func(f, rel,
&mustf, depth + 1)) && (*must = (mustr || mustf)));
+ }
}
case e_convert:
- return can_push_func(e->l, rel, must);
+ return can_push_func(e->l, rel, must, depth + 1);
case e_aggr:
case e_func: {
list *l = e->l;
@@ -1381,7 +1391,7 @@ can_push_func(sql_exp *e, sql_rel *rel,
if (exp_unsafe(e, 0))
return 0;
if (l) for (node *n = l->h; n && res; n = n->next)
- res &= can_push_func(n->data, rel, &lmust);
+ res &= can_push_func(n->data, rel, &lmust, depth + 1);
if (res && !lmust)
return 1;
(*must) |= lmust;
@@ -1404,15 +1414,12 @@ exps_can_push_func(list *exps, sql_rel *
sql_exp *e = n->data;
int mustl = 0, mustr = 0;
- if ((is_joinop(rel->op) || is_select(rel->op)) &&
((can_push_func(e, rel->l, &mustl) && mustl)))
+ if ((is_joinop(rel->op) || is_select(rel->op)) &&
((can_push_func(e, rel->l, &mustl, 0) && mustl)))
*push_left = true;
-
- if (is_joinop(rel->op) && can_push_func(e, rel->r, &mustr) &&
mustr)
+ if (is_joinop(rel->op) && can_push_func(e, rel->r, &mustr, 0)
&& mustr)
*push_right = true;
}
- if (*push_left || *push_right)
- return 1;
- return 0;
+ return *push_left || *push_right;
}
static int
@@ -1447,22 +1454,22 @@ exps_need_push_down( list *exps )
return 0;
}
-static sql_exp *exp_push_single_func_down(visitor *v, sql_rel *rel, sql_rel
*l, sql_rel *r, sql_exp *e);
+static sql_exp *exp_push_single_func_down(visitor *v, sql_rel *rel, sql_rel
*l, sql_rel *r, sql_exp *e, int depth);
static list *
-exps_push_single_func_down(visitor *v, sql_rel *rel, sql_rel *l, sql_rel *r,
list *exps)
+exps_push_single_func_down(visitor *v, sql_rel *rel, sql_rel *l, sql_rel *r,
list *exps, int depth)
{
if (THRhighwater())
return sql_error(v->sql, 10, SQLSTATE(42000) "Query too
complex: running out of stack space");
for (node *n = exps->h; n; n = n->next)
- if ((n->data = exp_push_single_func_down(v, rel, l, r,
n->data)) == NULL)
+ if ((n->data = exp_push_single_func_down(v, rel, l, r, n->data,
depth)) == NULL)
return NULL;
return exps;
}
static sql_exp *
-exp_push_single_func_down(visitor *v, sql_rel *rel, sql_rel *l, sql_rel *r,
sql_exp *e)
+exp_push_single_func_down(visitor *v, sql_rel *rel, sql_rel *l, sql_rel *r,
sql_exp *e, int depth)
{
if (THRhighwater())
return sql_error(v->sql, 10, SQLSTATE(42000) "Query too
complex: running out of stack space");
@@ -1470,26 +1477,26 @@ exp_push_single_func_down(visitor *v, sq
switch(e->type) {
case e_cmp: {
if (e->flag == cmp_or || e->flag == cmp_filter) {
- if ((e->l = exps_push_single_func_down(v, rel, l, r,
e->l)) == NULL)
+ if ((e->l = exps_push_single_func_down(v, rel, l, r,
e->l, depth + 1)) == NULL)
return NULL;
- if ((e->r = exps_push_single_func_down(v, rel, l, r,
e->r)) == NULL)
+ if ((e->r = exps_push_single_func_down(v, rel, l, r,
e->r, depth + 1)) == NULL)
return NULL;
} else if (e->flag == cmp_in || e->flag == cmp_notin) {
- if ((e->l = exp_push_single_func_down(v, rel, l, r,
e->l)) == NULL)
+ if ((e->l = exp_push_single_func_down(v, rel, l, r,
e->l, depth + 1)) == NULL)
return NULL;
- if ((e->r = exps_push_single_func_down(v, rel, l, r,
e->r)) == NULL)
+ if ((e->r = exps_push_single_func_down(v, rel, l, r,
e->r, depth + 1)) == NULL)
return NULL;
} else {
- if ((e->l = exp_push_single_func_down(v, rel, l, r,
e->l)) == NULL)
+ if ((e->l = exp_push_single_func_down(v, rel, l, r,
e->l, depth + 1)) == NULL)
return NULL;
- if ((e->r = exp_push_single_func_down(v, rel, l, r,
e->r)) == NULL)
+ if ((e->r = exp_push_single_func_down(v, rel, l, r,
e->r, depth + 1)) == NULL)
return NULL;
- if (e->f && (e->f = exp_push_single_func_down(v, rel,
l, r, e->f)) == NULL)
+ if (e->f && (e->f = exp_push_single_func_down(v, rel,
l, r, e->f, depth + 1)) == NULL)
return NULL;
}
} break;
case e_convert:
- if ((e->l = exp_push_single_func_down(v, rel, l, r, e->l)) ==
NULL)
+ if ((e->l = exp_push_single_func_down(v, rel, l, r, e->l, depth
+ 1)) == NULL)
return NULL;
break;
case e_aggr:
@@ -1500,8 +1507,8 @@ exp_push_single_func_down(visitor *v, sq
return e;
if (!e->l || exps_are_atoms(e->l))
return e;
- if ((is_joinop(rel->op) && ((can_push_func(e, l, &mustl) &&
mustl) || (can_push_func(e, r, &mustr) && mustr))) ||
- (is_select(rel->op) && can_push_func(e, l, &must) &&
must)) {
+ if ((is_joinop(rel->op) && ((can_push_func(e, l, &mustl, depth
+ 1) && mustl) || (can_push_func(e, r, &mustr, depth + 1) && mustr))) ||
+ (is_select(rel->op) && can_push_func(e, l, &must, depth
+ 1) && must)) {
exp_label(v->sql->sa, e, ++v->sql->label);
if (mustr)
append(r->exps, e);
@@ -1542,7 +1549,7 @@ rel_push_func_down(visitor *v, sql_rel *
rel->r = r = rel_project(v->sql->sa, r,
rel_projections(v->sql, r, NULL, 1, 1));
nrel = rel_project(v->sql->sa, rel,
rel_projections(v->sql, rel, NULL, 1, 1));
- if (!(exps = exps_push_single_func_down(&nv, rel, l, r,
exps)))
+ if (!(exps = exps_push_single_func_down(&nv, rel, l, r,
exps, 0)))
return NULL;
if (nv.changes) {
rel = nrel;
@@ -1571,8 +1578,8 @@ rel_push_func_down(visitor *v, sql_rel *
sql_exp *e = n->data;
int mustl = 0, mustr = 0;
- if ((can_push_func(e, l, &mustl) && mustl) ||
- (can_push_func(e, r, &mustr) && mustr)) {
+ if ((can_push_func(e, l, &mustl, 0) && mustl) ||
+ (can_push_func(e, r, &mustr, 0) && mustr)) {
if (mustl)
append(l->exps, e);
else
@@ -7342,7 +7349,7 @@ find_index(sql_allocator *sa, sql_rel *r
if ((p = find_prop(e->p, PROP_HASHIDX)) != NULL) {
list *exps, *cols;
sql_idx *i = p->value;
- fcmp cmp = (fcmp)&sql_kc_column_cmp;
+ fcmp cmp = (fcmp)&sql_column_kc_cmp;
/* join indices are only interesting for joins */
if (i->type == join_idx || list_length(i->columns) <= 1)
@@ -7351,14 +7358,14 @@ find_index(sql_allocator *sa, sql_rel *r
exps = list_select(rel->exps, i, (fcmp) &index_exp,
(fdup)NULL);
if (list_empty(exps))
continue;
- /* now we obtain the columns, move into
sql_kc_column_cmp! */
+ /* now we obtain the columns, move into
sql_column_kc_cmp! */
cols = list_map(exps, sub, (fmap) &sjexp_col);
/* TODO check that at most 2 relations are involved */
/* Match the index columns with the expression columns.
TODO, Allow partial matches ! */
- if (list_match(i->columns, cols, cmp) == 0) {
+ if (list_match(cols, i->columns, cmp) == 0) {
/* re-order exps in index order */
node *n, *m;
list *es = sa_list(sa);
@@ -7366,7 +7373,7 @@ find_index(sql_allocator *sa, sql_rel *r
for(n = i->columns->h; n; n = n->next) {
int i = 0;
for(m = cols->h; m; m = m->next, i++) {
- if (cmp(n->data, m->data) == 0){
+ if (cmp(m->data, n->data) == 0){
sql_exp *e =
list_fetch(exps, i);
list_append(es, e);
break;
@@ -7400,11 +7407,13 @@ rel_use_index(visitor *v, sql_rel *rel)
if (i) {
prop *p;
+ node *n;
int single_table = 1;
sql_exp *re = NULL;
- for( node *n = exps->h; n && single_table; n = n->next)
{
- sql_exp *e = n->data, *nre = e->r;
+ for( n = exps->h; n && single_table; n = n->next) {
+ sql_exp *e = n->data;
+ sql_exp *nre = e->r;
if (is_join(rel->op) &&
((left && !rel_find_exp(rel->l, e->l))
||
@@ -7414,11 +7423,8 @@ rel_use_index(visitor *v, sql_rel *rel)
re = nre;
}
if (single_table) { /* add PROP_HASHCOL to all column
exps */
- fcmp cmp = (fcmp)&sql_kc_column_cmp;
-
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list