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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list