Changeset: 3cac25ae0132 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3cac25ae0132 Removed Files: sql/test/LSST/Tests/schema_3_1_88.sql sql/test/SQLancer/Tests/sqlancer01.sql sql/test/SQLancer/Tests/sqlancer02.sql sql/test/SQLancer/Tests/sqlancer03.sql sql/test/SQLancer/Tests/sqlancer07.sql sql/test/SQLancer/Tests/sqlancer08.sql Modified Files: sql/server/rel_optimizer.c sql/server/rel_schema.c sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out.Windows sql/test/LSST/Tests/schema_3_1_88.test sql/test/SQLancer/Tests/sqlancer01.test sql/test/SQLancer/Tests/sqlancer02.test sql/test/SQLancer/Tests/sqlancer03.test sql/test/SQLancer/Tests/sqlancer07.test sql/test/SQLancer/Tests/sqlancer08.test Branch: default Log Message:
Merged with Oct2020 diffs (truncated from 1373 to 300 lines): 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_column_kc_cmp(sql_column *c, sql_kc *kc) +sql_kc_column_cmp(sql_kc *kc, sql_column *c) { /* return on equality */ - return (c->colnr - kc->c->colnr); + return (kc->c->colnr - 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_column_kc_cmp; + fcmp cmp = (fcmp)&sql_kc_column_cmp; if (rk->t == r && - list_match(lcols, li->columns, cmp) == 0 && - list_match(rcols, rk->columns, cmp) == 0) { + list_match(li->columns, lcols, cmp) == 0 && + list_match(rk->columns, rcols, cmp) == 0) { return li; } } @@ -1553,9 +1553,9 @@ rel_push_func_down(visitor *v, sql_rel * sql_rel *l = pl->l, *r = pl->r; list *nexps = new_exp_list(v->sql->sa); - if (push_left && !is_simple_project(l->op)) + if (push_left && (!is_simple_project(l->op) || !l->l)) pl->l = l = rel_project(v->sql->sa, l, rel_projections(v->sql, l, NULL, 1, 1)); - if (push_right && !is_simple_project(r->op)) + if (push_right && (!is_simple_project(r->op)|| !r->l)) pl->r = r = rel_project(v->sql->sa, r, rel_projections(v->sql, r, NULL, 1, 1)); for (node *n = rel->exps->h; n; n = n->next) { sql_exp *e = n->data; @@ -4730,10 +4730,11 @@ rel_push_join_down(visitor *v, sql_rel * if (!re || (list_length(jes) == 0 && !find_prop(le->p, PROP_HASHCOL))) { fnd = 0; } else { - int anti = is_anti(je); + int anti = is_anti(je), semantics = is_semantics(je); je = exp_compare(v->sql->sa, le, re, je->flag); if (anti) set_anti(je); + if (semantics) set_semantics(je); list_append(jes, je); } } @@ -6711,8 +6712,32 @@ exp_used(sql_exp *e) { if (e) { e->used = 1; - if ((e->type == e_func || e->type == e_aggr) && e->l) + + switch (e->type) { + case e_convert: + exp_used(e->l); + break; + case e_func: + case e_aggr: exps_used(e->l); + break; + case e_cmp: + if (e->flag == cmp_or || e->flag == cmp_filter) { + exps_used(e->l); + exps_used(e->r); + } else if (e->flag == cmp_in || e->flag == cmp_notin) { + exp_used(e->l); + exps_used(e->r); + } else { + exp_used(e->l); + exp_used(e->r); + if (e->f) + exp_used(e->f); + } + break; + default: + break; + } } } @@ -6720,9 +6745,7 @@ static void exps_used(list *l) { if (l) { - node *n; - - for (n = l->h; n; n = n->next) + for (node *n = l->h; n; n = n->next) exp_used(n->data); } } @@ -6767,7 +6790,10 @@ rel_mark_used(mvc *sql, sql_rel *rel, in switch(rel->op) { case op_basetable: + case op_truncate: + case op_insert: break; + case op_table: if (rel->l && rel->flag != TRIGGER_WRAPPER) { @@ -6808,9 +6834,6 @@ rel_mark_used(mvc *sql, sql_rel *rel, in } break; - case op_insert: - case op_truncate: - break; case op_ddl: if (rel->flag == ddl_output || rel->flag == ddl_create_seq || rel->flag == ddl_alter_seq || rel->flag == ddl_alter_table || rel->flag == ddl_create_table || rel->flag == ddl_create_view) { if (rel->l) @@ -7182,20 +7205,17 @@ rel_add_projects(mvc *sql, sql_rel *rel) switch(rel->op) { case op_basetable: - case op_table: - + case op_truncate: + return rel; case op_insert: case op_update: case op_delete: - case op_truncate: - case op_ddl: - + if (rel->r) + rel->r = rel_add_projects(sql, rel->r); return rel; - case op_union: case op_inter: case op_except: - /* We can only reduce the list of expressions of an set op * if the projection under it can also be reduced. */ @@ -7214,16 +7234,15 @@ rel_add_projects(mvc *sql, sql_rel *rel) rel->r = rel_add_projects(sql, r); } return rel; - case op_topn: case op_sample: case op_project: case op_groupby: case op_select: - if (rel->l) + case op_table: + if (rel->l && (rel->op != op_table || rel->flag != TRIGGER_WRAPPER)) rel->l = rel_add_projects(sql, rel->l); return rel; - case op_join: case op_left: case op_right: @@ -7235,6 +7254,17 @@ rel_add_projects(mvc *sql, sql_rel *rel) if (rel->r) rel->r = rel_add_projects(sql, rel->r); return rel; + case op_ddl: + if (rel->flag == ddl_output || rel->flag == ddl_create_seq || rel->flag == ddl_alter_seq || rel->flag == ddl_alter_table || rel->flag == ddl_create_table || rel->flag == ddl_create_view) { + if (rel->l) + rel->l = rel_add_projects(sql, rel->l); + } else if (rel->flag == ddl_list || rel->flag == ddl_exception) { + if (rel->l) + rel->l = rel_add_projects(sql, rel->l); + if (rel->r) + rel->r = rel_add_projects(sql, rel->r); + } + return rel; } return rel; } @@ -7301,23 +7331,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_column_kc_cmp; + fcmp cmp = (fcmp)&sql_kc_column_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 (!exps || !list_length(exps)) + if (list_empty(exps)) continue; - /* now we obtain the columns, move into sql_column_kc_cmp! */ + /* now we obtain the columns, move into sql_kc_column_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(cols, i->columns, cmp) == 0) { + if (list_match(i->columns, cols, cmp) == 0) { /* re-order exps in index order */ node *n, *m; list *es = sa_list(sa); @@ -7325,7 +7355,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(m->data, n->data) == 0){ + if (cmp(n->data, m->data) == 0){ sql_exp *e = list_fetch(exps, i); list_append(es, e); break; @@ -7352,8 +7382,6 @@ rel_use_index(visitor *v, sql_rel *rel) sql_idx *i = find_index(v->sql->sa, rel, rel->l, &exps); int left = 1; - if (!i && is_join(rel->op)) - i = find_index(v->sql->sa, rel, rel->l, &exps); if (!i && is_join(rel->op)) { left = 0; i = find_index(v->sql->sa, rel, rel->r, &exps); @@ -7361,13 +7389,11 @@ rel_use_index(visitor *v, sql_rel *rel) if (i) { prop *p; - node *n; int single_table = 1; sql_exp *re = NULL; - for( n = exps->h; n && single_table; n = n->next) { - sql_exp *e = n->data; - sql_exp *nre = e->r; + for( node *n = exps->h; n && single_table; n = n->next) { + sql_exp *e = n->data, *nre = e->r; if (is_join(rel->op) && ((left && !rel_find_exp(rel->l, e->l)) || @@ -7377,9 +7403,12 @@ rel_use_index(visitor *v, sql_rel *rel) re = nre; } if (single_table) { /* add PROP_HASHCOL to all column exps */ - for( n = exps->h; n; n = n->next) { + fcmp cmp = (fcmp)&sql_kc_column_cmp; + + for( node *n = exps->h; n; n = n->next) { sql_exp *e = n->data; - int anti = is_anti(e); + sql_column *col = NULL; + int anti = is_anti(e), semantics = is_semantics(e); /* swapped ? */ if (is_join(rel->op) && @@ -7387,15 +7416,24 @@ rel_use_index(visitor *v, sql_rel *rel) (!left && !rel_find_exp(rel->r, e->l)))) n->data = e = exp_compare(v->sql->sa, e->r, e->l, cmp_equal); if (anti) set_anti(e); - p = find_prop(e->p, PROP_HASHCOL); - if (!p) - e->p = p = prop_create(v->sql->sa, PROP_HASHCOL, e->p); - p->value = i; + 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; + } } } /* add the remaining exps to the new exp list */ if (list_length(rel->exps) > list_length(exps)) { - for( n = rel->exps->h; n; n = n->next) { + for( node *n = rel->exps->h; n; n = n->next) { sql_exp *e = n->data; if (!list_find(exps, e, (fcmp)&exp_cmp)) list_append(exps, e); @@ -7543,6 +7581,7 @@ rel_simplify_like_select(visitor *v, sql sql_exp *ne = exp_compare(v->sql->sa, l->h->data, r->h->data, cmp_equal); if (is_anti(e)) set_anti(ne); + if (is_semantics(e)) set_semantics(ne); list_append(exps, ne); v->changes++; } else { @@ -8338,6 +8377,7 @@ rel_reduce_casts(visitor *v, sql_rel *re _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list