Changeset: a75afbec2a01 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a75afbec2a01 Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_gencode.c sql/include/sql_catalog.h sql/server/rel_dump.c sql/server/rel_select.c Branch: Oct2014 Log Message:
use batcalc.between were possible diffs (133 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 @@ -690,7 +690,7 @@ exp_bin(mvc *sql, sql_exp *e, stmt *left s = stmt_binop(sql->sa, stmt_binop(sql->sa, l, r, lf), stmt_binop(sql->sa, l, r2, rf), a); - } else if (l->nrcols > 0 && r->nrcols > 0 && r2->nrcols > 0) { + } else if (((e->flag&3) != 3) /* both sides closed use between implementation */ && l->nrcols > 0 && r->nrcols > 0 && r2->nrcols > 0) { s = stmt_uselect(sql->sa, l, r, range2lcompare(e->flag), stmt_uselect(sql->sa, l, r2, range2rcompare(e->flag), sel)); } else { diff --git a/sql/backends/monet5/sql_gencode.c b/sql/backends/monet5/sql_gencode.c --- a/sql/backends/monet5/sql_gencode.c +++ b/sql/backends/monet5/sql_gencode.c @@ -1371,7 +1371,7 @@ static int return -1; if ((s->op2->nrcols > 0 || s->op3->nrcols) && (s->type == st_uselect2)) { - int k; + int k, symmetric = s->flag&CMP_SYMMETRIC; char *mod = calcRef; char *op1 = "<", *op2 = "<"; @@ -1385,17 +1385,28 @@ static int if (s->flag & 2) op2 = "<="; - if ((q = multiplex2(mb, mod, convertOperator(op1), l, r1, TYPE_bit)) == NULL) - return -1; + if (s->flag&1 && s->flag&2) { + if (symmetric) + p = newStmt1(mb, batcalcRef, "between_symmetric"); + else + p = newStmt1(mb, batcalcRef, "between"); + p = pushArgument(mb, p, l); + p = pushArgument(mb, p, r1); + p = pushArgument(mb, p, r2); + k = getDestVar(p); + } else { + if ((q = multiplex2(mb, mod, convertOperator(op1), l, r1, TYPE_bit)) == NULL) + return -1; - if ((r = multiplex2(mb, mod, convertOperator(op2), l, r2, TYPE_bit)) == NULL) - return -1; - p = newStmt1(mb, batcalcRef, "and"); - p = pushArgument(mb, p, getDestVar(q)); - p = pushArgument(mb, p, getDestVar(r)); - if (p == NULL) - return -1; - k = getDestVar(p); + if ((r = multiplex2(mb, mod, convertOperator(op2), l, r2, TYPE_bit)) == NULL) + return -1; + p = newStmt1(mb, batcalcRef, "and"); + p = pushArgument(mb, p, getDestVar(q)); + p = pushArgument(mb, p, getDestVar(r)); + if (p == NULL) + return -1; + k = getDestVar(p); + } q = newStmt1(mb, algebraRef, "subselect"); q = pushArgument(mb, q, k); 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 @@ -147,6 +147,9 @@ typedef enum comp_type { cmp_equal_nil = 14 /* special case equi join, with nil = nil */ } comp_type; +/* for ranges we keep the requirment for symmetric */ +#define CMP_SYMMETRIC 8 + #define is_theta_exp(e) ((e) == cmp_gt || (e) == cmp_gte || (e) == cmp_lte ||\ (e) == cmp_lt || (e) == cmp_equal || (e) == cmp_notequal) 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 @@ -177,6 +177,8 @@ exp_print(mvc *sql, stream *fout, sql_ex mnstr_printf(fout, " ! "); cmp_print(sql, fout, range2rcompare(e->flag) ); exp_print(sql, fout, e->f, depth+1, 0, 0); + if (e->flag & CMP_SYMMETRIC) + mnstr_printf(fout, " SYM "); } else { exp_print(sql, fout, e->l, depth+1, 0, 0); if (is_anti(e)) diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -3200,6 +3200,7 @@ rel_logical_exp(mvc *sql, sql_rel *rel, sql_exp *le = rel_value_exp(sql, &rel, lo, f, ek); sql_exp *re1 = rel_value_exp(sql, &rel, ro1, f, ek); sql_exp *re2 = rel_value_exp(sql, &rel, ro2, f, ek); + int flag = 0; assert(sc->data.lval->h->next->type == type_int); if (!le || !re1 || !re2) @@ -3212,7 +3213,8 @@ rel_logical_exp(mvc *sql, sql_rel *rel, if (!re1 || !re2) return NULL; - if (symmetric) { + /* for between 3 columns we use the between operator */ + if (symmetric && re1->card == CARD_ATOM && re2->card == CARD_ATOM) { sql_exp *tmp = NULL; sql_subfunc *min = sql_bind_func(sql->sa, sql->session->schema, "sql_min", exp_subtype(re1), exp_subtype(re2), F_FUNC); sql_subfunc *max = sql_bind_func(sql->sa, sql->session->schema, "sql_max", exp_subtype(re1), exp_subtype(re2), F_FUNC); @@ -3223,8 +3225,11 @@ rel_logical_exp(mvc *sql, sql_rel *rel, tmp = exp_binop(sql->sa, re1, re2, min); re2 = exp_binop(sql->sa, re1, re2, max); re1 = tmp; + symmetric = 0; } + flag = (symmetric)?CMP_SYMMETRIC:0; + if (le->card == CARD_ATOM) { sql_exp *e1, *e2; if (sc->token == SQL_NOT_BETWEEN) { @@ -3244,9 +3249,9 @@ rel_logical_exp(mvc *sql, sql_rel *rel, e2 = exp_atom_bool(sql->sa, 1); rel = rel_select(sql->sa, rel, exp_compare(sql->sa, e1, e2, cmp_equal)); } else if (sc->token == SQL_NOT_BETWEEN) { - rel = rel_compare_exp_(sql, rel, le, re1, re2, 3, 1); + rel = rel_compare_exp_(sql, rel, le, re1, re2, 3|flag, 1); } else { - rel = rel_compare_exp_(sql, rel, le, re1, re2, 3, 0); + rel = rel_compare_exp_(sql, rel, le, re1, re2, 3|flag, 0); } return rel; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list