Changeset: 71da2e9b2bfb for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=71da2e9b2bfb Added Files: sql/test/SQLancer/Tests/sqlancer11.test Removed Files: sql/test/SQLancer/Tests/sqlancer01.sql sql/test/SQLancer/Tests/sqlancer10.sql sql/test/SQLancer/Tests/sqlancer11.sql sql/test/SQLancer/Tests/sqlancer11.stable.err sql/test/SQLancer/Tests/sqlancer11.stable.out Modified Files: sql/backends/monet5/rel_bin.c sql/server/rel_optimizer.c sql/server/rel_select.c sql/test/SQLancer/Tests/sqlancer01.test sql/test/SQLancer/Tests/sqlancer10.test Branch: default Log Message:
Merged with Oct2020 diffs (truncated from 539 to 300 lines): 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 @@ -591,10 +591,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 * @@ -606,11 +606,11 @@ find_fk_index(sql_table *l, list *lcols, sql_idx *li = in->data; if (li->type == join_idx) { sql_key *rk = &((sql_fkey*)li->key)->rkey->k; - 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; } } @@ -1346,23 +1346,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; @@ -1371,7 +1381,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; @@ -1394,15 +1404,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 @@ -1437,22 +1444,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"); @@ -1460,26 +1467,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: @@ -1490,8 +1497,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); @@ -1532,7 +1539,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; @@ -1561,8 +1568,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 @@ -7331,23 +7338,23 @@ 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) continue; /* based on the index type, find qualifying exps */ exps = list_select(rel->exps, i, (fcmp) &index_exp, (fdup)NULL); - if (list_empty(exps)) + if (!exps || !list_length(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); @@ -7355,7 +7362,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; @@ -7389,11 +7396,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)) || @@ -7403,11 +7412,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; - - for( node *n = exps->h; n; n = n->next) { + for( n = exps->h; n; n = n->next) { sql_exp *e = n->data; - sql_column *col = NULL; int anti = is_anti(e), semantics = is_semantics(e); /* swapped ? */ @@ -7417,23 +7423,15 @@ rel_use_index(visitor *v, sql_rel *rel) n->data = e = exp_compare(v->sql->sa, e->r, e->l, cmp_equal); if (anti) set_anti(e); if (semantics) set_semantics(e); - - sql_exp *el = e->l, *er = e->r; /* add to both left and right expressions if that's the case */ - if ((col = exp_find_column(rel, el, -2)) && list_find(i->columns, col, cmp)) { - if (!(p = find_prop(el->p, PROP_HASHCOL))) - el->p = p = prop_create(v->sql->sa, PROP_HASHCOL, el->p); - p->value = i; - } - if ((col = exp_find_column(rel, er, -2)) && list_find(i->columns, col, cmp)) { - if (!(p = find_prop(er->p, PROP_HASHCOL))) - er->p = p = prop_create(v->sql->sa, PROP_HASHCOL, er->p); - p->value = i; - } + p = find_prop(e->p, PROP_HASHCOL); + if (!p) + e->p = p = prop_create(v->sql->sa, PROP_HASHCOL, e->p); + p->value = i; } } /* add the remaining exps to the new exp list */ if (list_length(rel->exps) > list_length(exps)) { - for( node *n = rel->exps->h; n; n = n->next) { + for( n = rel->exps->h; n; n = n->next) { sql_exp *e = n->data; if (!list_find(exps, e, (fcmp)&exp_cmp)) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list