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]