Changeset: 2857fd0f4208 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/2857fd0f4208 Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/rel_predicates.c sql/backends/monet5/rel_predicates.h Branch: iso Log Message:
Some cleanup and remove redundant cases diffs (238 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 @@ -4338,7 +4338,7 @@ rel2bin_insert(backend *be, sql_rel *rel if (!sql_insert_triggers(be, t, updates, 1)) return sql_error(sql, 02, SQLSTATE(27000) "INSERT INTO: triggers failed for table '%s'", t->base.name); /* update predicate list */ - rel_predicates(be, rel); + rel_predicates(be, rel->r); if (ddl) { ret = ddl; list_prepend(l, ddl); @@ -5327,7 +5327,7 @@ rel2bin_update(backend *be, sql_rel *rel if (sql->cascade_action) sql->cascade_action = NULL; - rel_predicates(be, rel); + rel_predicates(be, rel->r); return cnt; } @@ -5567,7 +5567,7 @@ rel2bin_delete(backend *be, sql_rel *rel /* if there are multiple update statements, update total count, otherwise use the the current count */ be->rowcount = be->rowcount ? add_to_rowcount_accumulator(be, stdelete->nr) : stdelete->nr; } - rel_predicates(be, rel); + rel_predicates(be, rel->r); return stdelete; } diff --git a/sql/backends/monet5/rel_predicates.c b/sql/backends/monet5/rel_predicates.c --- a/sql/backends/monet5/rel_predicates.c +++ b/sql/backends/monet5/rel_predicates.c @@ -1,26 +1,17 @@ - +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 1997 - July 2008 CWI, August 2008 - 2021 MonetDB B.V. + */ #include "monetdb_config.h" -#include "rel_bin.h" +#include "rel_predicates.h" #include "rel_rel.h" #include "rel_exp.h" -/* -#include "rel_basetable.h" -#include "rel_psm.h" -#include "rel_prop.h" -#include "rel_unnest.h" -#include "rel_optimizer.h" -*/ -#include "rel_predicates.h" - - -typedef struct pl { - sql_column *c; - comp_type cmp; - atom *l; - atom *r; -} pl; +#include "mal_backend.h" static void pl_print(mvc *m, list *pls) @@ -31,7 +22,7 @@ pl_print(mvc *m, list *pls) pl *p = n->data; if (p->r) { printf("# %s %s %s.%s.%s %s %s\n", - p->l?atom2string(m->pa, p->l):"NULL", + p->f?atom2string(m->pa, p->f):"NULL", compare_func(range2lcompare(p->cmp), 0), p->c->t->s?p->c->t->s->base.name:"", p->c->t->base.name, @@ -43,8 +34,8 @@ pl_print(mvc *m, list *pls) p->c->t->s?p->c->t->s->base.name:"", p->c->t->base.name, p->c->base.name, - p->l?compare_func(p->cmp, 0):"all" , - p->l?atom2string(m->pa, p->l):"", + p->f?compare_func(p->cmp, 0):"all" , + p->f?atom2string(m->pa, p->f):"", p->r?atom2string(m->pa, p->r):""); } } @@ -73,88 +64,59 @@ exp_find_column( sql_rel *rel, sql_exp * } static list * -Append(sql_allocator *sa, list *l, void *d) +add_predicate(sql_allocator *sa, list *l, pl *pred) { if (!l) l = sa_list(sa); - append(l,d); + list_append(l, pred); return l; } static sql_rel * rel_find_predicates(visitor *v, sql_rel *rel) { - int needall = 0; + bool needall = false; - /* select with basetable */ - if (is_select(rel->op)) { - sql_rel *bt = rel->l; - if (bt && is_basetable(bt->op)) { + if (is_basetable(rel->op)) { + sql_rel *parent = v->parent; + + /* select with basetable */ + if (is_select(parent->op)) { /* add predicates */ - for (node *n = rel->exps->h; n && !needall; n = n->next) { - sql_exp *e = n->data; - if (!is_intern(e) && e->type == e_cmp) { - sql_column *c = exp_find_column( rel, e->l); - if (c) { - sql_exp *r = e->r; - sql_exp *r2 = e->f; - pl *p = SA_NEW(v->sql->pa, pl); - p->c = c; - p->cmp = e->flag; - if (is_anti(e)) - p->cmp = swap_compare(p->cmp); - p->l = p->r = NULL; - if (r && r->type == e_atom && r->l) - p->l = atom_dup(v->sql->pa, r->l); - if (r2 && r2->type == e_atom && r2->l) - p->r = atom_dup(v->sql->pa, r2->l); - v->sql->session->tr->predicates = Append(v->sql->pa, v->sql->session->tr->predicates, p); - *(int*)v->data = 1; - } else { - needall = 1; - } - } - } - } - } - /* project with basetable */ - if (is_simple_project(rel->op) || needall /* ie handle select like a project, ie all columns of the basetable */) { - sql_rel *bt = rel->l; - if (bt && is_basetable(bt->op)) { - sql_table *t = bt->l; - /* add predicates */ - if (!t || !bt->exps) - return rel; - for (node *n = bt->exps->h; n; n = n->next) { - sql_exp *e = n->data; - if (!is_intern(e)) { - pl *p = SA_NEW(v->sql->pa, pl); - p->c = find_sql_column(t, e->r); - p->cmp = 0; - p->l = p->r = NULL; - v->sql->session->tr->predicates = Append(v->sql->pa, v->sql->session->tr->predicates, p); + for (node *n = parent->exps->h; n && !needall; n = n->next) { + sql_exp *e = n->data, *r = e->r, *r2 = e->f; + sql_column *c = NULL; + + if (!is_compare(e->type) || !is_theta_exp(e->flag) || r->type != e_atom || !r->l || (r2 && (r2->type != e_atom || !r2->l)) || is_symmetric(e) || !(c = exp_find_column(rel, e->l))) { + needall = true; + } else { + pl *p = SA_ZNEW(v->sql->pa, pl); + p->c = c; + p->cmp = e->flag; + p->anti = is_anti(e); + p->semantics = is_semantics(e); + p->r = atom_dup(v->sql->pa, r->l); + if (r2) + p->f = atom_dup(v->sql->pa, r2->l); + v->sql->session->tr->predicates = add_predicate(v->sql->pa, v->sql->session->tr->predicates, p); *(int*)v->data = 1; } } } - } - /* group by with basetable */ - if (is_groupby(rel->op)) { - sql_rel *bt = rel->l; - /* for now same as project above */ - if (bt && is_basetable(bt->op)) { - sql_table *t = bt->l; - /* add predicates */ - if (!t || !bt->exps) + + if (!is_select(parent->op) || needall) { + /* any other case, add all predicates */ + sql_table *t = rel->l; + + if (!t || !rel->exps) return rel; - for (node *n = bt->exps->h; n; n = n->next) { + for (node *n = rel->exps->h; n; n = n->next) { sql_exp *e = n->data; if (!is_intern(e)) { - pl *p = SA_NEW(v->sql->pa, pl); + pl *p = SA_ZNEW(v->sql->pa, pl); p->c = find_sql_column(t, e->r); - p->cmp = 0; - p->l = p->r = NULL; - v->sql->session->tr->predicates = Append(v->sql->pa, v->sql->session->tr->predicates, p); + assert(p->c); + v->sql->session->tr->predicates = add_predicate(v->sql->pa, v->sql->session->tr->predicates, p); *(int*)v->data = 1; } } diff --git a/sql/backends/monet5/rel_predicates.h b/sql/backends/monet5/rel_predicates.h --- a/sql/backends/monet5/rel_predicates.h +++ b/sql/backends/monet5/rel_predicates.h @@ -9,10 +9,20 @@ #ifndef _REL_PREDICATES_H_ #define _REL_PREDICATES_H_ -#include "rel_semantic.h" -#include "sql_statement.h" +#include "rel_rel.h" +#include "rel_exp.h" #include "mal_backend.h" +typedef struct pl { + sql_column *c; + comp_type cmp; + atom *r; /* if r is NULL then a full match is required */ + atom *f; /* make it match range expressions */ + uint8_t + anti:1, + semantics:1; +} pl; + extern void rel_predicates(backend *be, sql_rel *rel); #endif /*_REL_PREDICATES_H_*/ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list