Changeset: b9947c7c6800 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b9947c7c6800
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/include/sql_catalog.h
        sql/rel.txt
        sql/server/rel_dump.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_optimize_others.c
        sql/server/rel_optimize_proj.c
        sql/server/rel_optimize_sel.c
        sql/server/rel_planner.c
        sql/server/rel_propagate.c
        sql/server/rel_rel.c
        sql/server/rel_rewriter.c
        sql/server/rel_select.c
        sql/server/rel_statistics.c
        sql/server/rel_unnest.c
        sql/server/sql_partition.c
Branch: reducedstack
Log Message:

removed cmp_or


diffs (truncated from 1553 to 300 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
@@ -692,113 +692,6 @@ exp_count_no_nil_arg(sql_exp *e, stmt *e
 }
 
 static stmt *
-exp_bin_or(backend *be, sql_exp *e, stmt *left, stmt *right, stmt *grp, stmt 
*ext, stmt *cnt, stmt *sel, int depth, bool reduce, int push)
-{
-       sql_subtype *bt = sql_bind_localtype("bit");
-       list *l = e->l;
-       node *n;
-       stmt *sel1 = NULL, *sel2 = NULL, *s = NULL;
-       int anti = is_anti(e);
-
-       sel1 = sel;
-       sel2 = sel;
-       for (n = l->h; n; n = n->next) {
-               sql_exp *c = n->data;
-               stmt *sin = (sel1 && sel1->nrcols)?sel1:NULL;
-
-               /* propagate the anti flag */
-               if (anti)
-                       set_anti(c);
-               s = exp_bin(be, c, left, right, grp, ext, cnt, reduce?sin:NULL, 
depth, reduce, push);
-               if (!s)
-                       return s;
-
-               if (!reduce && sin) {
-                       sql_subfunc *f = sql_bind_func(be->mvc, "sys", 
anti?"or":"and", bt, bt, F_FUNC, true, true);
-                       assert(f);
-                       s = stmt_binop(be, sin, s, NULL, f);
-               } else if (!sin && sel1 && sel1->nrcols == 0 && s->nrcols == 0) 
{
-                       sql_subfunc *f = sql_bind_func(be->mvc, "sys", 
anti?"or":"and", bt, bt, F_FUNC, true, true);
-                       assert(f);
-                       s = stmt_binop(be, sel1, s, sin, f);
-               } else if (sel1 && (sel1->nrcols == 0 || s->nrcols == 0)) {
-                       stmt *predicate = bin_find_smallest_column(be, left);
-
-                       predicate = stmt_const(be, predicate, stmt_bool(be, 1));
-                       if (s->nrcols == 0)
-                               s = stmt_uselect(be, predicate, s, cmp_equal, 
sel1, anti, is_semantics(c));
-                       else
-                               s = stmt_uselect(be, predicate, sel1, 
cmp_equal, s, anti, is_semantics(c));
-               }
-               sel1 = s;
-       }
-       l = e->r;
-       for (n = l->h; n; n = n->next) {
-               sql_exp *c = n->data;
-               stmt *sin = (sel2 && sel2->nrcols)?sel2:NULL;
-
-               /* propagate the anti flag */
-               if (anti)
-                       set_anti(c);
-               s = exp_bin(be, c, left, right, grp, ext, cnt, reduce?sin:NULL, 
depth, reduce, push);
-               if (!s)
-                       return s;
-
-               if (!reduce && sin) {
-                       sql_subfunc *f = sql_bind_func(be->mvc, "sys", 
anti?"or":"and", bt, bt, F_FUNC, true, true);
-                       assert(f);
-                       s = stmt_binop(be, sin, s, NULL, f);
-               } else if (!sin && sel2 && sel2->nrcols == 0 && s->nrcols == 0) 
{
-                       sql_subfunc *f = sql_bind_func(be->mvc, "sys", 
anti?"or":"and", bt, bt, F_FUNC, true, true);
-                       assert(f);
-                       s = stmt_binop(be, sel2, s, sin, f);
-               } else if (sel2 && (sel2->nrcols == 0 || s->nrcols == 0)) {
-                       stmt *predicate = bin_find_smallest_column(be, left);
-
-                       predicate = stmt_const(be, predicate, stmt_bool(be, 1));
-                       if (s->nrcols == 0)
-                               s = stmt_uselect(be, predicate, s, cmp_equal, 
sel2, anti, 0);
-                       else
-                               s = stmt_uselect(be, predicate, sel2, 
cmp_equal, s, anti, 0);
-               }
-               sel2 = s;
-       }
-       if (sel1->nrcols == 0 && sel2->nrcols == 0) {
-               sql_subfunc *f = sql_bind_func(be->mvc, "sys", anti?"and":"or", 
bt, bt, F_FUNC, true, true);
-               assert(f);
-               return stmt_binop(be, sel1, sel2, NULL, f);
-       }
-       if (sel1->nrcols == 0) {
-               stmt *predicate = bin_find_smallest_column(be, left);
-
-               if (!reduce) {
-                       predicate = stmt_const(be, predicate, sel1);
-               } else {
-                       predicate = stmt_const(be, predicate, stmt_bool(be, 1));
-                       sel1 = stmt_uselect(be, predicate, sel1, cmp_equal, 
NULL, 0/*anti*/, 0);
-               }
-       }
-       if (sel2->nrcols == 0) {
-               stmt *predicate = bin_find_smallest_column(be, left);
-
-               if (!reduce) {
-                       predicate = stmt_const(be, predicate, sel2);
-               } else {
-                       predicate = stmt_const(be, predicate, stmt_bool(be, 1));
-                       sel2 = stmt_uselect(be, predicate, sel2, cmp_equal, 
NULL, 0/*anti*/, 0);
-               }
-       }
-       if (!reduce) {
-                       sql_subfunc *f = sql_bind_func(be->mvc, "sys", 
anti?"and":"or", bt, bt, F_FUNC, true, true);
-                       assert(f);
-                       return stmt_binop(be, sel1, sel2, NULL, f);
-       }
-       if (anti)
-               return stmt_project(be, stmt_tinter(be, sel1, sel2, false), 
sel1);
-       return stmt_tunion(be, sel1, sel2);
-}
-
-static stmt *
 exp_bin_conjunctive(backend *be, sql_exp *e, stmt *left, stmt *right, stmt 
*grp, stmt *ext, stmt *cnt, stmt *sel, int depth, bool reduce, int push)
 {
        sql_subtype *bt = sql_bind_localtype("bit");
@@ -2055,11 +1948,6 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        return exp_bin_conjunctive(be, e, left, right, grp, 
ext, cnt, sel, depth, reduce, push);
                if (e->flag == cmp_dis)
                        return exp_bin_disjunctive(be, e, left, right, grp, 
ext, cnt, sel, depth, reduce, push);
-               if (e->flag == cmp_or && (!right || right->nrcols == 1))
-                       return exp_bin_or(be, e, left, right, grp, ext, cnt, 
sel, depth, reduce, push);
-               if (e->flag == cmp_or && right) {  /* join */
-                       assert(0);
-               }
 
                /* mark use of join indices */
                if (right && find_prop(e->p, PROP_JOINIDX) != NULL)
@@ -2481,7 +2369,7 @@ exp2bin_args(backend *be, sql_exp *e, li
        case e_psm:
                return args;
        case e_cmp:
-               if (e->flag == cmp_or || e->flag == cmp_filter) {
+               if (e->flag == cmp_filter) {
                        args = exps2bin_args(be, e->l, args);
                        args = exps2bin_args(be, e->r, args);
                } else if (e->flag == cmp_in || e->flag == cmp_notin) {
@@ -3369,7 +3257,7 @@ get_equi_joins_first(mvc *sql, list *exp
        for (node *n = exps->h; n; n = n->next) {
                sql_exp *e = n->data;
 
-               assert(e->type == e_cmp && e->flag != cmp_in && e->flag != 
cmp_notin && e->flag != cmp_or);
+               assert(e->type == e_cmp && e->flag != cmp_in && e->flag != 
cmp_notin);
                if (is_equi_exp_(e))
                        list_append(new_exps, e);
                else
@@ -3860,7 +3748,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
                                stmt *s = NULL;
 
                                /* only handle simple joins here */
-                               if ((exp_has_func(e) && e->flag != cmp_filter) 
|| e->flag == cmp_or || (e->f && is_anti(e))) {
+                               if ((exp_has_func(e) && e->flag != cmp_filter) 
|| (e->f && is_anti(e))) {
                                        if (!join && !list_length(lje)) {
                                                stmt *l = 
bin_find_smallest_column(be, left);
                                                stmt *r = 
bin_find_smallest_column(be, right);
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -164,7 +164,7 @@ typedef enum comp_type {
        cmp_notequal = 5,
 
        cmp_filter = 6,
-       cmp_or = 7,
+
        cmp_in = 8,                     /* in value list */
        cmp_notin = 9,                  /* not in value list */
        cmp_con = 10,                   /* conjunctive (and) list */
@@ -180,7 +180,7 @@ typedef enum comp_type {
 #define is_theta_exp(e) ((e) == cmp_gt || (e) == cmp_gte || (e) == cmp_lte ||\
                                                 (e) == cmp_lt || (e) == 
cmp_equal || (e) == cmp_notequal)
 
-#define is_complex_exp(et) ((et) == cmp_or || (et) == cmp_in || (et) == 
cmp_notin || (et) == cmp_filter || (et) == cmp_con || (et) == cmp_dis)
+#define is_complex_exp(et) ((et) == cmp_in || (et) == cmp_notin || (et) == 
cmp_filter || (et) == cmp_con || (et) == cmp_dis)
 
 #define is_equality_or_inequality_exp(et) ((et) == cmp_equal || (et) == 
cmp_notequal || (et) == cmp_in || (et) == cmp_notin)
 
diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -141,7 +141,7 @@ e_cmp
                        cmp_notequal = 5,
 
                        cmp_filter = 6,         filters                 ->l/r 
are both lists
-                       cmp_or = 7,                     or handling             
->l/r are both lists
+
                        cmp_in = 8,                     in list handling        
->r is a list of values
                        cmp_notin = 9,          not in list handling    ->r is 
a list of values
 
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -65,7 +65,6 @@ cmp_print(mvc *sql, stream *fout, int cm
        case cmp_notequal:      r = "!="; break;
 
        case cmp_filter:        r = "filter"; break;
-       case cmp_or:            r = "or"; break;
        case cmp_in:            r = "in"; break;
        case cmp_notin:         r = "notin"; break;
 
@@ -323,12 +322,6 @@ exp_print(mvc *sql, stream *fout, sql_ex
                        else
                                mnstr_printf(fout, ".OR");
                        exps_print(sql, fout, e->l, depth, refs, 0, 1, 
decorate, 0);
-               } else if (e->flag == cmp_or) {
-                       exps_print(sql, fout, e->l, depth, refs, 0, 1, 
decorate, 0);
-                       if (is_anti(e))
-                               mnstr_printf(fout, " !");
-                       cmp_print(sql, fout, e->flag);
-                       exps_print(sql, fout, e->r, depth, refs, 0, 1, 
decorate, 0);
                } else if (e->flag == cmp_filter) {
                        sql_subfunc *f = e->f;
 
@@ -1347,7 +1340,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        case 'o':
                                if (strncmp(r+*pos, "or",  strlen("or")) == 0) {
                                        (*pos)+= (int) strlen("or");
-                                       ctype = cmp_or;
+                                       ctype = cmp_dis;
                                }
                                break;
                        case '!':
@@ -1472,8 +1465,12 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                                return sql_error(sql, -1, 
SQLSTATE(42000) "Filter: no privilege to call filter function '%s'.'%s'\n", 
sname, fname);
                                        exp = exp_filter(sql->sa, lexps, rexps, 
f, anti);
                                } break;
-                               case cmp_or:
-                                       exp = exp_or(sql->sa, lexps, rexps, 
anti);
+                               case cmp_dis:
+                                       exp = exp_disjunctive2(sql->sa,
+                                                       
exp_conjunctive(sql->sa, lexps),
+                                                       
exp_conjunctive(sql->sa, rexps));
+                                       if (anti)
+                                               set_anti(exp);
                                        break;
                                default:
                                        return sql_error(sql, -1, 
SQLSTATE(42000) "Type: missing comparison type\n");
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -217,24 +217,6 @@ exp_filter(allocator *sa, list *l, list 
 }
 
 sql_exp *
-exp_or(allocator *sa, list *l, list *r, int anti)
-{
-       sql_exp *e = exp_create(sa, e_cmp);
-
-       if (e == NULL)
-               return NULL;
-       e->card = MAX(exps_card(l),exps_card(r));
-       e->l = l;
-       e->r = r;
-       e->flag = cmp_or;
-       if (anti)
-               set_anti(e);
-       if (!have_nil(l) && !have_nil(r))
-               set_has_no_nil(e);
-       return e;
-}
-
-sql_exp *
 exp_in(allocator *sa, sql_exp *l, list *r, int cmptype)
 {
        sql_exp *e = exp_create(sa, e_cmp);
@@ -1344,10 +1326,7 @@ exp_match_col_exps( sql_exp *e, list *l)
                sql_exp *re = n->data;
                sql_exp *re_r = re->r;
 
-               if (re->type == e_cmp && re->flag == cmp_or)
-                       return exp_match_col_exps(e, re->l) &&
-                              exp_match_col_exps(e, re->r);
-
+               /* TODO handle nested conjunctive/disjunctive */
                if (re->type != e_cmp || !re_r || re_r->card != 1 || 
!exp_match_exp(e, re->l))
                        return 0;
        }
@@ -1377,26 +1356,6 @@ exps_match_col_exps( sql_exp *e1, sql_ex
        if ((e1->flag == cmp_in || e1->flag == cmp_notin) &&
            (e2->flag == cmp_in || e2->flag == cmp_notin))
                return exp_match_exp(e1->l, e2->l);
-
-       if (!is_complex_exp(e1->flag) && e1_r && e1_r->card == CARD_ATOM &&
-           e2->flag == cmp_or)
-               return exp_match_col_exps(e1->l, e2->l) &&
-                      exp_match_col_exps(e1->l, e2->r);
-
-       if (e1->flag == cmp_or &&
-           !is_complex_exp(e2->flag) && e2_r && e2_r->card == CARD_ATOM)
-               return exp_match_col_exps(e2->l, e1->l) &&
-                      exp_match_col_exps(e2->l, e1->r);
-
-       if (e1->flag == cmp_or && e2->flag == cmp_or) {
-               list *l = e1->l, *r = e1->r;
-               sql_exp *el = l->h->data;
-               sql_exp *er = r->h->data;
-
-               return list_length(l) == 1 && list_length(r) == 1 &&
-                      exps_match_col_exps(el, e2) &&
-                      exps_match_col_exps(er, e2);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to