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

Reply via email to