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

Reply via email to