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

Reply via email to